CODA(1) CODA(1)
LOCAL
NAME
coda - Code distribution aid
SYNOPSIS
coda [ -c ] [ -ddir ] [ -rdir ] [ -hhost ] [ -pport# ] [ -ffile ] [
-uname ] [ -xpass ] [ -sy_or_n ] [ -yy_or_n ] [ -oy_or_n ] [ -n ]
[ -t ] [ -v # ] [ names... ]
DESCRIPTION
Coda is used to keep source distributions current across a set of
machines. It is not as flexible as rdist(1), but it requires less of
the client machines because they do not have to be running Unix or the
Berkeley networking programs. The other difference is that when using
rdist, the server ``pushes'' files out to the clients, while with coda
the clients ``pull'' files from the server as they need them. Coda
was designed to have a simple client that easily ports to a wide
variety of systems.
The most common way of using coda is to create a configuration file in
your home directory. On UNIX systems, the file is named $HOME/.codarc
while on VMS machines it is named SYS$LOGIN:CODA.DAT. On either
system, to use a different file, set the environment variable CODA to
the name of the file. This is useful to share a common a file among
project members. The config file identifies where the server host is,
your name (and password) on the server, and where the Codafile and
sources are to be found.
The config file is a set of lines that make name-value pairs. Lines
starting with a pound sign are ignored. The following is a sample
configuration file; the field names are explained below:
## Server host and port number
host papaya.bbn.com
port 1999
## Our name and password on the server host
user rsalz
pass doubtful
## Directory to start from, name of the file to read
dir /usr/cronus
file src/make_all/Codafile
##
#root /nfs/papaya/u1/cronusbuild/cronus
slow n
verbose 1
## Can client have newer files? Yes, while porting to it
younger y
In addition to using the config file, it is possible to specify the
parameters by using command line flags. Any values set by flags
override the values in the config file. The following tables matches
names in the config file to command line flags.
File Flag Meaning
- 1 - Formatted: December 13, 2025
CODA(1) CODA(1)
LOCAL
__________________________________________________
host -h Name of the server host
port -p Port to connect to; default is 1999
user -u Your login name on the server
pass -p Your password on the server; see below
dir -d Directory for server to change to
file -f File to read (if not Codafile) in the directory given above
-n No action, just report what would be changed
root -r Path to find files in; overrides what the Codafile declared
slow -s Do byte-for-byte comparisons
-t Trace the protocol
verbose -v How much information to show
younger -y Allow newer files to be on the client
owner -o Retain original ownership
If your password is not listed in the config file, or specified on the
command line, coda will ask you for it. If you do put your password
in the config file, make sure that nobody else can read the file!
Once the file has been read, the server will send over a list of files
and directories. Coda will parse this list, and update any files and
directories it has to.
For efficiency, coda normally just checks the sizes of the local and
master copy, and will only update the local copy if they are
different. If the modification dates are different, coda will get a
copy of the file and do a byte-for-byte comparison to see if the files
actually are different. If the ``-s'' flag is used, coda will ignore
the time check, and will get every file and compare it with the local
copy.
If you use the ``-n'' flag, coda will not do work, but will instead
just report what files and directories are out of date.
During a port, a client will often have files that have been modified
after they have been obtained from the server, but before the changes
have been integrated into the master sources. On systems where the
client's timestamp can be trusted (e.g., not on VMS because there is
no equivalent of the utime(2) call), the ``-y'' flag may be used to
specify that the client might have files that are younger, or more
recent, than those on the server. The default option, ``-yn'' will
cause coda to check if the files are different, and overwrite them, if
the timestamps are different in any way.
By default the person who runs coda will be the owner of the files.
To make the ownerships match those on the server, use the ``-oy''
flag. This is probably more correct in a production environment than
when porting.
If you use the ``-v'' flag, coda will give more verbose information
about what it is doing. For example, ``-v1'' will list all files and
- 2 - Formatted: December 13, 2025
CODA(1) CODA(1)
LOCAL
directories that have to be created. If you use the ``-v2'' flag,
coda will report when it has to change the ownership or permission on
files, such as when a file has the right time and size, but is owned
by the wrong person. Since it is normally not a big problem if the
wrong person owns a file, or if it has the wrong permissions, coda
does not complain if something cannot be fixed. You can use the
``-v3'' flag to see a message whenever the program cannot set the file
mode or ownership. If you use the ``-v4'' flag coda will report on
every file as it does the byte-for-byte comparison of slow mode. You
should probably always use either ``-v1'' or ``-v3.''
To trace all interactions with the server, use the ``-t'' flag; this
will provide output like the following:
prompt% coda -d/usr/rsalz -f coda/Codafile -h papaya -u rsalz -x ... -t misc
<<<ACK-Hello FIG.BBN.COM; how are you today?
>>>USER rsalz ...
<<<ACK-Logged in rsalz
>>>GOTO /usr/rsalz
<<<ACK-Done
>>>READ coda/Codafile
<<<ACK-Done
Doing misc...
>>>LIST misc
<<<DAT ITEM W=d N=cbin U=-2 G=121 M=511 S=512 T=609796129
<<<DAT ITEM W=f N=cbin/dcc U=-2 G=121 M=493 S=150 T=603474106
...
<<<ACK-Found 105 files
Found 105 files
mkdir cbin
Update cbin/dcc
...
>>>QUIT
prompt%
(Lines without the angle brackets are the coda's normal output.) This
is detailed information and generally nobody but your local coda
maintainer will care.
The ``-c'' flag prints out copyright and version information.
CODAFILES
The coda server reads a file to determine what parts of a distribution
get sent to which hosts. The file is normally named Codafile. This
section explains how to write codafiles, and does not have to be read
by everyone.
Blank lines are ignored, as is anything after a pound sign.
Whitespace is not significant. There are a few keywords, and they
appear in bold in the examples below. To use a keyword as a filename
(e.g., if you have a directory named class), put it in quotes. It is
also necessary to quote words if they contain any characters other
than letters, numbers, or the characters period, slash, or underscore.
- 3 - Formatted: December 13, 2025
CODA(1) CODA(1)
LOCAL
There are four constructs in a Codafile: parameter definitions, host
definitions, class definitions, and file definitions or blocks. They
may appear in any order.
Parameter definitions are a catch-all for miscellaneous parameters.
There are currently three parameters. Most pathnames in a Codafile
will be relative paths, the ``root'' is used for any directories or
files that do not start with a slash. For example:
define root = /usr/cronus ;
This is most useful when the Codafile for a system is not at the top
of the directory tree, or when it exists in someone's home directory.
At times it is useful to use the same Codafile for several different
source trees. The easiest way to do this is to not allow the clients
to specify the different roots. Since this can be a security hole, a
Codafile can specify that the root directory specified in the file may
not be overridden by the client. To do this, use the following line:
define rooted = yes ;
The value can be any word starting with the letter y. The default
value is no
The final parameter controls whether or not binary files are sent.
When preparing a list of files, the server can read the first few
bytes to see if a file is an ``a.out'' file, and if so, it will not
list it. To suppress this check, add a line like this:
define binaries = yes ;
The value can be any word starting with the letter y. The default
value is yes
Host definitions are used to name the hosts that are allowed to
receive the distribution, and to identify the system type. Both the
names and types are arbitrary text strings; host names are converted
to all uppercase. A client's hostname must be defined in the Codafile
before the server will send any files to it.
host citron.bbn.com = VMS ;
host pineapple.bbn.com = ultrix ;
host doe.bbn.com = sun4 ;
host papaya.bbn.com = sun3 ;
If for some reason the server cannot determine the client's host name,
then the name _ANYHOST is used.
In order to make the Codafile shorter, hosts are grouped into classes.
For example, it is convenient to be able to say ``give all the Unix
machines the files in foo.'' Classes are defined in two ways, by being
named as a system type in a host definition, like above, or by
appearing in a class definition, like this:
class SUN = sun3, sun4 ;
class UNIX = SUN, ultrix ;
Note that classes can be nested and can contain other classes. In
particular, it is possible to make loops that will tie the server up
in knots. Unlike host names, case is significant in class names. By
- 4 - Formatted: December 13, 2025
CODA(1) CODA(1)
LOCAL
convention, classes defined as host types are in lowercase, while
those defined as class types are in uppercase. The special built-in
class _ALL contains all hosts except _ANYHOST. A Codafile for a
public archive might start off like this:
define root = /usr/spool/ftp ;
define binaries = no ;
host _ANYHOST = guest ;
class WORLD = _ALL, _ANYHOST ;
The most important part of a Codafile is the file definitions, or
blocks. These have the following syntax (optional items are shown in
square brackets):
[ only_explicitly ] name : class {
item
[ except [directory] class pattern, ... ; ]
[ except [directory] class pattern, ... ; ]
item
...
directory item
[ except [directory] class pattern, ... ; ]
}
The name is used by client programs to limit the set of files they
want to receive, while the class is used by the server to determine if
the client has any access to the block at all. If a client does not
name specific blocks, then all blocks in the file are examined. If a
block starts with the only_explicitly keyword, than it must be
explicitly named by the client, otherwise it is not listed. This is
useful, for example, when the default is to distribute a complete
system without test data.
Within the block, each item names either a file or a directory. If
the item does not start with a slash, then the root is prepended. If
the item is a directory, than the server will walk down all the files
and directories beneath the named item. To name just a directory, put
the word directory before the item name. For example:
headers : _ALL {
include
directory cetc
cetc/hostfile
cetc/typefile
/etc/motd
}
This specifies that all hosts get the directory named include and all
files and directories within it. The next three lines specify that
all clients should have the cetc directory and the two files hostfile
and typefile within it. The actual location of these files on the
server depends on the value of the root parameter. Their location on
the client is relative to the directory from which the coda was first
invoked. The last line specifies that the motd file should exist with
the indicated full pathname, regardless of the value of the root
parameter, or where the client is being run from.
- 5 - Formatted: December 13, 2025
CODA(1) CODA(1)
LOCAL
Items can be given exception lists. Exception lists are patterns
similar to shell wildcards:
Character Meaning
? Any single character
* Zero or more characters
[abc..09] Any single character inside the brackets
The sequence ``a-z'' can be used to mean ``abcdefghijklmnopqrstuvwxyz''
[^a-z] Any single character not inside the brackets.
\x The character ``x'' has no special meaning (e.g., \?)
Exception patterns only match against the last part of the pathname.
That is, mgr.c and not /usr/cronus/src/lib/asynclib/mgr.a. To match
against the whole pathname, precede the pattern with an uparrow. This
can be necessary when you want to exclude a particular file that has
the same part of name as a directory further up in the source tree.
For example, with the following hierarchy:
clib/commandfile
clib/cronus.a
clib/diamond/fonts/helvetica10.font
clib/diamond/fonts/tv8b.font
clib/diamond/lib.a
clib/diamond/config
clib/editkeysfile
clib/lint/llib-lasync
clib/lint/llib-lasync.ln
clib/lint/llib-lulib
clib/lint/llib-lulib.ln
clib/malloctool.a
And the following block definition:
library : _ALL {
clib
except _ALL "*.a", "*.ln" ;
except directory VMS diamond, lint ;
}
Then, no clients will get the compiled libraries or lint(1) libraries,
and VMS clients will not get any files in the lint or diamond
directories. All clients will get the (presumably text) files named
commandfile, and editkeysfile.
With a good set of classes it is quite easy to tersely specify
distributions. The following example suffices to distribute the major
part of the Cronus source tree:
sources : _ALL {
src
exceptVMSMakefile, "*.sh", "*.s", "llib-l*" ;
exceptUNIXdescrip.mms, "*.opt", "*.com", "*.mar" ;
except_ALL"*.[oa]", "*.ln" ;
except_ALLa.out, core, foo, tags ;
}
- 6 - Formatted: December 13, 2025
CODA(1) CODA(1)
LOCAL
AUTHOR
This program was written by Rich $alz <rsalz@bbn.com>. It has the
following copyright:
Copyright 1989 BBN Systems and Technologies Corporation.
All Rights Reserved.
This is free software, and may be distributed under the terms of the
GNU Public License; see the file COPYING for more details.
$Header: coda.1,v 2.0 90/03/23 15:01:50 rsalz Exp $
SEE ALSO
codaserver(8).
- 7 - Formatted: December 13, 2025