OPEN(3)                                                   OPEN(3)

          open, create, close - open a file for reading or writing,
          create file

          #include <u.h>
          #include <libc.h>

          int open(char *file, int omode)

          int create(char *file, int omode, ulong perm)

          int close(int fd)

          Open opens the file for I/O and returns an associated file
          descriptor.  Omode is one of OREAD, OWRITE, ORDWR, or OEXEC,
          asking for permission to read, write, read and write, or
          execute, respectively.  In addition, there are three values
          that can be ORed with the omode: OTRUNC says to truncate the
          file to zero length before opening it; OCEXEC says to close
          the file when an exec(3) or execl system call is made;
          ORCLOSE says to remove the file when it is closed (by every-
          one who has a copy of the file descriptor); and OAPPEND says
          to open the file in append-only mode, so that writes are
          always appended to the end of the file.  Open fails if the
          file does not exist or the user does not have permission to
          open it for the requested purpose (see stat(3) for a
          description of permissions).  The user must have write per-
          mission on the file if the OTRUNC bit is set.  For the open
          system call (unlike the implicit open in exec(3)), OEXEC is
          actually identical to OREAD.

          Create creates a new file or prepares to rewrite an existing
          file, opens it according to omode (as described for open),
          and returns an associated file descriptor.  If the file is
          new, the owner is set to the userid of the creating process
          group; the group to that of the containing directory; the
          permissions to perm ANDed with the permissions of the con-
          taining directory.  If the file already exists, it is trun-
          cated to 0 length, and the permissions, owner, and group
          remain unchanged.  The created file is a directory if the
          DMDIR bit is set in perm, an exclusive-use file if the
          DMEXCL bit is set, and an append-only file if the DMAPPEND
          bit is set.  Exclusive-use files may be open for I/O by only
          one client at a time, but the file descriptor may become
          invalid if no I/O is done for an extended period; see

          Create fails if the path up to the last element of file

     OPEN(3)                                                   OPEN(3)

          cannot be evaluated, if the user doesn't have write permis-
          sion in the final directory, if the file already exists and
          does not permit the access defined by omode, of if there
          there are no free file descriptors.  In the last case, the
          file may be created even when an error is returned.

          Since create may succeed even if the file exists, a special
          mechanism is necessary for those applications that require
          an atomic create operation.  If the OEXCL (0x1000) bit is
          set in the mode for a create, the call succeeds only if the
          file does not already exist; see open(9p) for details.

          Close closes the file associated with a file descriptor.
          Provided the file descriptor is a valid open descriptor,
          close is guaranteed to close it; there will be no error.
          Files are closed automatically upon termination of a pro-
          cess; close allows the file descriptor to be reused.


          intro(3), stat(3)

          These functions set errstr.

          Not all functionality is supported on all systems.

          The DMAPPEND bit is not supported on any systems.

          The implementation of ORCLOSE is to unlink the file after
          opening it, causing problems in programs that try to access
          the file by name before it is closed.

          To avoid name conflicts with the underlying system, open and
          create are preprocessor macros defined as p9open and
          p9create; see intro(3).