// OpenFile is the generalized open call; most users will use Open // or Create instead. It opens the named file with specified flag // (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, // methods on the returned File can be used for I/O. // If there is an error, it will be of type *PathError. func OpenFile(name string, flag int, perm FileMode) (file *File, err error) { if DisableWritesForAppEngine && flag&(O_WRONLY|O_RDWR|O_CREATE|O_EXCL) != 0 { return nil, &PathError{"open", name, errDisabledWrites} } var ( fd int e error create bool excl bool trunc bool append bool ) if flag&O_CREATE == O_CREATE { flag = flag & ^O_CREATE create = true } if flag&O_EXCL == O_EXCL { excl = true } if flag&O_TRUNC == O_TRUNC { trunc = true } // O_APPEND is emulated on Plan 9 if flag&O_APPEND == O_APPEND { flag = flag &^ O_APPEND append = true } syscall.ForkLock.RLock() if (create && trunc) || excl { fd, e = syscall.Create(name, flag, syscallMode(perm)) } else { fd, e = syscall.Open(name, flag) if e != nil && create { var e1 error fd, e1 = syscall.Create(name, flag, syscallMode(perm)) if e1 == nil { e = nil } } } syscall.ForkLock.RUnlock() if e != nil { return nil, &PathError{"open", name, e} } if append { if _, e = syscall.Seek(fd, 0, SEEK_END); e != nil { return nil, &PathError{"seek", name, e} } } return NewFile(uintptr(fd), name), nil }
// OpenFile is the generalized open call; most users will use Open // or Create instead. It opens the named file with specified flag // (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, // methods on the returned File can be used for I/O. // It returns the File and an error, if any. func OpenFile(name string, flag int, perm uint32) (file *File, err error) { var ( fd int e syscall.Error create bool excl bool trunc bool append bool ) if flag&O_CREATE == O_CREATE { flag = flag & ^O_CREATE create = true } if flag&O_EXCL == O_EXCL { excl = true } if flag&O_TRUNC == O_TRUNC { trunc = true } // O_APPEND is emulated on Plan 9 if flag&O_APPEND == O_APPEND { flag = flag &^ O_APPEND append = true } syscall.ForkLock.RLock() if (create && trunc) || excl { fd, e = syscall.Create(name, flag, perm) } else { fd, e = syscall.Open(name, flag) if e != nil && create { var e1 syscall.Error fd, e1 = syscall.Create(name, flag, perm) if e1 == nil { e = nil } } } syscall.ForkLock.RUnlock() if e != nil { return nil, &PathError{"open", name, e} } if append { if _, e = syscall.Seek(fd, 0, SEEK_END); e != nil { return nil, &PathError{"seek", name, e} } } return NewFile(fd, name), nil }
// OpenFile is the generalized open call; most users will use Open // or Create instead. It opens the named file with specified flag // (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, // methods on the returned File can be used for I/O. // If there is an error, it will be of type *PathError. func OpenFile(name string, flag int, perm FileMode) (*File, error) { var ( fd int e error create bool excl bool trunc bool append bool ) if flag&O_CREATE == O_CREATE { flag = flag & ^O_CREATE create = true } if flag&O_EXCL == O_EXCL { excl = true } if flag&O_TRUNC == O_TRUNC { trunc = true } // O_APPEND is emulated on Plan 9 if flag&O_APPEND == O_APPEND { flag = flag &^ O_APPEND append = true } if (create && trunc) || excl { fd, e = syscall.Create(name, flag, syscallMode(perm)) } else { fd, e = syscall.Open(name, flag) if e != nil && create { var e1 error fd, e1 = syscall.Create(name, flag, syscallMode(perm)) if e1 == nil { e = nil } } } if e != nil { return nil, &PathError{"open", name, e} } if append { if _, e = syscall.Seek(fd, 0, io.SeekEnd); e != nil { return nil, &PathError{"seek", name, e} } } return NewFile(uintptr(fd), name), nil }
// Post a file's descriptor to /srv/name -- Plan 9 specific func PostFD(name string, fd int) (srv *os.File, err error) { fname := "/srv/" + name // Plan 9 flag OWRITE|ORCLOSE|OCEXEC srvfd, err := syscall.Create(fname, 0x01|0x40|0x20, 0600) if err != nil { return } srv = os.NewFile(uintptr(srvfd), fname) _, err = fmt.Fprintf(srv, "%d", fd) return }
// OpenFile is the generalized open call; most users will use Open // or Create instead. It opens the named file with specified flag // (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, // methods on the returned File can be used for I/O. // It returns the File and an Error, if any. func OpenFile(name string, flag int, perm uint32) (file *File, err Error) { var fd int var e syscall.Error syscall.ForkLock.RLock() if flag&O_CREATE == O_CREATE { fd, e = syscall.Create(name, flag & ^O_CREATE, perm) } else { fd, e = syscall.Open(name, flag) } syscall.ForkLock.RUnlock() if e != nil { return nil, &PathError{"open", name, e} } return NewFile(fd, name), nil }