[comp.sources.unix] v19i024: A software configuration management system, Part11/33

rsalz@uunet.uu.net (Rich Salz) (06/03/89)

Submitted-by: Axel Mahler <unido!coma!axel>
Posting-number: Volume 19, Issue 24
Archive-name: shape/part11



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 11 (of 33)."
# Contents:  man/man1/retrv.1 man/man1/vcat.1 src/afs/afstore.c
#   src/inc/afsys.h src/vc/Makefile
# Wrapped by rsalz@papaya.bbn.com on Thu Jun  1 19:27:00 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'man/man1/retrv.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'man/man1/retrv.1'\"
else
echo shar: Extracting \"'man/man1/retrv.1'\" \(9516 characters\)
sed "s/^X//" >'man/man1/retrv.1' <<'END_OF_FILE'
X...
X... Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X...  and U. Pralle
X... 
X... This software is published on an as-is basis. There is ABSOLUTELY NO
X... WARRANTY for any part of this software to work correctly or as described
X... in the manuals. We do not accept any liability for any kind of damage
X... caused by use of this software, such as loss of data, time, money, or 
X... effort.
X... 
X... Permission is granted to use, copy, modify, or distribute any part of
X... this software as long as this is done without asking for charge, and
X... provided that this copyright notice is retained as part of the source
X... files. You may charge a distribution fee for the physical act of
X... transferring a copy, and you may at your option offer warranty
X... protection in exchange for a fee.
X... 
X... Direct questions to: Tech. Univ. Berlin
X... 		     Wilfried Koch
X... 		     Sekr. FR 5-6 
X... 		     Franklinstr. 28/29
X... 		     D-1000 Berlin 10, West Germany
X... 
X... 		     Tel: +49-30-314-22972
X... 		     E-mail: shape@coma.uucp or shape@db0tui62.bitnet
X... 
X...
X... $Header: retrv.1[3.2] Thu Feb 23 18:13:43 1989 axel@coma published $
X... 
X... Log for /u/shape/dist-tape/src/vc/retrv.1[3.0]
X... 	Thu Feb 23 18:13:43 1989 axel@coma published $
X...  --- empty log message ---
X...  retrv.1[3.1] Thu Feb 23 18:13:43 1989 axel@coma published $
X...  --- empty log message ---
X...  retrv.1[3.2] Thu Feb 23 18:13:43 1989 axel@coma published $
X...  --- empty log message ---
X...
X.TH RETRV 1 retrv \n(dy.\n(mo.\n(yr
X.SH NAME
Xretrv \- retrieve a revision of a file
X.SH SYNOPSIS
X.IP \fBretrv\fR\ [\ \fIoptions\fR\ ]\fR\ files\ \.\|. 0.5i
X.IP \fBvcat\fR\ [\ \fIoptions\fR\ ]\fR\ files\ \.\|.
X.IP \fIOptions:\fR \w'\fIOptions:++\fR'u
X[\ \fB\-fhlmqt\fR\ ] [\ \fB\-V\ \fI<version>\ \fR] [\ \fB\-a\ \fIafile\fR\ ]
X[\ \fB\-date\ \fI<date>\ \fR] [\ \fB\-dest\fI\ path\fR\ ]
X.br
X[\ \fB\-g\ \fIgeneration\ \fR] 
X[\ \fB\-n\ \fIauthor\fR\ ] [\ \fB\-p\ \fIprojectname\fR\ ] 
X[\ \fB\-s\ \fIstate\fR\ ]
X.SH DESCRIPTION
X.PP
X\fBRetrv\fR retrieves a specified, previously saved version of a file from
Xthe version object base.
XUnless otherwise
Xspecified by the project context (\fB\-p\fR), the archive is expected to
Xreside in the AFS subdirectory. The retrieved version will be created
Xin the current directory. Retrieve tries to be careful if an
Xattempt is made to overwrite an existing busy-version: unless \fB\-f\fR
Xis specified, \fBretrv\fR will ask the caller for permission.
XIf no busy version exists, one is created with the same modes as the
Xformerly saved version. If a busy version exists, its modes are preserved
Xunless
X\fB\-m\fR is given.
X.PP
X\fIVersion attributes\fR that are cited within the text of a stored revision
Xare expanded by default. Attribute citation expressions are left unchanged
Xif a revision is retrieved with the \fB\-lock\fR option.
X.PP
XIf the program is invoked as \fBvcat\fR, the specified version(s)
Xwill be printed on standard output. No status change of the
Xobject base will 
Xoccur in this case. The \fB\-t\fR switch of the \fBretrv\fR command
Xcorresponds to \fBvcat\fR.
X.PP
XThere's a number of ways to specify which version shall be retrieved.
XWith \fB\-V\fR an explicit version can be selected. 
XAnother kind of argument to \fB\-V\fR
Xcould be a symbolic name that was assigned to
Xthe desired version by use of the \-n option of \fBsave\fR. 
XObject names may also be given in \fIbound version notation\fR,
Xi.e. a notation that identifies a particular version of an object (e.g.
X\fCmkattr.c[2.4]\fR). It is also possible to use a previously assigned
X\fIsymbolic name\fR rather than a numerical 
Xversion identification (e.g. \fCmkattr.c[tools-V4R3]\fR). Make sure
Xto escape the bracket-symbols as these usually have meaning to the
Xshell.
X.PP
XAlternatively, 
Xversions
Xcan be selected by supplying certain attribute values to \fBretrv\fR, such as
Xthe name of the author, the version state, a generation number or a 
Xset of user defined attributes, possibly describing a variant. In case
Xthat more than one version has the desired attributes, the newest
Xof them is selected.
XThis behaviour can be turned off by setting the \fB\-x\fR switch (exact!) which
Xindicates that the supplied version specification should match exactly
Xone version. \fB\-V\fR implies \fB\-x\fR.
X.PP
XAny combination of the selection options implies a conjunctive 
Xsearch expression.
X.LP
XIn complete detail, \fBretrv\fR can be invoked with the following options:
X.IP \fB\-f\fR \w'\fB\-V\ \fI<version>\fR'u
Xforces the reinstallation of the specified version as busy version without
Xasking the user, even if a writable (possibly unsaved) busy version
Xexists. This option should be used together with \fB\-x\fR.
X.IP "\fB\-h\fR"
Xprints brief instructions about using this program.
X.IP \fB\-lock\fR
Xtries to reserve the privilege to add a new version to an object
Xhistory, thus preventing multiple programmers working upon the same 
Xobject base from interfering with each other by saving concurrent updates.
XThis simple mechanism is for use in small development projects, that do
X\fInot\fR employ the scheme of private, experimental archives for each 
Xparticipating programmer, and one centralized \fIproject library\fR where
Xindividual work results are collected. 
XWhen setting a new lock on an object history, the requesting user
Xis prompted for an optional description of the planned changes.
X.IP \fB\-m\fR
Xreinstalls the new busy version with the file modes that were in effect
Xwhen the specified version was saved.
X.IP \fB\-q\fR
Xquiet operation. No messages are printed on standard output. 
XIf a current busy version exists, it will not be overwritten by 
Xthe specified version unless \fB\-f\fR is set. This option is useful for
Xbatch operation.
X.IP \fB\-t\fR
Xprint the contents of the specified version on standard output.
XThe current busy version is not affected. See also \fBvcat\fR.
X.IP \fB\-version\fR
Xprint version identification for this program.
X.IP \fB\-x\fR
Xrequire an exact match of the version specification. In case that a
Xversion specification matches more than one version in the archive
X(e.g. if no options are supplied at all), \fBretrv\fR by default selects the 
X\fInewest\fR of them. With \fB\-x\fR set, the retrieve operation \fIfails\fR
Xif more than one version matches the given version specification.
X.IP \fB\-V\ \fI<version>\fR
Xexplicitly select the version determined by \fIversion\fR. \fIVersion\fR
Xcan be of the form \fIgeneration\.revision\fR (e.g. 9.4) or it
Xcan be a unique symbolic name that was previously assigned to a version
Xby use of the \-n option of \fBsave\fR (e.g. \fCrelease4\fR).
X.IP \fB\-a\ \fIafile\fR
Xselect versions that conform to the attribute specification in \fIafile\fR.
XAttributes must be given in the form \fIname=value\fR
Xwith one attribute specification per line and no white-space.
XThe attribute value is optional, however, the \fIequal\fR symbol must
Xbe present. If the \fB\-a\fR option is omitted, \fBretrv\fR searches
Xthe environment for a variable \fIRETRATTRS\fR. If this variable
Xis absent, no user defined attributes will be used to determine the
Xversion to be selected.
X.IP \fB\-date\ \fI<date>\fR
X.IP \fB\-d\ \fI<date>\fR
Xselects the newest version that was saved \fIbefore\fR the date given
Xby \fIdate\fR. The date specification has the form \fIYY/MM/DD[/HH:MM]\fR.
XThe brackets indicate that the daytime specification is optional.
XThe option \fB\-d\fR is shorthand for \fB\-date\fR.
X.IP \fB\-dest\fI\ path\fR
Xretrieves the specified version from the object base and installs 
Xa \fIcopy\fR it in the directory denoted by \fIpath\fR. As this 
Xdirectory may be a long way apart from the directory containing
Xthe AFS archives, this copy of the retrieved version is separated
Xfrom its history and subsequently \fIunrelated\fR to the object
Xhistory it came from. Proper object histories require a constant
Xspatial relationship of any busy versions and the corresponding
Xarchives. This relationship requires the archives to reside
Xin a subdirectory 
Xnamed \fIAFS\fR.
X.IP \fB\-g\ \fIgeneration\fR
Xselects the newest version that was saved during generation \fIgeneration\fR.
X.IP \fB\-n\ \fIauthor\fR
Xselects the newest version that was saved by the user \fIauthor\fR.
X.IP \fB\-p\ \fIprojectname\fR
Xestablishes a \fIproject context\fR for the retrieve operation.
XThe project context defines the extent of the search space to be
Xconsidered by \fIretrv\fR, the permissions of the user issuing
Xthe command and a number of other parameters. 
X.br
XProject support is not implemented in the current version and so
Xthis option has no effect yet.
X.IP \fB\-s\ \fIstate\fR
Xselects the newest version that has the given \fIstate. State\fR may
Xbe either of \fIbusy, saved, proposed, published, accessed, \fRor\fI
Xfrozen\fR.
X.SH FILES
XAll revisions of documents are retrieved from archive files located
Xin the subdirectory
XAFS. 
X.SH SEE ALSO
Xsave(1), rsrv(1), sbmt(1), shape(1), vadm(1), vl(1), 
Xaf_intro(3), af_archive(5)
X.SH BUGS
XProject support is yet unimplemented.
X.PP
XSupport of user-defined attributes is rudimentary. Specification of such
Xattributes must be syntactically correct.
X.PP
X\fBretrv\fR neither reads the \fIShapefile\fR nor the \fIMakefile\fR and
Xconsequently sticks with the 'individual document level' rather than to
Xsupport handling of entire systems or subsystems (higer level targets
Xin \fI{Shape,Make}file\fRs).
X.SH AUTHOR
XAxel Mahler
X.br
XTechnical University Berlin
X.sp
X\fIUUCP:\fR		axel@coma.uucp (unido!coma!axel)
X.br
X\fIBITNET:\fR	axel@db0tui62
END_OF_FILE
if test 9516 -ne `wc -c <'man/man1/retrv.1'`; then
    echo shar: \"'man/man1/retrv.1'\" unpacked with wrong size!
fi
# end of 'man/man1/retrv.1'
fi
if test -f 'man/man1/vcat.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'man/man1/vcat.1'\"
else
echo shar: Extracting \"'man/man1/vcat.1'\" \(9516 characters\)
sed "s/^X//" >'man/man1/vcat.1' <<'END_OF_FILE'
X...
X... Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X...  and U. Pralle
X... 
X... This software is published on an as-is basis. There is ABSOLUTELY NO
X... WARRANTY for any part of this software to work correctly or as described
X... in the manuals. We do not accept any liability for any kind of damage
X... caused by use of this software, such as loss of data, time, money, or 
X... effort.
X... 
X... Permission is granted to use, copy, modify, or distribute any part of
X... this software as long as this is done without asking for charge, and
X... provided that this copyright notice is retained as part of the source
X... files. You may charge a distribution fee for the physical act of
X... transferring a copy, and you may at your option offer warranty
X... protection in exchange for a fee.
X... 
X... Direct questions to: Tech. Univ. Berlin
X... 		     Wilfried Koch
X... 		     Sekr. FR 5-6 
X... 		     Franklinstr. 28/29
X... 		     D-1000 Berlin 10, West Germany
X... 
X... 		     Tel: +49-30-314-22972
X... 		     E-mail: shape@coma.uucp or shape@db0tui62.bitnet
X... 
X...
X... $Header: retrv.1[3.2] Thu Feb 23 18:13:43 1989 axel@coma published $
X... 
X... Log for /u/shape/dist-tape/src/vc/retrv.1[3.0]
X... 	Thu Feb 23 18:13:43 1989 axel@coma published $
X...  --- empty log message ---
X...  retrv.1[3.1] Thu Feb 23 18:13:43 1989 axel@coma published $
X...  --- empty log message ---
X...  retrv.1[3.2] Thu Feb 23 18:13:43 1989 axel@coma published $
X...  --- empty log message ---
X...
X.TH RETRV 1 retrv \n(dy.\n(mo.\n(yr
X.SH NAME
Xretrv \- retrieve a revision of a file
X.SH SYNOPSIS
X.IP \fBretrv\fR\ [\ \fIoptions\fR\ ]\fR\ files\ \.\|. 0.5i
X.IP \fBvcat\fR\ [\ \fIoptions\fR\ ]\fR\ files\ \.\|.
X.IP \fIOptions:\fR \w'\fIOptions:++\fR'u
X[\ \fB\-fhlmqt\fR\ ] [\ \fB\-V\ \fI<version>\ \fR] [\ \fB\-a\ \fIafile\fR\ ]
X[\ \fB\-date\ \fI<date>\ \fR] [\ \fB\-dest\fI\ path\fR\ ]
X.br
X[\ \fB\-g\ \fIgeneration\ \fR] 
X[\ \fB\-n\ \fIauthor\fR\ ] [\ \fB\-p\ \fIprojectname\fR\ ] 
X[\ \fB\-s\ \fIstate\fR\ ]
X.SH DESCRIPTION
X.PP
X\fBRetrv\fR retrieves a specified, previously saved version of a file from
Xthe version object base.
XUnless otherwise
Xspecified by the project context (\fB\-p\fR), the archive is expected to
Xreside in the AFS subdirectory. The retrieved version will be created
Xin the current directory. Retrieve tries to be careful if an
Xattempt is made to overwrite an existing busy-version: unless \fB\-f\fR
Xis specified, \fBretrv\fR will ask the caller for permission.
XIf no busy version exists, one is created with the same modes as the
Xformerly saved version. If a busy version exists, its modes are preserved
Xunless
X\fB\-m\fR is given.
X.PP
X\fIVersion attributes\fR that are cited within the text of a stored revision
Xare expanded by default. Attribute citation expressions are left unchanged
Xif a revision is retrieved with the \fB\-lock\fR option.
X.PP
XIf the program is invoked as \fBvcat\fR, the specified version(s)
Xwill be printed on standard output. No status change of the
Xobject base will 
Xoccur in this case. The \fB\-t\fR switch of the \fBretrv\fR command
Xcorresponds to \fBvcat\fR.
X.PP
XThere's a number of ways to specify which version shall be retrieved.
XWith \fB\-V\fR an explicit version can be selected. 
XAnother kind of argument to \fB\-V\fR
Xcould be a symbolic name that was assigned to
Xthe desired version by use of the \-n option of \fBsave\fR. 
XObject names may also be given in \fIbound version notation\fR,
Xi.e. a notation that identifies a particular version of an object (e.g.
X\fCmkattr.c[2.4]\fR). It is also possible to use a previously assigned
X\fIsymbolic name\fR rather than a numerical 
Xversion identification (e.g. \fCmkattr.c[tools-V4R3]\fR). Make sure
Xto escape the bracket-symbols as these usually have meaning to the
Xshell.
X.PP
XAlternatively, 
Xversions
Xcan be selected by supplying certain attribute values to \fBretrv\fR, such as
Xthe name of the author, the version state, a generation number or a 
Xset of user defined attributes, possibly describing a variant. In case
Xthat more than one version has the desired attributes, the newest
Xof them is selected.
XThis behaviour can be turned off by setting the \fB\-x\fR switch (exact!) which
Xindicates that the supplied version specification should match exactly
Xone version. \fB\-V\fR implies \fB\-x\fR.
X.PP
XAny combination of the selection options implies a conjunctive 
Xsearch expression.
X.LP
XIn complete detail, \fBretrv\fR can be invoked with the following options:
X.IP \fB\-f\fR \w'\fB\-V\ \fI<version>\fR'u
Xforces the reinstallation of the specified version as busy version without
Xasking the user, even if a writable (possibly unsaved) busy version
Xexists. This option should be used together with \fB\-x\fR.
X.IP "\fB\-h\fR"
Xprints brief instructions about using this program.
X.IP \fB\-lock\fR
Xtries to reserve the privilege to add a new version to an object
Xhistory, thus preventing multiple programmers working upon the same 
Xobject base from interfering with each other by saving concurrent updates.
XThis simple mechanism is for use in small development projects, that do
X\fInot\fR employ the scheme of private, experimental archives for each 
Xparticipating programmer, and one centralized \fIproject library\fR where
Xindividual work results are collected. 
XWhen setting a new lock on an object history, the requesting user
Xis prompted for an optional description of the planned changes.
X.IP \fB\-m\fR
Xreinstalls the new busy version with the file modes that were in effect
Xwhen the specified version was saved.
X.IP \fB\-q\fR
Xquiet operation. No messages are printed on standard output. 
XIf a current busy version exists, it will not be overwritten by 
Xthe specified version unless \fB\-f\fR is set. This option is useful for
Xbatch operation.
X.IP \fB\-t\fR
Xprint the contents of the specified version on standard output.
XThe current busy version is not affected. See also \fBvcat\fR.
X.IP \fB\-version\fR
Xprint version identification for this program.
X.IP \fB\-x\fR
Xrequire an exact match of the version specification. In case that a
Xversion specification matches more than one version in the archive
X(e.g. if no options are supplied at all), \fBretrv\fR by default selects the 
X\fInewest\fR of them. With \fB\-x\fR set, the retrieve operation \fIfails\fR
Xif more than one version matches the given version specification.
X.IP \fB\-V\ \fI<version>\fR
Xexplicitly select the version determined by \fIversion\fR. \fIVersion\fR
Xcan be of the form \fIgeneration\.revision\fR (e.g. 9.4) or it
Xcan be a unique symbolic name that was previously assigned to a version
Xby use of the \-n option of \fBsave\fR (e.g. \fCrelease4\fR).
X.IP \fB\-a\ \fIafile\fR
Xselect versions that conform to the attribute specification in \fIafile\fR.
XAttributes must be given in the form \fIname=value\fR
Xwith one attribute specification per line and no white-space.
XThe attribute value is optional, however, the \fIequal\fR symbol must
Xbe present. If the \fB\-a\fR option is omitted, \fBretrv\fR searches
Xthe environment for a variable \fIRETRATTRS\fR. If this variable
Xis absent, no user defined attributes will be used to determine the
Xversion to be selected.
X.IP \fB\-date\ \fI<date>\fR
X.IP \fB\-d\ \fI<date>\fR
Xselects the newest version that was saved \fIbefore\fR the date given
Xby \fIdate\fR. The date specification has the form \fIYY/MM/DD[/HH:MM]\fR.
XThe brackets indicate that the daytime specification is optional.
XThe option \fB\-d\fR is shorthand for \fB\-date\fR.
X.IP \fB\-dest\fI\ path\fR
Xretrieves the specified version from the object base and installs 
Xa \fIcopy\fR it in the directory denoted by \fIpath\fR. As this 
Xdirectory may be a long way apart from the directory containing
Xthe AFS archives, this copy of the retrieved version is separated
Xfrom its history and subsequently \fIunrelated\fR to the object
Xhistory it came from. Proper object histories require a constant
Xspatial relationship of any busy versions and the corresponding
Xarchives. This relationship requires the archives to reside
Xin a subdirectory 
Xnamed \fIAFS\fR.
X.IP \fB\-g\ \fIgeneration\fR
Xselects the newest version that was saved during generation \fIgeneration\fR.
X.IP \fB\-n\ \fIauthor\fR
Xselects the newest version that was saved by the user \fIauthor\fR.
X.IP \fB\-p\ \fIprojectname\fR
Xestablishes a \fIproject context\fR for the retrieve operation.
XThe project context defines the extent of the search space to be
Xconsidered by \fIretrv\fR, the permissions of the user issuing
Xthe command and a number of other parameters. 
X.br
XProject support is not implemented in the current version and so
Xthis option has no effect yet.
X.IP \fB\-s\ \fIstate\fR
Xselects the newest version that has the given \fIstate. State\fR may
Xbe either of \fIbusy, saved, proposed, published, accessed, \fRor\fI
Xfrozen\fR.
X.SH FILES
XAll revisions of documents are retrieved from archive files located
Xin the subdirectory
XAFS. 
X.SH SEE ALSO
Xsave(1), rsrv(1), sbmt(1), shape(1), vadm(1), vl(1), 
Xaf_intro(3), af_archive(5)
X.SH BUGS
XProject support is yet unimplemented.
X.PP
XSupport of user-defined attributes is rudimentary. Specification of such
Xattributes must be syntactically correct.
X.PP
X\fBretrv\fR neither reads the \fIShapefile\fR nor the \fIMakefile\fR and
Xconsequently sticks with the 'individual document level' rather than to
Xsupport handling of entire systems or subsystems (higer level targets
Xin \fI{Shape,Make}file\fRs).
X.SH AUTHOR
XAxel Mahler
X.br
XTechnical University Berlin
X.sp
X\fIUUCP:\fR		axel@coma.uucp (unido!coma!axel)
X.br
X\fIBITNET:\fR	axel@db0tui62
END_OF_FILE
if test 9516 -ne `wc -c <'man/man1/vcat.1'`; then
    echo shar: \"'man/man1/vcat.1'\" unpacked with wrong size!
fi
# end of 'man/man1/vcat.1'
fi
if test -f 'src/afs/afstore.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/afs/afstore.c'\"
else
echo shar: Extracting \"'src/afs/afstore.c'\" \(9385 characters\)
sed "s/^X//" >'src/afs/afstore.c' <<'END_OF_FILE'
X/*
X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X *  and U. Pralle
X * 
X * This software is published on an as-is basis. There is ABSOLUTELY NO
X * WARRANTY for any part of this software to work correctly or as described
X * in the manuals. We do not accept any liability for any kind of damage
X * caused by use of this software, such as loss of data, time, money, or 
X * effort.
X * 
X * Permission is granted to use, copy, modify, or distribute any part of
X * this software as long as this is done without asking for charge, and
X * provided that this copyright notice is retained as part of the source
X * files. You may charge a distribution fee for the physical act of
X * transferring a copy, and you may at your option offer warranty
X * protection in exchange for a fee.
X * 
X * Direct questions to: Tech. Univ. Berlin
X * 		     Wilfried Koch
X * 		     Sekr. FR 5-6 
X * 		     Franklinstr. 28/29
X * 		     D-1000 Berlin 10, West Germany
X * 
X * 		     Tel: +49-30-314-22972
X * 		     E-mail: shape@coma.uucp or shape@db0tui62.bitnet
X */
X/*
X *	Shape/AFS
X *
X *	afstore.c -- interface to archives and binary pools
X *
X *	Author: Andreas Lampen, TU-Berlin (andy@coma.UUCP)
X *					  (andy@db0tui62.BITNET)
X *
X *	$Header: afstore.c[1.5] Wed Feb 22 16:28:15 1989 andy@coma published $
X *
X *	EXPORT:
X *      af_bldfile -- build file containing data of version 
X *      af_newvers -- get attribute buffer for new version
X *      af_delvers -- delete version
X *      af_addvers -- add version
X *      af_updtvers -- update attribute buffer of version
X *      af_detlist -- detach archive or binary pool
X */
X
X#include <stdio.h>
X#include <string.h>
X#ifdef SUNOS_4_0
X#include <strings.h>
X#endif
X#include <sys/time.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#include "typeconv.h"
X#include "afsys.h"
X#include "afs.h"
X#include "afarchive.h"
X
X/*=========================================================================
X * af_arlock -- lock archive
X *
X *=========================================================================*/
X
XLOCAL af_arlock (list)
X     Af_revlist *list;
X{
X  struct stat ibuf;
X  char lckfilename [MAXNAMLEN*4];
X  FILE *lckfd;
X
X  if (stat (list->af_arfilename, &ibuf) == ERROR) /* no archive file present */
X    {
X      /* if there should be an archive file */
X      if (list->af_lastmod != (time_t) 0)
X	FAIL ("arlock", "archive file lost", AF_EINTERNAL, ERROR);
X    }
X  else
X    {
X      /* if archive has changed since last read */
X      if (list->af_lastmod != (time_t) af_cvttime (ibuf.st_mtime))
X	FAIL ("arlock", "", AF_EARCHANGED, ERROR);
X    }
X
X  (void) strcpy (lckfilename, list->af_arfilename);
X  lckfilename [strlen (lckfilename) - sizeof (char)] = AF_LCKEXT;
X  if (stat (lckfilename, &ibuf) == ERROR) /* no lock file present */
X    {
X      /* create lockfile */
X      if ((lckfd = fopen (lckfilename, "w")) == (FILE *)0)
X	SFAIL ("arlock", "fopen (lockfile)", AF_ESYSERR, ERROR);
X      (void) fclose (lckfd);
X      af_reglckfile (lckfilename);
X      return (AF_OK);
X    }
X
X  sleep (AF_LOCKTIMEOUT);
X  
X  if (stat (lckfilename, &ibuf) == ERROR) /* no lock file present */
X    {
X      if ((lckfd = fopen (lckfilename, "w")) == (FILE *)0)
X	SFAIL ("arlock", "fopen (lockfile)", AF_ESYSERR, ERROR);
X      (void) fclose (lckfd);
X      af_reglckfile (lckfilename);
X      return (AF_OK);
X    }
X  else
X    FAIL ("arlock", "", AF_EARLOCKED, ERROR);
X}
X
X/*=========================================================================
X * af_arunlock -- unlock archive
X *
X *=========================================================================*/
X
XLOCAL af_arunlock (list)
X     Af_revlist *list;
X{
X  char lckfilename [MAXNAMLEN*4];
X  struct stat ibuf;
X
X  (void) strcpy (lckfilename, list->af_arfilename);
X  lckfilename [strlen (lckfilename) - sizeof (char)] = AF_LCKEXT;
X
X  /* update list descriptor */
X  if (stat (list->af_arfilename, &ibuf) != ERROR)
X    list->af_lastmod = (time_t) af_cvttime (ibuf.st_mtime);
X
X  if (af_unlink (lckfilename) == ERROR)
X    FAIL ("af_arunlock", "lock file lost", AF_EINTERNAL, ERROR);
X  return (AF_OK);
X}
X
X/*=========================================================================
X * af_bldfile
X *
X *=========================================================================*/
X
XEXPORT af_bldfile (key, name)
X     Af_key *key;
X     char   *name;
X{
X  struct timeval tvp[2];
X
X  if (key->af_ldes->af_extent & AF_BPOOL)
X    {
X      /* get file from binary pool */
X      if (af_cpfile (af_bpfilename (CATTR(key).af_syspath, VATTR(key).af_hashname), VATTR(key).af_fsize, name) == ERROR)
X	FAIL ("bldfile", "cpfile", AF_ESYSERR, ERROR);
X      /*** set modification and access date ***/
X      tvp[0].tv_sec = VATTR(key).af_atime;
X      tvp[0].tv_usec = 0; 
X      tvp[1].tv_sec = VATTR(key).af_mtime;
X      tvp[1].tv_usec = 0;
X      if (utimes (name, tvp) == ERROR)
X	FAIL ("bldfile", "utimes", AF_ESYSERR, ERROR);
X      (void) af_uchmod (name, (int) VATTR(key).af_mode);
X    }
X  else
X    {
X      /* get data from archive file */
X      if (af_readdata (key->af_ldes) == ERROR)
X	return (ERROR);
X      
X      if (af_undodelta (key, name) == ERROR)
X	return (ERROR);
X    }
X  return (AF_OK);
X}
X
X
X/*=========================================================================
X * af_newvers
X *
X *=========================================================================*/
X
XEXPORT af_newvers (list, key, mode)
X     Af_revlist *list;
X     Af_key     *key;
X     int        mode;
X{
X  if (mode != AF_SOURCE)
X    FAIL ("newvers", "invalid mode", AF_EINTERNAL, ERROR);
X
X  key->af_ldes = list;
X  /* if revision list is full */
X  if ((key->af_lpos = af_gfreepos (list)) == ERROR)
X    FAIL ("newvers", "too many new revisions", AF_EINTERNAL, ERROR);
X  
X  /* get data from archive */
X  if (af_readdata (list) == ERROR)
X    return (ERROR);
X
X  return (AF_OK);
X}
X  
X
X
X/*=========================================================================
X * af_delvers -- delete version
X *
X *=========================================================================*/
X
XEXPORT af_delvers (key)
X     Af_key *key;
X{
X  char *busyname;
X
X  /* if key points to a file in a binary pool */
X  if (key->af_ldes->af_extent & AF_BPOOL)
X    return (af_delbpentry (key));
X
X  /* if "key" points to a busy version */
X  if (af_arlock (key->af_ldes) == ERROR)
X    return (ERROR);
X
X  if (VATTR(key).af_state == AF_BUSY)
X    {
X      VATTR(key).af_predgen = AF_NOVNUM;
X      VATTR(key).af_predrev = AF_NOVNUM;
X      VATTR(key).af_lckname = (char *)0;
X      VATTR(key).af_lckhost = (char *)0;
X      VATTR(key).af_ltime = AF_NOTIME;
X      /* remove busy file */
X      busyname = af_gbusname (CATTR(key).af_syspath, VATTR(key).af_name, VATTR(key).af_type);
X      (void) af_unlink (busyname);
X      af_hashfree (&(VATTR(key).af_uhtab));
X    }
X  else
X    /* remove delta */
X    {
X      /* read data section of archive */
X      if (af_readdata (key->af_ldes) == ERROR)
X	return (ERROR);
X      
X      key->af_ldes->af_datasize -= VATTR(key).af_notesize;
X      if (VATTR(key).af_repr == AF_DELTA)
X	key->af_ldes->af_datasize -= VATTR(key).af_dsize;
X      else
X	key->af_ldes->af_datasize -= VATTR(key).af_fsize;
X
X      (void) af_rmdelta (key);
X    }
X
X  /* clear "valid" bit */
X  VATTR(key).af_class &= ~AF_VALID;
X
X  key->af_ldes->af_nrevs--;
X
X  if (af_writearchive (key->af_ldes) == ERROR)
X    {
X      (void) af_arunlock (key->af_ldes);
X      return (ERROR);
X    }
X  else
X    return (af_arunlock (key->af_ldes));
X}
X
X/*=========================================================================
X * af_addvers -- add version
X *
X *=========================================================================*/
X
XEXPORT af_addvers (key)
X     Af_key *key;
X{
X  /* this function should only be used for archives (not for bpools */
X  /* I know, it is not very well-designed but ... */
X  if (key->af_ldes->af_extent & AF_BPOOL)
X    FAIL ("addvers", "cannot apply on binary pools", AF_EINTERNAL, ERROR);
X  if (af_arlock (key->af_ldes) == ERROR)
X    return (ERROR); 
X  if (af_writearchive (key->af_ldes) == ERROR)
X    {
X      (void) af_arunlock (key->af_ldes);
X      return (ERROR);
X    }
X  else
X    return (af_arunlock (key->af_ldes));
X}
X
X/*=========================================================================
X * af_updtvers -- update attribute buffer of version
X *
X *=========================================================================*/
X
XEXPORT af_updtvers (key, mode)
X     Af_key *key;
X     int    mode;
X{
X  if (mode & (AF_ALLVERS | AF_CHANGE))
X    {
X      /* update time of last status change (ctime) for all versions */
X      /* not yet implemented (update ctime) */
X    }
X  else 
X    {
X      if (mode & AF_CHANGE) /* update ctime only for this version */
X	VATTR(key).af_ctime = (time_t) af_acttime ();
X    }
X
X  if (key->af_ldes->af_extent & AF_BPOOL)
X    return (af_rplbpentry (key, key, key));
X  else
X    {
X      if (af_arlock (key->af_ldes) == ERROR)
X	return (ERROR); 
X      if (af_writearchive (key->af_ldes) == ERROR)
X	{
X	  (void) af_arunlock (key->af_ldes);
X	  return (ERROR);
X	}
X      else
X	return (af_arunlock (key->af_ldes));
X    }
X}
X
X/*=========================================================================
X * af_detlist -- detach archive or binary pool
X *
X *=========================================================================*/
X
XEXPORT af_detlist (list)
X     Af_revlist *list;
X{
X  if (list->af_extent & AF_BPOOL)
X    return (af_detbpool (list));
X  else
X    return (af_detarchive (list));
X}
X
END_OF_FILE
if test 9385 -ne `wc -c <'src/afs/afstore.c'`; then
    echo shar: \"'src/afs/afstore.c'\" unpacked with wrong size!
fi
# end of 'src/afs/afstore.c'
fi
if test -f 'src/inc/afsys.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/inc/afsys.h'\"
else
echo shar: Extracting \"'src/inc/afsys.h'\" \(9500 characters\)
sed "s/^X//" >'src/inc/afsys.h' <<'END_OF_FILE'
X/*
X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X *  and U. Pralle
X * 
X * This software is published on an as-is basis. There is ABSOLUTELY NO
X * WARRANTY for any part of this software to work correctly or as described
X * in the manuals. We do not accept any liability for any kind of damage
X * caused by use of this software, such as loss of data, time, money, or 
X * effort.
X * 
X * Permission is granted to use, copy, modify, or distribute any part of
X * this software as long as this is done without asking for charge, and
X * provided that this copyright notice is retained as part of the source
X * files. You may charge a distribution fee for the physical act of
X * transferring a copy, and you may at your option offer warranty
X * protection in exchange for a fee.
X * 
X * Direct questions to: Tech. Univ. Berlin
X * 		     Wilfried Koch
X * 		     Sekr. FR 5-6 
X * 		     Franklinstr. 28/29
X * 		     D-1000 Berlin 10, West Germany
X * 
X * 		     Tel: +49-30-314-22972
X * 		     E-mail: shape@coma.uucp or shape@db0tui62.bitnet
X */
X/*
X *	Shape/AFS
X *
X *	afsys.h - Internal type and Constant-Definitions for the 
X *		  Attribute-Filesystem
X *
X *	Author:	Andreas Lampen (andy@coma.UUCP
X *				andy@db0tui62.BITNET)
X *
X *	$Header: afsys.h[1.5] Wed Feb 22 16:29:46 1989 andy@coma published $
X */
X
X#ifndef _AFSYS_
X#define _AFSYS_
X
X/*=========================================================================
X * Installation dependent constants 
X *=========================================================================*/
X
X#include <stdio.h>
X#include <sys/types.h>
X#ifndef MAXNAMLEN
X#include <sys/dir.h>
X#endif
X#include <sys/param.h>
X
X#ifndef _TYPECONV_
X#  ifdef ULTRIX_2_0
X#    define Uid_t int
X#    define Gid_t int
X#  else
X#    define Uid_t uid_t
X#    define Gid_t gid_t
X#  endif
X#endif
X
X#ifdef ULTRIX_2_0
X#define MAXHOSTNAMELEN 64
X#endif
X
X/*=========================================================================
X * general constants 
X *=========================================================================*/
X
X#ifndef TRUE
X#define TRUE		1
X#endif
X#ifndef FALSE
X#define FALSE		0
X#endif
X
X#define ERROR		-1
X#define LOCAL		static
X#define EXPORT
X#define bool		short
X
X/*=========================================================================
X * Hash stuff
X *=========================================================================*/
X
Xtypedef struct Af_hshent Af_hashent;
X
Xtypedef struct Af_hsh Af_hash;
X
Xstruct Af_hsh { int        hsize,       /* No. of slots in hashtable */
X		           (*fhash)();  /* Pointer to hash-function */
X		Af_hashent *hashtb;     /* Anchor of hashtable */
X	      };
X
X/*=========================================================================
X * Internal Type Definitions
X *=========================================================================*/
X
X/**** buffer for version-independent attributes ****/
Xtypedef struct {
X		char	*af_host;               /* hostname */  
X		char	*af_syspath;    	/* system path (incl. host) */
X		char	*af_ownname;		/* name of owner */
X		char	*af_ownhost;		/* host of owner */
X	       } Af_cattrs;
X
X/**** buffer for version-dependent attributes ****/
Xtypedef struct {
X		char	*af_name;	        /* filename */
X		char	*af_type;	        /* filename extension (type) */
X		int	af_gen;			/* generation number */
X		int	af_rev;			/* revision number */
X		char    *af_variant;            /* variant string */
X		short	af_state;		/* version state (see below) */
X		short   af_class;               /* file class */
X		char 	*af_auname;		/* name of author */
X		char    *af_auhost;		/* host of author */
X		u_short af_mode;		/* protection (from inode) */
X		char    *af_lckname;            /* name of locker */
X		char    *af_lckhost;            /* host of locker */
X		time_t	af_mtime;		/* date of last modification */
X		time_t	af_atime;		/* date of last access */
X		time_t	af_ctime;		/* date of last status change*/
X		time_t	af_stime;		/* save date */
X		time_t	af_ltime;		/* date of last lock change */
X		off_t	af_notesize;		/* size of note */
X		char	*af_note;		/* modification note */
X		int     af_udanum;              /* number of uda entries */
X		Af_hash af_uhtab;               /* hash table for udefattrs */
X		short	af_repr;		/* kind of representation */
X		off_t	af_fsize;		/* size of file */
X		off_t	af_dsize;		/* size of delta */
X		char	*af_data;		/* ptr to chunk or delta */
X		char    *af_hashname;           /* name of associated file */
X		short   af_nlinks;              /* # of links to attrbuf */
X		int	af_succgen,		/* physical 	  */
X			af_succrev;		/*	successor */
X		int	af_predgen,		/* physical 	    */
X			af_predrev;		/*	predecessor */
X	       } Af_vattrs;
X
X/**** Descriptor for revision list ****/
Xtypedef struct rvlist Af_revlist;
X
Xstruct rvlist {
X                char	  *af_arfilename;    /* filename of archive */
X		time_t    af_lastmod;        /* last mod. of archive file */
X		char	  *af_busyfilename;  /* filename of busy version */
X		short	  af_nrevs;	     /* number of revs in list */
X		short	  af_listlen;	     /* total length of list */
X		off_t	  af_datasize;	     /* size of data-segment */
X		short	  af_extent;	     /* extent of revision list */
X		Af_cattrs af_cattrs;	     /* version-independent attrs */
X		Af_vattrs *af_list;	     /* pointer to revision list */
X		int       af_refcount;       /* number of keys in use */
X		char      *af_mem;           /* list of ptrs to alloc. mem. */
X		Af_revlist *af_next;         /* index of next freelist entry */
X	      };
X
X/*=========================================================================
X * More Hash stuff
X *=========================================================================*/
X
Xstruct Af_hshent { char          *symbol;
X		   Af_revlist    *revlist;
X		   Af_hashent    *next;
X		 };
X 
X/*=========================================================================
X * Internal Installation dependent constants
X *=========================================================================*/
X
X#define AF_MAXSYMS    211       /* size of hashtable for symbols */
X#define AF_MAXUDAS     61       /* size of hashtable for user defined attrs */
X#define AF_SEGLEN      32       /* size of segment for (re-)allocation */
X
X/**** "syntactical sugar" for user defined attributes ****/
X#define AF_UDANAMDEL    '='		/* Delimiter for UDA name in archive */
X#define AF_UDAVALDEL	'\01'		/* Delimiter for UDA values in arch. */
X
X/**** UNIX Environment ****/
X#define AF_TMPDIR	"/tmp"		/* location of archive files */
X#define AF_SUBDIR	"AFS"		/* subdirectory for archives */
X#define AF_ARCHEXT	'A'		/* extension for archive names */
X#define AF_DATAEXT	'D'		/* extension for datafile names */
X#define AF_LCKEXT	'L'		/* extension for lock files */
X#define AF_ARCHTMP	'T'		/* extension for temp archive names */
X#define AF_DATATMP	'U'		/* extension for temp datafile names */
X#define AF_ERRLOG	"/tmp/AFSerrlog" /* Error Log file */
X
X/**** file locking ****/
X#define AF_LOCKTIMEOUT  (unsigned) 1    /* wait 1 sec when archive is locked */
X
X/*=========================================================================
X * Internal Constant Definitions
X *=========================================================================*/
X
X/**** general ****/
X
X#define AF_READ         0
X#define AF_WRITE        1
X#define AF_RDWR         2
X
X/**** representation types ****/
X
X#define AF_CHUNK	0
X#define AF_DELTA	1
X#define AF_FILE         2 /* version resides in an own file (busy version) */
X
X/**** Version numbering ****/
X
X#define AF_INITGEN	1
X#define AF_INITREV	0
X
X/**** Modes for archive manipulation ****/
X
X#define AF_CHANGE      01
X#define AF_ALLVERS     02
X
X/**** Environment interaction ****/
X
X#define AF_ENVBPSIZE    "AFSBPSIZ" /* name of environment variable defining */
X                                   /* max. number of files in bin. pool */
X#define AF_MAXBPSIZE    64         /* max # of files in binary pool if no */
X                                   /* environment variable is present */
X
X/**** Permissions for checkperm ****/
X
X#define AF_OWNER        0001
X#define AF_AUTHOR       0002
X#define AF_LOCKHOLDER   0004
X#define AF_WORLD        0010
X
X#define AF_REMOTE       -2
X
X/*=========================================================================
X * Useful macros
X *=========================================================================*/
X
X#define CATTR(keyp)      keyp->af_ldes->af_cattrs
X#define VATTR(keyp)      keyp->af_ldes->af_list[keyp->af_lpos]
X
X/* compare filekeys -- returnes 0 if equal (like strcmp) */
X#define af_keycmp(key1,key2) (((key1)->af_ldes != (key2)->af_ldes) || ((key1)->af_lpos != (key2)->af_lpos))
X
X/* report error and return */
X#define FAIL(msg1,msg2,errcd,retcd) { af_err (msg1, msg2, errcd); return (retcd); }
X#define SFAIL(msg1,msg2,errcd,retcd) { af_serr (msg1, msg2, errcd); return (retcd); }
X
X/* convert nil pointer to empty string */
X#define NOTNIL(str) (str ? str : "")
X
X/*=========================================================================
X * Declarations
X *=========================================================================*/
X
Xchar *af_malloc(), *af_realloc(), *af_gtmpname(), *af_gethostname();
Xchar *af_entersym(), *af_replsym(), *af_garname(), *af_gbusname();
Xchar *af_bpfilename();
Xchar *af_rbphashname(), *af_unixname(), *af_gbpname(), *af_uniqpath();
Xchar *af_hashsym(), *af_symlookup(), *af_vallookup(), *af_enterhost();
Xvoid af_frmemlist(), af_serr(), af_err(), af_wng();
Xvoid af_free(), af_frmemlist(), af_regtmpfile(), af_unregtmpfile();
Xoff_t af_retfsize();
XUid_t af_getuid(), getuid();
XGid_t af_getgid();
X#endif
END_OF_FILE
if test 9500 -ne `wc -c <'src/inc/afsys.h'`; then
    echo shar: \"'src/inc/afsys.h'\" unpacked with wrong size!
fi
# end of 'src/inc/afsys.h'
fi
if test -f 'src/vc/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/vc/Makefile'\"
else
echo shar: Extracting \"'src/vc/Makefile'\" \(9367 characters\)
sed "s/^X//" >'src/vc/Makefile' <<'END_OF_FILE'
X#
X# Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X#  and U. Pralle
X# 
X# This software is published on an as-is basis. There is ABSOLUTELY NO
X# WARRANTY for any part of this software to work correctly or as described
X# in the manuals. We do not accept any liability for any kind of damage
X# caused by use of this software, such as loss of data, time, money, or effort.
X# 
X# Permission is granted to use, copy, modify, or distribute any part of
X# this software as long as this is done without asking for charge, and
X# provided that this copyright notice is retained as part of the source
X# files. You may charge a distribution fee for the physical act of
X# transferring a copy, and you may at your option offer warranty
X# protection in exchange for a fee.
X# 
X# Direct questions to: Tech. Univ. Berlin
X# 		     Wilfried Koch
X# 		     Sekr. FR 5-6 
X# 		     Franklinstr. 28/29
X# 		     D-1000 Berlin 10, West Germany
X# 
X# 		     Tel: +49-30-314-22972
X# 		     E-mail: shape@coma.uucp or shape@db0tui62.bitnet
X# 
X#
X# $Header: Makefile[1.2] Thu Feb 23 18:13:23 1989 axel@coma published $
X#
X# Log for /u/shape/dist-tape/src/vc/Makefile[1.0]
X# 	Thu Feb 23 18:13:23 1989 axel@coma save $
X#  This Makefile is solely intended for the bootstrap installation
X#  of the SHAPE version-control system. It should be invoked by a 
X#  master Make 'install' process defining the macros BASE, SYSTEM, and
X#  possibly CONFIG from the commandline.
X#  
X#  Makefile[1.1] Thu Feb 23 18:13:23 1989 axel@coma published $
X#  added target 'depend:'. Works very nice.
X#  
X#  Makefile[1.2] Thu Feb 23 18:13:23 1989 axel@coma published $
X#  --- empty log message ---
X#
X#
X#  Makefile for Version Control System
X#  (used only for porting and installing)
X
X#
X#  general part
X
X# ---> define operating system
X# known systems are:   BSD_4_3   SUNOS_4_0   ULTRIX_2_0
XSYSTEM = BSD_4_3 
X
X# ---> define config
X# any combination of:
X#	-DSYSLOG  -- the syslog facility shall be used for protocoling errors
X#	-DOLDDBM  -- use "dbm" instead of "ndbm" (don't forget to set -ldbm)
X#define c libraries
X#	"CLIBS = -ldbm" is necessary when compiling with -DOLDDBM
XCONFIG =
XCLIBS =
X
X# ---> define locations of sources and executables
XBASE = /u/shape
XSRCDIR = $(BASE)/src/vc
XLIBDIR = $(BASE)/lib
XINCLUDEDIR = $(BASE)/src/inc
X
X# define anything you like here (e.g. /usr/local)
XINSTALDIR = $(BASE)/bin
XINSTALOWNER = shape
XINSTALGROUP = unib
X
XBUCKS = $$
X
XCC = cc -DCFFLGS='"$(BUCKS)Flags: <$<> $(CFLAGS) $$"'
X
XCFLAGS = -g -D$(SYSTEM) $(CONFIG) -I$(INCLUDEDIR)
XLDFLAGS = -g
X
X#
X#  Product definition part
X#
X
XCOMPONENTS = $(MANUALS) $(MODULES) $(DEFINES)
X
XMODULES = \
X	doretrv.c \
X	dosave.c \
X	mkattr.c \
X	project.c \
X	retrv.c \
X	save.c \
X	sighand.c \
X	util.c \
X	vl.c \
X	vldovl.c \
X	vlmisc.c \
X	vlopt.c \
X	vadm.c \
X	vadm_utils.c  \
X	vadm_note.c \
X	vadm_delete.c \
X	vadm_promote.c \
X	vadm_reserve.c \
X	vadm_symname.c \
X	vadm_gkeys.c \
X	vc_call.c \
X	vc_files.c \
X	vc_keyboardIo.c \
X	vc_lock.c 
X
XDEFINES = \
X	afsapp.h \
X	locks.h \
X	retrv.h \
X	save.h \
X	typeconv.h \
X	vl.h \
X	vadm.h \
X	vadmdefs.h \
X	vc_sysdep.h
X
XMANUALS = \
X	retrv.1 \
X	save.1 \
X	vadm.1 \
X	vcintro.1 \
X	vl.1 
X
XPRODUCT = vccommands
XSUBPRODUCTS = \
X	$(BASE)/lib/libafs \
X	$(BASE)/lib/libutil 
X
X
XAFSLIB = $(BASE)/lib/libafs.a
XUTLIB = $(BASE)/lib/libutil.a
X
XAFSINC = $(BASE)/src/inc
X
XPROGS = save retrv vl vadm
XVERSION = version
X
XSAVESRC  = save.c dosave.c vc_lock.c mkattr.c $(COMMONSRC)
XSAVEOBJS = save.o dosave.o vc_lock.o mkattr.o
XRETRSRC = retrv.c doretrv.c mkattr.c vc_lock.c  $(COMMONSRC)
XRETROBJS = retrv.o doretrv.o mkattr.o vc_lock.o
XVLSRC = vl.c vlmisc.c vldovl.c vlopt.c mkattr.c $(VERSION).c
XVLOBJS = vl.o vlmisc.o vldovl.o vlopt.o mkattr.o
XVLINC = vl.h afs_huda.h
XVADMOBJS = vadm.o vadm_utils.o vadm_note.o vadm_delete.o vadm_promote.o\
X	   vadm_symname.o vadm_reserve.o vadm_gkeys.o vc_call.o vc_files.o\
X	   vc_keyboardIo.o vc_lock.o util.o sighand.o mkattr.o
XVADMSRC = vadm.c vadm_utils.c vadm_note.c vadm_delete.c vadm_promote.c\
X	   vadm_symname.c vadm_reserve.c vadm_gkeys.c vc_call.c vc_files.c\
X	   vc_keyboardIo.c vc_lock.c util.c sighand.c mkattr.c $(COMMONSRC)
XVADMINC = vadm.h vadmdefs.h vc_sysdep.h
XCOMMON = project.o sighand.o util.o $(VERSION).o
XCOMMONSRC = project.c sighand.c util.c $(VERSION).c
XALLOBJS = $(SAVEOBJS) $(RETROBJS) $(VLOBJS) $(COMMON)
X
Xall: save retrv vl vadm
X
Xsave: $(SAVEOBJS) $(COMMON) $(AFSLIB) $(UTLIB)
X	cc $(LDFLAGS) -o $@ $(SAVEOBJS) $(COMMON) $(UTLIB) $(AFSLIB) $(CLIBS)
X
Xretrv: $(RETROBJS) $(COMMON) $(AFSLIB) $(UTLIB)
X	cc $(LDFLAGS) -o $@ $(RETROBJS) $(COMMON) $(UTLIB) $(AFSLIB) $(CLIBS)
X
Xvl: $(VLOBJS) $(AFSLIB) $(UTLIB)
X	cc $(LDFLAGS) -o $@ $(VLOBJS) $(VERSION).o $(UTLIB) $(AFSLIB) $(CLIBS)
X
Xvadm: $(VADMOBJS) $(AFSLIB) $(UTLIB)
X	cc $(LDFLAGS) -o $@ $(VADMOBJS) $(VERSION).o $(UTLIB) $(AFSLIB) \
X	$(CLIBS)
X
Xinstall: all
X	@echo -n installing version control system in $(INSTALDIR)...; \
X	(cd $(BASE)/bin; rm -f save retrv vadm vl sbmt vcat vlog) ; \
X	echo -n .; \
X	install -c -m 755 save $(INSTALDIR); \
X	echo -n .; \
X	install -c -m 755 retrv $(INSTALDIR); \
X	echo -n .; \
X	install -c -m 755 vadm $(INSTALDIR); \
X	echo -n .; \
X	install -c -m 755 vl $(INSTALDIR); \
X	echo -n .; \
X	ln save sbmt; \
X	echo -n .; \
X	ln retrv vcat; \
X	echo -n .; \
X	ln vl vlog; \
X	echo done
X
Xdepend:
X	$(CC) -M $(CFLAGS) $(MODULES) | \
X	sed -e '/\/usr\/include/d' -e 's.$(BASE).$$(BASE).g' | sort \
X	| uniq > makedep
X	echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >eddep
X	echo '$$r makedep' >>eddep
X	echo 'w' >>eddep
X	cp Makefile Makefile.bak
X	ex - Makefile < eddep
X	rm makedep eddep
X
X
X# DO NOT DELETE THIS LINE
Xdoretrv.o: $(BASE)/src/inc/afs.h
Xdoretrv.o: $(BASE)/src/inc/afsys.h
Xdoretrv.o: ./afsapp.h
Xdoretrv.o: ./locks.h
Xdoretrv.o: ./project.h
Xdoretrv.o: ./retrv.h
Xdoretrv.o: ./typeconv.h
Xdoretrv.o: doretrv.c
Xdosave.o: $(BASE)/src/inc/afs.h
Xdosave.o: $(BASE)/src/inc/afsys.h
Xdosave.o: ./afsapp.h
Xdosave.o: ./locks.h
Xdosave.o: ./project.h
Xdosave.o: ./save.h
Xdosave.o: ./typeconv.h
Xdosave.o: dosave.c
Xmkattr.o: $(BASE)/src/inc/afs.h
Xmkattr.o: $(BASE)/src/inc/afsys.h
Xmkattr.o: ./afsapp.h
Xmkattr.o: ./retrv.h
Xmkattr.o: ./typeconv.h
Xmkattr.o: mkattr.c
Xproject.o: ./project.h
Xproject.o: project.c
Xretrv.o: $(BASE)/src/inc/ParseArgs.h
Xretrv.o: $(BASE)/src/inc/afs.h
Xretrv.o: $(BASE)/src/inc/afsys.h
Xretrv.o: ./afsapp.h
Xretrv.o: ./project.h
Xretrv.o: ./retrv.h
Xretrv.o: ./typeconv.h
Xretrv.o: retrv.c
Xsave.o: $(BASE)/src/inc/ParseArgs.h
Xsave.o: ./afsapp.h
Xsave.o: ./project.h
Xsave.o: ./save.h
Xsave.o: ./typeconv.h
Xsave.o: save.c
Xsighand.o: $(BASE)/src/inc/afs.h
Xsighand.o: $(BASE)/src/inc/afsys.h
Xsighand.o: ./afsapp.h
Xsighand.o: ./typeconv.h
Xsighand.o: sighand.c
Xutil.o: $(BASE)/src/inc/afs.h
Xutil.o: $(BASE)/src/inc/afsys.h
Xutil.o: ./afsapp.h
Xutil.o: ./locks.h
Xutil.o: ./project.h
Xutil.o: ./typeconv.h
Xutil.o: util.c
Xvadm.o: $(BASE)/src/inc/ParseArgs.h
Xvadm.o: $(BASE)/src/inc/afs.h
Xvadm.o: $(BASE)/src/inc/afsys.h
Xvadm.o: ./afsapp.h
Xvadm.o: ./typeconv.h
Xvadm.o: ./vadm.h
Xvadm.o: vadm.c
Xvadm_delete.o: $(BASE)/src/inc/afs.h
Xvadm_delete.o: $(BASE)/src/inc/afsys.h
Xvadm_delete.o: ./afsapp.h
Xvadm_delete.o: ./locks.h
Xvadm_delete.o: ./typeconv.h
Xvadm_delete.o: ./vadm.h
Xvadm_delete.o: vadm_delete.c
Xvadm_gkeys.o: $(BASE)/src/inc/afs.h
Xvadm_gkeys.o: $(BASE)/src/inc/afsys.h
Xvadm_gkeys.o: ./afsapp.h
Xvadm_gkeys.o: ./typeconv.h
Xvadm_gkeys.o: ./vadm.h
Xvadm_gkeys.o: vadm_gkeys.c
Xvadm_note.o: $(BASE)/src/inc/afs.h
Xvadm_note.o: $(BASE)/src/inc/afsys.h
Xvadm_note.o: ./afsapp.h
Xvadm_note.o: ./locks.h
Xvadm_note.o: ./typeconv.h
Xvadm_note.o: ./vadm.h
Xvadm_note.o: ./vc_sysdep.h
Xvadm_note.o: vadm_note.c
Xvadm_promote.o: $(BASE)/src/inc/afs.h
Xvadm_promote.o: $(BASE)/src/inc/afsys.h
Xvadm_promote.o: ./afsapp.h
Xvadm_promote.o: ./locks.h
Xvadm_promote.o: ./typeconv.h
Xvadm_promote.o: ./vadm.h
Xvadm_promote.o: vadm_promote.c
Xvadm_reserve.o: $(BASE)/src/inc/afs.h
Xvadm_reserve.o: $(BASE)/src/inc/afsys.h
Xvadm_reserve.o: ./afsapp.h
Xvadm_reserve.o: ./locks.h
Xvadm_reserve.o: ./typeconv.h
Xvadm_reserve.o: ./vadm.h
Xvadm_reserve.o: vadm_reserve.c
Xvadm_symname.o: $(BASE)/src/inc/afs.h
Xvadm_symname.o: $(BASE)/src/inc/afsys.h
Xvadm_symname.o: ./afsapp.h
Xvadm_symname.o: ./project.h
Xvadm_symname.o: ./typeconv.h
Xvadm_symname.o: ./vadm.h
Xvadm_symname.o: vadm_symname.c
Xvadm_utils.o: $(BASE)/src/inc/afs.h
Xvadm_utils.o: $(BASE)/src/inc/afsys.h
Xvadm_utils.o: ./afsapp.h
Xvadm_utils.o: ./typeconv.h
Xvadm_utils.o: ./vadm.h
Xvadm_utils.o: ./vadmdefs.h
Xvadm_utils.o: vadm_utils.c
Xvc_call.o: ./afsapp.h
Xvc_call.o: ./typeconv.h
Xvc_call.o: vc_call.c
Xvc_files.o: $(BASE)/src/inc/afs.h
Xvc_files.o: $(BASE)/src/inc/afsys.h
Xvc_files.o: ./afsapp.h
Xvc_files.o: ./locks.h
Xvc_files.o: ./typeconv.h
Xvc_files.o: ./vc_sysdep.h
Xvc_files.o: vc_files.c
Xvc_keyboardIo.o: ./afsapp.h
Xvc_keyboardIo.o: ./typeconv.h
Xvc_keyboardIo.o: vc_keyboardIo.c
Xvc_lock.o: $(BASE)/src/inc/afs.h
Xvc_lock.o: $(BASE)/src/inc/afsys.h
Xvc_lock.o: ./afsapp.h
Xvc_lock.o: ./typeconv.h
Xvc_lock.o: vc_lock.c
Xvl.o: $(BASE)/src/inc/ParseArgs.h
Xvl.o: ./afsapp.h
Xvl.o: ./typeconv.h
Xvl.o: ./vl.h
Xvl.o: vl.c
Xvldovl.o: $(BASE)/src/inc/afs.h
Xvldovl.o: $(BASE)/src/inc/afsys.h
Xvldovl.o: ./afsapp.h
Xvldovl.o: ./typeconv.h
Xvldovl.o: ./vl.h
Xvldovl.o: vldovl.c
Xvlmisc.o: $(BASE)/src/inc/afs.h
Xvlmisc.o: $(BASE)/src/inc/afsys.h
Xvlmisc.o: ./afsapp.h
Xvlmisc.o: ./typeconv.h
Xvlmisc.o: ./vl.h
Xvlmisc.o: vlmisc.c
Xvlopt.o: $(BASE)/src/inc/ParseArgs.h
Xvlopt.o: ./afsapp.h
Xvlopt.o: ./typeconv.h
Xvlopt.o: ./vl.h
Xvlopt.o: vlopt.c
END_OF_FILE
if test 9367 -ne `wc -c <'src/vc/Makefile'`; then
    echo shar: \"'src/vc/Makefile'\" unpacked with wrong size!
fi
# end of 'src/vc/Makefile'
fi
echo shar: End of archive 11 \(of 33\).
cp /dev/null ark11isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 33 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.