SYS-FILE2CHAN(2)SYS-FILE2CHAN(2)NAME
file2chan - create file connected to Limbo channel
SYNOPSIS
include "sys.m";
sys := load Sys Sys->PATH;
Rread: type chan of (array of byte, string);
Rwrite: type chan of (int, string);
FileIO: adt
{
read: chan of (int, int, int, Rread);
write: chan of (int, array of byte, int, Rwrite);
};
file2chan: fn(dir, file: string): ref FileIO;
DESCRIPTION
File2chan presents an interface for binding Limbo channels to files in
the file name space. A server program calls file2chan to create a file
in a directory dir, which must be a directory on which device `#s' has
been bound (see srv(3)). A client program can open the file for read‐
ing or writing (see sys-open(2) and sys-read(2)) to communicate with
the server.
File2chan returns a FileIO type holding two channels used to deliver
tuples representing the contents of the Tread and Twrite 9P messages
received by the system on the server's behalf; see intro(5).
When the client invokes the read system call on the file, the server
receives a tuple, say (offset, count, fid, rc), on the read channel.
The request asks for count bytes of data, starting at offset bytes from
the beginning of the file associated with fid. The server sends its
reply to the client by transmitting a tuple, say (data, error), that
contains the data for the read, on the channel rc received as part of
the read tuple. If the request was successful, the error string should
be nil. If an error occurred, error should be a diagnostic string, and
the data array should be nil. The client blocks in the read system
call until the server sends its reply. The client receives only count
bytes even if data is larger.
When the client does a write system call on the file, the server
receives a tuple, (offset, data, fid, wc), on the write channel. A
(count, error) response is sent back on the wc channel received in the
write tuple: count gives the number of bytes written (zero if an error
occurs), and error is an empty or nil string or an explanation of the
problem.
The fid received by the server can be used to manage the multiplexing
of multiple active clients sharing a single file; see intro(5) for
details. Each distinct open of the file will yield a distinct fid,
unique to that open, which will appear in the read and write messages
corresponding to reads and writes on that open instance of the file.
When the client closes the file, the server will be sent a read message
with a nil rc, then a write message with a nil wc. A server typically
ignores the former and uses the latter as a signal to stop processing
for the given client (more precisely, the given fid). Note that the
fid can later be re-used by another client.
SOURCE
/emu/port/devsrv.c
/os/port/devsrv.c
SEE ALSOsh-file2chan(1), sys-intro(2), sys-open(2), sys-read(2), sys-bind(2),
intro(5)BUGS
Read and write system calls for the file will not return until the
server sends its reply on the appropriate channel, so the process doing
the read or write cannot be the one serving.
SYS-FILE2CHAN(2)