open, create - prepare a fid for I/O on an existing or new file
Topen tag fid mode
Ropen tag fid qid
Tcreate tag fid name perm mode
Rcreate tag fid qid
The open request asks the file server to check permissions and prepare a fid for I/O with
subsequent read and write messages. The mode field determines the type of I/O: 0, 1, 2,
and 3 mean read access, write access, read and write access, and execute access, to be
checked against the permissions for the file. In addition, if mode has the OTRUNC (0x10)
bit set, the file is to be truncated, which requires write permission (if the file is
append-only, and permission is granted, the open succeeds but the file will not be trun-
cated); if the mode has the ORCLOSE (0x40) bit set, the file is to be removed when the fid
is clunked, which requires permission to remove the file from its directory. If other
bits are set in mode they will be ignored. It is illegal to write a directory, truncate
it, or attempt to remove it on close. If the file is marked for exclusive use (see
stat(5)), only one client can have the file open at any time. That is, after such a file
has been opened, no other open will succeed until fid has been clunked. All these permis-
sions are checked at the time of the open request; subsequent changes to the permissions
of files do not affect the ability to read, write, or remove an open file.
The create request asks the file server to create a new file with the name supplied, in
the directory (dir) represented by fid, and requires write permission in the directory.
The owner of the file is the implied user id of the request, the group of the file is the
same as dir, and the permissions are the value of
(perm&(~0777|0111)) | (dir.perm&perm&0666)
if a regular file is being created and
(perm&~0777) | (dir.perm&perm&0777)
if a directory is being created. This means, for example, that if the create allows read
permission to others, but the containing directory does not, then the created file will
not allow others to read the file.
Finally, the newly created file is opened according to mode, and fid will represent the
newly opened file. Mode is not checked against the permissions in perm. The qid for the
new file is returned with the create reply message.
Directories are created by setting the CHDIR bit (0x80000000) in the perm.
The names . and .. are special; it is illegal to create files with these names.
It is an error for either of these messages if the fid is already the product of a suc-
cessful open or create message.
An attempt to create a file in a directory where the given name already exists will be
rejected; in this case, the create system call (see open(2)) uses open with truncation.
The algorithm used by create is: first walk to the directory to contain the file. If that
fails, return an error. Next walk to the specified file. If the walk succeeds, send a
request to open and truncate the file and return the result, successful or not. If the
walk fails, send a create message. If that fails, it may be because the file was created
by another process after the previous walk failed, so (once) try the walk and open again.
For the behavior of create on a union directory, see bind(2).
Open and create both generate open messages; only create generates a create message.