Plan 9 from Bell Labs’s /usr/web/sources/contrib/nemo/octopus/man/1/copyserver

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


.TH COPYSERVER

.SH NAME
copyserver \- file copying between a source and a destination

.SH SYNOPSIS
.B copyserver
[
.B \-d
]
.I mntdir

.SH DESCRIPTION
.I copyserver
starts a 
.IR styxservers (2) 
server and mounts it at
.I mntdir
(replacing the old
binding, if any).
Once done, the server is ready to
accept copy requests. Unmounting
.I mntdir
will cleanly shutdown the server.
.PP
Copy requests are written into the 
(virtual) control file of the server, 
named
.I ctl
, using the following format:
.PP
.EX
     copy
         [srcmntopt] srcfname srcoff
         [dstmntopt] dstfname dstoff
         nofbytes iounit delay ctlfile
.EE
.PP
If the source and destination files are 
successfully opened, the copy commences. 
The write operation on the server control 
file blocks until the copy terminates,
or it is killed (discussed in the sequel), 
or an r/w error occurs.
Also, a copy is aborted if the process 
that writes the request to
the server control file is killed
(this is detected by the server
via the receipt of a 
.IR flush (5)
message for the write operation).
.PP
Here is a brief explanation of the
copy request arguments:
.PP
.I srcfname 
and
.I dstfname
specify the source and destination file name,
relative to the root of the source and destination
file system, respectively. 
.I srcfname 
must point to an existing file.
If
.I dstfname
points to an existing file, this will be
truncated and overwritten, else a new file
will be created.
.PP
.I srcoff
and
.I dstoff
specify the offset from which to start reading the 
source and writing the destination file, respectively. 
These values must be equal or greater than zero.
The file position is adjusted based on the rules
for 
.IR sys-seek (2)
(using 
.B Sys->SEEKSTART
).
.PP
.I nofbytes
specifies the number of bytes to copy from 
the source to the destination file. The copy 
operation will terminate in case the 
end of the source file is reached earlier. 
If 
.I nofbytes
is zero, the copy will not terminate unless
the end of the source file is reached. If the 
source points to the reading end of an endless 
stream, the copy will run "for ever", until 
it is aborted or killed.  
.PP
.I iounit
specifies the size of the data buffer used to
read bytes from the source file and write them 
to the destination file.
.PP
.I delay
specifies the number of milliseconds to wait
between two successive r/w operations. Combined
with a small 
.I iounit
value (e.g. 1 byte), this makes it possible
to test the copy server in an interactive
fashion and using small files. 
If 
.I delay
is zero, the copy will be performed at 
full speed.
.PP
For both the source and destination,
an option, 
.I srcmntopt
and
.I dstmntopt
, respectively, can be used to specify whether
the corresponding file systems need to be
mounted, and how this should be achieved.
The mount option has the following format:
.IP
.B "(\-s[A] | \-o[A]) addr"
.PP
Option 
.B \-s 
is specifies a conventional mount via
.IR styx (2)
, and option
.B \-o 
specifies a mount via 
.IR ofs (4)
to a remote 
.IR oxport (4)
server. In both cases, the 
.B \-A
option is used to turn authentication off.
.I addr
specifies the address to be dialed.
If no mount option is used, the server
interprets the filename relative to its
local name space (no mount is done).
.PP
For each ongoing copy, the server
"creates" a (virtual) control file, 
using the
.I ctlfname
that was supplied in the request. 
The server "removes" the control file 
when the copy terminates (or is aborted or is killed).
.PP
Reading the copy control file returns the 
number of bytes copied so far as a string value. 
Writing the string value "kill" in the file 
kills the copy (the server will notify the 
blocked process that issued the copy request 
via an
.IR error (5)
message).

.PP


.SH EXAMPLE
To mount a copy server on /cpsrv with debugging output enabled:
.IP
.B "./copyserver \-d /cpsrv"
.PP
To (background) copy file 
.B /d1/f1 
exported by an oxport file server 
which does not require authentication
and listens on 
.B tcp!127.0.0.1!4242
, to file 
.B /d2/f2
in the file system of the copy server, 
using a r/w buffer of 512 bytes, 
with an artificial delay of 50 ms
between each r/w operation, and 
.B cp1
being the name of the copy control file:
.PP
.EX
     echo copy -oA tcp!127.0.0.1!4242 /d1/f1 0 
                                      /d2/f2 0
               0 512 50 cp1 > /cpsrv/ctl &
.EE
.PP
Or to (background) copy file 
.B /d1/f1 
exported by a styx file server 
which does not require authentication
and listens on 
.B tcp!127.0.0.1!4243
, to file 
.B /d2/f2
in the file system exported by
the same oxport server as above, 
using the same request settings:
.PP
.EX
     echo copy -sA tcp!127.0.0.1!4243 /d1/f1 0 
               -oA tcp!127.0.0.1!4242 /d2/f2 0
               0 512 50 cp1 > /cpsrv/ctl &
.EE
.PP
To check the progress of the copy:
.IP
.B "cat /cpsrv/cp1"
.PP
To abort the copy, one may kill the process 
that issued the request (and remains blocked 
waiting for the write operation to return). 
Alternatively, one may use the corresponding
control file to kill the copy (this will
also unblock the background process):
.IP
.B "echo kill > /cpsrv/cp1"
.PP
Finally, to unmount the copy server:
.IP
.B "unmount /cpsrv"
.PP
Note that the copy server will shutdown
when all processes have unmounted it
from their name space.

.SH SOURCE
.B /usr/octopus/varia/copyserver.b

.SH SEE ALSO
.IR styx (2)
,
.IR mount (2)
,
.IR ofs (4)
,
and
.IR oxport (4)
\.

.SH BUGS
There is no access control for the 
copy control files "created" by the
server. Any process can read and write 
every copy control file (e.g. kill 
any ongoing copy, if it so desires).
Also, the ownership and access rights
of the destination files created as
a side effect of a copy are not properly set.
.PP
There is a subtle race condition when
reading the copy control file, which 
may result in occasionally delivering 
a wrong value for the number of bytes 
that have been copied so far. 
The probability for this is (very) small.
.PP
For simplicity, dialing and mounting 
(and unmounting) file systems is currently 
done via shell commands (instead of a direct 
invocation of the corresponding primitives). 
This means that changes in the command syntax 
will "brake" the copyserver code. Also, 
the failure of a shell command is inferred 
indirectly, by checking whether any output
was written on standard error.
.PP
Killing/aborting a copy is asynchronous, 
i.e. it may be performed with a (small) delay, 
after having sent the corresponding reply 
message to the entity that triggered 
this action. 




Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.