[comp.sources.bugs] nntp 1.5.9 patch kit part 2 of 3

nntp@lib.tmc.edu (Stan Barber) (07/10/90)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	doc
#	inews
#	xfer
#	xmit
# This archive created: Tue Jul 10 00:04:52 1990
export PATH; PATH=/bin:$PATH
if test ! -d 'doc'
then
	echo shar: creating directory "'doc'"
	mkdir 'doc'
fi
echo shar: entering directory "'doc'"
cd 'doc'
echo shar: extracting "'doc.diff'" '(6686 characters)'
if test -f 'doc.diff'
then
	echo shar: will not over-write existing file "'doc.diff'"
else
sed 's/^	X//' << \SHAR_EOF > 'doc.diff'
	XIndex: Makefile
	X*** Makefile	Sun Feb  7 01:36:35 1988
	X--- ../../nntp/doc/Makefile	Sun Jul  8 03:07:57 1990
	X***************
	X*** 1,7
	X  #
	X  # Makefile for manual pages for nntp service
	X  #
	X! # Created by Stan Barber; Mon Apr  6 13:25:27 CDT 1987
	X  #
	X  
	X  # change these to suit your system
	X
	X--- 1,7 -----
	X  #
	X  # Makefile for manual pages for nntp service
	X  #
	X! # $Header: Makefile,v 1.3 90/07/08 03:07:56 sob Exp $
	X  #
	X  
	X  # change these to suit your system
	X***************
	X*** 12,18
	X  # from here down should be constant
	X  SHELL	= /bin/sh
	X  MACROS	= -man
	X! MANPAGES= nntpd.8c mkgrdates.8c getactive.1
	X  EXTRACT	= ./config.sh
	X  
	X  all: $(MANPAGES)
	X
	X--- 12,18 -----
	X  # from here down should be constant
	X  SHELL	= /bin/sh
	X  MACROS	= -man
	X! MANPAGES= nntpd.8c mkgrdates.8c getactive.1 nntpxmit.1
	X  EXTRACT	= ./config.sh
	X  
	X  all: $(MANPAGES)
	X***************
	X*** 27,32
	X  getactive.1: getactive.dst $(EXTRACT)
	X  	$(EXTRACT) getactive.dst getactive.1
	X  
	X  install: $(MANPAGES)
	X  	mv nntpd.8c $(MANDIR)/man8/nntpd.8c
	X  	mv mkgrdates.8c $(MANDIR)/man8/mkgrdates.8c
	X
	X--- 27,35 -----
	X  getactive.1: getactive.dst $(EXTRACT)
	X  	$(EXTRACT) getactive.dst getactive.1
	X  
	X+ nntpxmit.1: nntpxmit.dst $(EXTRACT)
	X+ 	$(EXTRACT) nntpxmit.dst nntpxmit.1
	X+ 
	X  install: $(MANPAGES)
	X  	mv nntpd.8c $(MANDIR)/man8/nntpd.8c
	X  	mv mkgrdates.8c $(MANDIR)/man8/mkgrdates.8c
	X***************
	X*** 37,42
	X  	$(ROFF) $(MACROS) -P$(PRINTER) nntpd.8c
	X  	$(ROFF) $(MACROS) -P$(PRINTER) mkgrdates.8c
	X  	$(ROFF) $(MACROS) -P$(PRINTER) getactive.1
	X  
	X  clean:
	X  	-rm -f $(MANPAGES)
	X
	X--- 40,46 -----
	X  	$(ROFF) $(MACROS) -P$(PRINTER) nntpd.8c
	X  	$(ROFF) $(MACROS) -P$(PRINTER) mkgrdates.8c
	X  	$(ROFF) $(MACROS) -P$(PRINTER) getactive.1
	X+ 	$(ROFF) $(MACROS) -P$(PRINTER) nntpxmit.1
	X  
	X  clean:
	X  	-rm -f $(MANPAGES)
	XIndex: nntpd.dst
	XPrereq: 1.4
	X*** nntpd.dst	Fri Mar  9 22:41:01 1990
	X--- ../../nntp/doc/nntpd.dst	Thu Jul  5 02:20:45 1990
	X***************
	X*** 1,5
	X  .\"
	X! .\" @(#)nntpd.dst	1.4	(Berkeley) 5/11/89
	X  .\"
	X  .TH NNTPD 8C "12 March 1990"
	X  .UC 4
	X
	X--- 1,5 -----
	X  .\"
	X! .\" @(#)$Header: nntpd.dst,v 1.5 90/07/05 02:20:42 sob Exp $
	X  .\"
	X  .TH NNTPD 8C "4 July 1990"
	X  .UC 4
	X***************
	X*** 1,7
	X  .\"
	X  .\" @(#)nntpd.dst	1.4	(Berkeley) 5/11/89
	X  .\"
	X! .TH NNTPD 8C "12 March 1990"
	X  .UC 4
	X  .SH NAME
	X  nntpd \- Network News Transfer Protocol server
	X
	X--- 1,7 -----
	X  .\"
	X  .\" @(#)$Header: nntpd.dst,v 1.5 90/07/05 02:20:42 sob Exp $
	X  .\"
	X! .TH NNTPD 8C "4 July 1990"
	X  .UC 4
	X  .SH NAME
	X  nntpd \- Network News Transfer Protocol server
	X***************
	X*** 35,41
	X  .sp
	X  This manual page describes
	X  .I nntpd
	X! from version 1.5.8 of the NNTP package.
	X  .PP
	X  .I Nntpd
	X  can operate either as a stand-alone server, or as a
	X
	X--- 35,41 -----
	X  .sp
	X  This manual page describes
	X  .I nntpd
	X! from version 1.5.9 of the NNTP package.
	X  .PP
	X  .I Nntpd
	X  can operate either as a stand-alone server, or as a
	X***************
	X*** 40,46
	X  .I Nntpd
	X  can operate either as a stand-alone server, or as a
	X  server under
	X! .IR inetd (1).
	X  For stand-alone use,
	X  .I nntpd
	X  must be compiled with the -DALONE option, and is
	X
	X--- 40,46 -----
	X  .I Nntpd
	X  can operate either as a stand-alone server, or as a
	X  server under
	X! .IR inetd (8C).
	X  For stand-alone use,
	X  .I nntpd
	X  must be compiled with the -DALONE option, and is
	X***************
	X*** 48,54
	X  .IR /etc/rc.local 
	X  script.
	X  Under
	X! .IR inetd (1),
	X  the appropriate entry must be made in
	X  .IR INETDCONFIG ,
	X  and the server must be compiled without the
	X
	X--- 48,54 -----
	X  .IR /etc/rc.local 
	X  script.
	X  Under
	X! .IR inetd (8C),
	X  the appropriate entry must be made in
	X  .IR INETDCONFIG ,
	X  and the server must be compiled without the
	X***************
	X*** 53,59
	X  .IR INETDCONFIG ,
	X  and the server must be compiled without the
	X  -DALONE flag. You may need to halt and restart 
	X! .IR inetd (1)
	X  or send it SIGHUP to force it to reread
	X  .IR INETDCONFIG .
	X  .PP
	X
	X--- 53,59 -----
	X  .IR INETDCONFIG ,
	X  and the server must be compiled without the
	X  -DALONE flag. You may need to halt and restart 
	X! .IR inetd (8C)
	X  or send it SIGHUP to force it to reread
	X  .IR INETDCONFIG .
	X  .PP
	X***************
	X*** 83,89
	X  This file consists of three or four fields in the following form:
	X  .sp
	X  .nf
	X! host/net/*domain.suffix/address   read/xfer/no  post/no  newsgroups
	X  .fi
	X  .sp
	X  where
	X
	X--- 83,89 -----
	X  This file consists of three or four fields in the following form:
	X  .sp
	X  .nf
	X! host/net/*domain.suffix/address   read/xfer/both/no  post/no  newsgroups
	X  .fi
	X  .sp
	X  where
	X***************
	X*** 100,105
	X  is a valid internet address in the form of a dotted quad, and
	X  .I ``read'',
	X  .I ``xfer'',
	X  .I ``post'',
	X  and
	X  .I ``no''
	X
	X--- 100,106 -----
	X  is a valid internet address in the form of a dotted quad, and
	X  .I ``read'',
	X  .I ``xfer'',
	X+ .I ``both'',
	X  .I ``post'',
	X  and
	X  .I ``no''
	X***************
	X*** 126,132
	X  specifies the read access of the host/net in
	X  question.
	X  If the entry is ``read,'' matching
	X! hosts can both read and transfer news.
	X  If the entry is ``xfer,'' however,
	X  matching hosts can only execute commands
	X  used for transferring news, such as
	X
	X--- 127,134 -----
	X  specifies the read access of the host/net in
	X  question.
	X  If the entry is ``read,'' matching
	X! hosts can read news. This means that all commands but IHAVE and POST can
	X! be executed.
	X  If the entry is ``xfer,'' however,
	X  matching hosts can only execute commands
	X  used for transferring news, such as
	X***************
	X*** 131,136
	X  matching hosts can only execute commands
	X  used for transferring news, such as
	X  NEWNEWS, NEWGROUPS, IHAVE, and ARTICLE with message-id parameters.
	X  The string ``no'' denies read permission
	X  of any kind to a matching host.
	X  .PP
	X
	X--- 133,140 -----
	X  matching hosts can only execute commands
	X  used for transferring news, such as
	X  NEWNEWS, NEWGROUPS, IHAVE, and ARTICLE with message-id parameters.
	X+ If the entry is ``both,'' ths host can
	X+ execute all commands but POST.
	X  The string ``no'' denies read permission
	X  of any kind to a matching host.
	X  .PP
	X***************
	X*** 174,180
	X  The above file allows only transfer of news (i.e., no reading or posting)
	X  by default.
	X  Hosts on the network ``ucb-ether'' would be able to
	X! read and post news.
	X  The host ``shadow'' would not be allowed
	X  to read or post news.
	X  Hosts that have a domain suffix of ``.stanford.edu'' are denied access
	X
	X--- 178,184 -----
	X  The above file allows only transfer of news (i.e., no reading or posting)
	X  by default.
	X  Hosts on the network ``ucb-ether'' would be able to
	X! read and post news, however news transfer would not be allowed.
	X  The host ``shadow'' would not be allowed
	X  to read or post news.
	X  Hosts that have a domain suffix of ``.stanford.edu'' are denied access
SHAR_EOF
if test 6686 -ne "`wc -c < 'doc.diff'`"
then
	echo shar: error transmitting "'doc.diff'" '(should have been 6686 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'nntpxmit.dst'" '(5838 characters)'
if test -f 'nntpxmit.dst'
then
	echo shar: will not over-write existing file "'nntpxmit.dst'"
else
sed 's/^	X//' << \SHAR_EOF > 'nntpxmit.dst'
	X.TH NNTPXMIT 1 netnews/NNTP
	X.SH NAME
	X.I nntpxmit
	X\- transmit netnews articles to a remote NNTP server
	X.SH SYNOPSIS
	X.I nntpxmit
	X[
	X.B \-a
	X]
	X[
	X.B \-d
	X]
	X[
	X.B \-s
	X]
	X[
	X.B \-r
	X]
	X[
	X.B \-T
	X]
	X[
	X.B \-F
	X]
	X[
	X.B \-D
	X] hostname|hostname:file [...]
	X.SH DESCRIPTION
	X.PP
	X.I Nntpxmit
	Xoffers netnews articles [RFC850] named in a queue file (a file of
	Xfilenames) to a remote NNTP (Network News Transfer Protocol,
	X[RFC977]) server, transmitting those articles that the remote server
	Xindicates that it does not already have.
	X.PP
	XThe command line arguments a processed sequentially, and the flags
	Xcan thus be toggled several times during one invocation of the
	Xprogram, by giving the options more than once.
	XThe options are:
	X.IP hostname|hostname:file
	XThe name of the remote host, and the name of the queue file of
	Xarticles destined for that host.
	XThe hostname may be an internet address in dotted
	Xformat (e.g. 10.2.0.78, [10.0.0.78]).
	XIf the hostname is given without an associated file, it is assumed
	Xthat the hostname is also the name of the queue file.
	XIf the separator is "::" instead of ":", it is assumed that the
	Xremote host speaks DECNET, instead of the default, IP/TCP.
	X.IP -s
	XToggles reporting of transfer statistics (how many articles we
	Xoffered them, how many they accepted, etc).
	X.br
	XDefault is
	X.B ON.
	X.IP -d
	XToggles DEBUG output on stderr.
	XThis can be used to see exactly what the two systems are saying to
	Xeach other, except for the actual article text.
	X.br
	XDefault is
	X.B OFF.
	X.IP -r
	XToggles requeuing of failed articles.
	XA failed article is an article that we (client) offer them (remote server),
	Xthey accept, we transmit, and then they report that they "failed"
	Xor dropped the article (i.e. inews(1) on the remote returned non-zero).
	XIf we have requeuing set, we save the list of articles that they
	Xfailed on, and rewrite the queue file with them, so that they get
	Xreoffered the next time we initiate transmission to them.
	X.br
	XDefault is
	X.B ON.
	X.IP -a
	XThis flag says that the next queue file on the command line isn't
	Xa queue file, but is a single netnews
	Xarticle to be transmitted to the remote in a single operation.
	X.IP
	X.B NOTE:
	Xthis option causes
	X.I nntpxmit
	Xto exit immediately after this transfer is done (regardless of
	Xwhatever else is on the command line), and to exit with a code
	Xindicating whether the articles was successfully accepted by the
	Xremote server (zero exit for success, non-zero for failure).
	X.PP
	XThe next options set the underlying transport protocol that
	X.I nntpxmit
	Xuses.
	XThe NNTP specification assumes a TCP-style transport protocol
	Xunderlies it (i.e. a reliable, flow-controlled, full-duplex byte
	Xstream).
	X.I Nntpxmit
	Xassumes that after doing some magic to get a descriptor, 
	Xit can do read(2) and write(2) calls (and use stdio) to move data
	Xand check for errors.
	XBy default, 
	X.I nntpxmit
	Xwill use IP/TCP (DoD Internet Protocol suite).
	X.IP -T
	XSets transport protocol to IP/TCP for all remaining
	Xtransfers (unless reset by other transport flags).
	XDefault transport.
	X.IP -D
	XSets transport protocol to DECNET for all remaining
	Xtransfers (unless reset by other transport flags).
	X.B NOTE:
	Xusing "::" as the hostname/queue filename separator has the
	Xsame effect.
	X.IP -F
	XThis says that the hostname is a file descriptor number, already
	Xopen to a remote server (with some reliable protocol underneath)
	Xthat was passed to
	X.I nntpxmit
	Xthrough a fork(2).
	X.SH "THEORY OF OPERATION"
	X.PP
	X.I Nntpxmit
	Ximplements an interactive ihave/sendme transmission system.
	XRoughly, the protocol is
	X.IP 1.
	Xopen the article,
	Xfetch out the message-id (required on all netnews articles),
	Xand send the command IHAVE <message-id> to the remote.
	X.IP 2.
	XThe remote will then say either "I've seen it already" or "please send
	Xthat article to me."
	X.IP 3.
	XIf the response was negative,
	X.I nntpxmit
	Xloops back to step 1 and offers the next article (until queue file EOF).
	XOtherwise,
	X.I nntpxmit
	Xwill send the article, using SMTP [RFC821] text transmission conventions
	X(i.e. CRLF line terminators, and dot escaping).
	X.IP 4.
	X.I Nntpxmit
	Xwaits for the remote to say whether the article was successfully
	Xaccepted or not.
	XIf the answer is negative and requeuing of failed articles is enabled,
	X.I nntpxmit
	Xwill queue this article's filename to be
	Xwritten back to the queue file at the end of the session with this
	Xremote.
	X.PP
	XIf the communcation link should fail (and
	X.I nntpxmit
	Xdetects it through a system call error return),
	X.I nntpxmit
	Xwill rewrite the queue file with the article filenames of the
	Xarticles that it did not transmit (that is, we don't retransmit
	Xstuff we've already successfully sent and gotten back an positive
	Xconfirmation that they got it).
	X.SH FILES
	X/tmp/nntpxmitXXXXXX
	X.SH AUTHOR
	XErik E. Fair
	X.SH "SEE ALSO"
	Xinews(1),
	X.br
	XRFC977 \- Network News Transfer Protocol (NNTP),
	X.br
	XRFC850 \- USENET Article Format standard,
	X.br
	XRFC821 \- Simple Mail Transfer Protocol (SMTP),
	X.SH BUGS
	X.PP
	XAlways requeuing failed articles can lead to beating the remote to
	Xdeath with a list of articles that he can't accept for come structural
	Xreason.
	XHow many of these have to pile up before you should declare that
	Xsomething is seriously wrong with the remote system and stop trying?
	X.PP
	XWhile
	X.B nntpxmit
	Xwill lock a queue file (your version of UNIX permitting) against
	Xmultiple invocations of itself, there is no locking with inews(1),
	Xwhich is what writes the queue files in the first place.
	XTherefore, never use
	X.B nntpxmit
	Xon the queue files that inews(1) writes, because two processes
	Xwriting into the same file without some kind of cooperation will
	Xalmost certainly trash the file; move them to some other name that
	Xinews(1) knows nothing about, so that you won't lose articles to
	Xraces between inews and nntpxmit.
	X.PP
	XAdding inews(1) compatible locking to the C code would be much more
	Xtrouble than it's worth, and violates the KISS principle besides.
SHAR_EOF
if test 5838 -ne "`wc -c < 'nntpxmit.dst'`"
then
	echo shar: error transmitting "'nntpxmit.dst'" '(should have been 5838 characters)'
fi
fi # end of overwriting check
echo shar: done with directory "'doc'"
cd ..
if test ! -d 'inews'
then
	echo shar: creating directory "'inews'"
	mkdir 'inews'
fi
echo shar: entering directory "'inews'"
cd 'inews'
echo shar: extracting "'inews.diff'" '(12508 characters)'
if test -f 'inews.diff'
then
	echo shar: will not over-write existing file "'inews.diff'"
else
sed 's/^	X//' << \SHAR_EOF > 'inews.diff'
	XIndex: Makefile
	X*** Makefile	Sun Mar 11 16:55:56 1990
	X--- ../../nntp/inews/Makefile	Sun Jul  8 02:46:58 1990
	X***************
	X*** 2,9
	X  # Makefile for pseudo-inews
	X  #
	X  
	X! SRCS	=	inews.c uname.c ../common/clientlib.c ../common/version.c
	X! OBJS	=	inews.o uname.o ../common/clientlib.o ../common/version.o
	X  HFILES	=	../common/nntp.h ../common/conf.h
	X  
	X  CFLAGS	= -O
	X
	X--- 2,9 -----
	X  # Makefile for pseudo-inews
	X  #
	X  
	X! SRCS	=	inews.c uname.c postauth.c ../common/clientlib.c ../common/version.c ../server/strcasecmp.c
	X! OBJS	=	inews.o uname.o postauth.o ../common/clientlib.o ../common/version.o ../server/strcasecmp.o
	X  HFILES	=	../common/nntp.h ../common/conf.h
	X  
	X  CFLAGS	= -O
	X***************
	X*** 15,21
	X  inews:  $(OBJS) $(HFILES)
	X  	$(CC) $(CFLAGS) $(OBJS) -o inews $(LIBS)
	X  
	X! uname.o: ../common/conf.h
	X  
	X  ../common/clientlib.o:
	X  	${CC} ${CFLAGS} -DNNTPSRC -c ../common/clientlib.c
	X
	X--- 15,21 -----
	X  inews:  $(OBJS) $(HFILES)
	X  	$(CC) $(CFLAGS) $(OBJS) -o inews $(LIBS)
	X  
	X! uname.o: uname.c ../common/conf.h
	X  
	X  inews.o: inews.c ../common/conf.h
	X  
	X***************
	X*** 17,22
	X  
	X  uname.o: ../common/conf.h
	X  
	X  ../common/clientlib.o:
	X  	${CC} ${CFLAGS} -DNNTPSRC -c ../common/clientlib.c
	X  	mv clientlib.o ../common/clientlib.o
	X
	X--- 17,24 -----
	X  
	X  uname.o: uname.c ../common/conf.h
	X  
	X+ inews.o: inews.c ../common/conf.h
	X+ 
	X  ../common/clientlib.o:
	X  	${CC} ${CFLAGS} -DNNTPSRC -c ../common/clientlib.c
	X  	mv clientlib.o ../common/clientlib.o
	X***************
	X*** 24,29
	X  ../common/version.o:
	X  	${CC} ${CFLAGS} -c ../common/version.c
	X  	mv version.o ../common/version.o
	X  
	X  install: inews
	X  	cp inews ${DESTDIR}/inews
	X
	X--- 26,35 -----
	X  ../common/version.o:
	X  	${CC} ${CFLAGS} -c ../common/version.c
	X  	mv version.o ../common/version.o
	X+ 
	X+ ../server/strcasecmp.o:
	X+ 	${CC} ${CFLAGS} -c ../server/strcasecmp.c
	X+ 	mv strcasecmp.o ../server/strcasecmp.o
	X  
	X  install: inews
	X  	cp inews ${DESTDIR}/inews
	XIndex: inews.c
	XPrereq: 1.16
	X*** inews.c	Sun Jan 14 13:41:31 1990
	X--- ../../nntp/inews/inews.c	Sun Jul  8 01:00:01 1990
	X***************
	X*** 1,5
	X  #ifndef lint
	X! static char *sccsid = "@(#)inews.c	1.16	(Berkeley) 8/27/89";
	X  #endif
	X  
	X  /*
	X
	X--- 1,5 -----
	X  #ifndef lint
	X! static char *sccsid = "@(#)$Header: inews.c,v 1.18 90/07/08 00:59:48 sob Exp $";
	X  #endif
	X  
	X  /*
	X***************
	X*** 25,30
	X  #else not USG
	X  #include <strings.h>
	X  #endif not USG
	X  
	X  #define	MAX_SIGNATURE	4
	X  
	X
	X--- 25,33 -----
	X  #else not USG
	X  #include <strings.h>
	X  #endif not USG
	X+ /* for gen_frompath() */
	X+ #define FROM 1
	X+ #define PATH 2
	X  
	X  #define	MAX_SIGNATURE	4
	X  
	X***************
	X*** 29,34
	X  #define	MAX_SIGNATURE	4
	X  
	X  extern	FILE	*ser_wr_fp;
	X  
	X  char	host_name[256];
	X  
	X
	X--- 32,38 -----
	X  #define	MAX_SIGNATURE	4
	X  
	X  extern	FILE	*ser_wr_fp;
	X+ extern	char	*getlogin();
	X  
	X  #ifdef AUTH
	X  FILE *passfile;
	X***************
	X*** 30,35
	X  
	X  extern	FILE	*ser_wr_fp;
	X  
	X  char	host_name[256];
	X  
	X  main(argc, argv)
	X
	X--- 34,43 -----
	X  extern	FILE	*ser_wr_fp;
	X  extern	char	*getlogin();
	X  
	X+ #ifdef AUTH
	X+ FILE *passfile;
	X+ #endif AUTH
	X+ 
	X  char	host_name[256];
	X  struct	passwd *passwd;
	X  
	X***************
	X*** 31,36
	X  extern	FILE	*ser_wr_fp;
	X  
	X  char	host_name[256];
	X  
	X  main(argc, argv)
	X  int	argc;
	X
	X--- 39,45 -----
	X  #endif AUTH
	X  
	X  char	host_name[256];
	X+ struct	passwd *passwd;
	X  
	X  main(argc, argv)
	X  int	argc;
	X***************
	X*** 37,43
	X  char	*argv[];
	X  {
	X  	char	line[NNTP_STRLEN], s[NNTP_STRLEN];
	X! 	int	seen_fromline, in_header, seen_header;
	X  	int	response;
	X  	char	*server;
	X  	char	*getserverbyfile();
	X
	X--- 46,52 -----
	X  char	*argv[];
	X  {
	X  	char	line[NNTP_STRLEN], s[NNTP_STRLEN];
	X! 	int	seen_fromline, in_header, seen_header, seen_pathline;
	X  	int	response;
	X  	char	*server;
	X  	char	*getserverbyfile();
	X***************
	X*** 42,47
	X  	char	*server;
	X  	char	*getserverbyfile();
	X  	register char	*cp;
	X  
	X  	++argv;
	X  	while (argc > 1)
	X
	X--- 51,57 -----
	X  	char	*server;
	X  	char	*getserverbyfile();
	X  	register char	*cp;
	X+ 	char 	*username;
	X  
	X  	/* find out who they REALLY are */
	X  	username = getlogin();
	X***************
	X*** 43,48
	X  	char	*getserverbyfile();
	X  	register char	*cp;
	X  
	X  	++argv;
	X  	while (argc > 1)
	X  		if (*argv[0] == '-') {
	X
	X--- 53,79 -----
	X  	register char	*cp;
	X  	char 	*username;
	X  
	X+ 	/* find out who they REALLY are */
	X+ 	username = getlogin();
	X+ 	if (username)
	X+ 		passwd = getpwnam(username);
	X+ 	else
	X+ 		{
	X+ 		passwd = getpwuid(getuid());
	X+ 		username = passwd->pw_name;
	X+ 		}
	X+ 
	X+ #ifdef AUTH
	X+ 	/*
	X+ 	 * we have to be setuid to news to open the file, but not afterwards
	X+ 	 */
	X+ 	passfile = fopen(PASSFILE, "r");
	X+ #ifndef USG	/* this call does not exist on USG */
	X+ 	seteuid(getuid());
	X+ 	setegid(getgid());
	X+ #endif
	X+ #endif AUTH
	X+ 
	X  	++argv;
	X  	while (argc > 1)
	X  		if (*argv[0] == '-') {
	X***************
	X*** 83,88
	X  		exit(1);
	X  	}
	X  
	X  	put_server("POST");
	X  	(void) get_server(line, sizeof(line));
	X  	if (*line != CHAR_CONT) {
	X
	X--- 114,120 -----
	X  		exit(1);
	X  	}
	X  
	X+ again:
	X  	put_server("POST");
	X  	(void) get_server(line, sizeof(line));
	X  	if (*line != CHAR_CONT) {
	X***************
	X*** 91,100
	X  			fprintf(stderr,
	X  				"Sorry, you can't post from this machine.\n");
	X  			exit(1);
	X- 		} else {
	X- 			close_server();
	X- 		        fprintf(stderr, "Remote error: %s\n", line);
	X- 			exit(1);
	X  		}
	X  	}
	X  
	X
	X--- 123,128 -----
	X  			fprintf(stderr,
	X  				"Sorry, you can't post from this machine.\n");
	X  			exit(1);
	X  		}
	X  #ifdef AUTH
	X  		if (atoi(line) == ERR_NOAUTH) {
	X***************
	X*** 96,101
	X  		        fprintf(stderr, "Remote error: %s\n", line);
	X  			exit(1);
	X  		}
	X  	}
	X  
	X  	in_header = 1;
	X
	X--- 124,138 -----
	X  				"Sorry, you can't post from this machine.\n");
	X  			exit(1);
	X  		}
	X+ #ifdef AUTH
	X+ 		if (atoi(line) == ERR_NOAUTH) {
	X+ 			postauth(server);
	X+ 			goto again;
	X+ 		}
	X+ #endif
	X+ 		close_server();
	X+ 		fprintf(stderr, "Remote error: %s\n", line);
	X+ 		exit(1);
	X  	}
	X  
	X  	in_header = 1;
	X***************
	X*** 109,114
	X  	                seen_header = 1;
	X  			seen_fromline = 1;
	X  		}
	X  		if (in_header && s[0] == '\0') {
	X  	                if (seen_header) {
	X  		                in_header = 0;
	X
	X--- 146,155 -----
	X  	                seen_header = 1;
	X  			seen_fromline = 1;
	X  		}
	X+ 		if (in_header && strneql(s, "Path:", sizeof("Path:")-1)) {
	X+ 	                seen_header = 1;
	X+ 			seen_pathline = 1;
	X+ 		}
	X  		if (in_header && s[0] == '\0') {
	X  	                if (seen_header) {
	X  		                in_header = 0;
	X***************
	X*** 112,119
	X  		if (in_header && s[0] == '\0') {
	X  	                if (seen_header) {
	X  		                in_header = 0;
	X! 			        if (!seen_fromline)
	X! 				        gen_frompath();
	X  			} else {
	X  			        continue;
	X  			}
	X
	X--- 153,164 -----
	X  		if (in_header && s[0] == '\0') {
	X  	                if (seen_header) {
	X  		                in_header = 0;
	X! 				if (!seen_pathline)
	X! 					gen_frompath(PATH);
	X! 				if (!seen_fromline)
	X! 					gen_frompath(FROM);
	X! 				else
	X! fprintf(ser_wr_fp, "Originator: %s@%s\r\n", passwd->pw_name, host_name);
	X  			} else {
	X  			        continue;
	X  			}
	X***************
	X*** 125,131
	X  		}
	X  		fprintf(ser_wr_fp, "%s\r\n", s);
	X  	}
	X! 
	X  	append_signature();
	X  
	X  	fprintf(ser_wr_fp, ".\r\n");
	X
	X--- 170,176 -----
	X  		}
	X  		fprintf(ser_wr_fp, "%s\r\n", s);
	X  	}
	X!   
	X  	append_signature();
	X  
	X  	fprintf(ser_wr_fp, ".\r\n");
	X***************
	X*** 205,211
	X    fprintf(stderr,"sigfile opened OK\n");
	X  #endif
	X  
	X! 	fprintf(ser_wr_fp, "--\r\n");
	X  	while (fgets(line, sizeof (line), fp)) {
	X  		count++;
	X  		if (count > MAX_SIGNATURE) {
	X
	X--- 250,256 -----
	X    fprintf(stderr,"sigfile opened OK\n");
	X  #endif
	X  
	X! 	fprintf(ser_wr_fp, "-- \r\n");
	X  	while (fgets(line, sizeof (line), fp)) {
	X  		count++;
	X  		if (count > MAX_SIGNATURE) {
	X***************
	X*** 238,244
	X   * a From: line in it.
	X   */
	X  
	X! gen_frompath()
	X  {
	X  	char	*full_name;
	X  	char	*cp;
	X
	X--- 283,290 -----
	X   * a From: line in it.
	X   */
	X  
	X! gen_frompath(which)
	X! int which;
	X  {
	X  	char	*full_name;
	X  	char	*cp;
	X***************
	X*** 254,259
	X  			*cp = '\0';
	X  	}
	X  
	X  #ifdef DOMAIN
	X  #ifdef HIDDENNET
	X  		fprintf(ser_wr_fp, "From: %s@%s (",
	X
	X--- 300,306 -----
	X  			*cp = '\0';
	X  	}
	X  
	X+ 	if (which == FROM){
	X  #ifdef DOMAIN
	X  #ifdef HIDDENNET
	X  			fprintf(ser_wr_fp, "From: %s@%s (",
	X***************
	X*** 256,264
	X  
	X  #ifdef DOMAIN
	X  #ifdef HIDDENNET
	X! 		fprintf(ser_wr_fp, "From: %s@%s (",
	X! 			passwd->pw_name,
	X! 			DOMAIN);
	X  #else /* HIDDENNET */
	X  
	X  	/* A heuristic to see if we should tack on a domain */
	X
	X--- 303,311 -----
	X  	if (which == FROM){
	X  #ifdef DOMAIN
	X  #ifdef HIDDENNET
	X! 			fprintf(ser_wr_fp, "From: %s@%s (",
	X! 				passwd->pw_name,
	X! 				DOMAIN);
	X  #else /* HIDDENNET */
	X  
	X  		/* A heuristic to see if we should tack on a domain */
	X***************
	X*** 261,267
	X  			DOMAIN);
	X  #else /* HIDDENNET */
	X  
	X! 	/* A heuristic to see if we should tack on a domain */
	X  
	X  	cp = index(host_name, '.');
	X  	if (cp)
	X
	X--- 308,314 -----
	X  				DOMAIN);
	X  #else /* HIDDENNET */
	X  
	X! 		/* A heuristic to see if we should tack on a domain */
	X  
	X  		cp = index(host_name, '.');
	X  		if (cp)
	X***************
	X*** 263,270
	X  
	X  	/* A heuristic to see if we should tack on a domain */
	X  
	X! 	cp = index(host_name, '.');
	X! 	if (cp)
	X  		fprintf(ser_wr_fp, "From: %s@%s (",
	X  			passwd->pw_name,
	X  			host_name);
	X
	X--- 310,327 -----
	X  
	X  		/* A heuristic to see if we should tack on a domain */
	X  
	X! 		cp = index(host_name, '.');
	X! 		if (cp)
	X! 			fprintf(ser_wr_fp, "From: %s@%s (",
	X! 				passwd->pw_name,
	X! 				host_name);
	X! 		else
	X! 			fprintf(ser_wr_fp, "From: %s@%s.%s (",
	X! 				passwd->pw_name,
	X! 				host_name,
	X! 				DOMAIN);
	X! #endif /* HIDDENNET */
	X! #else
	X  		fprintf(ser_wr_fp, "From: %s@%s (",
	X  			passwd->pw_name,
	X  			host_name);
	X***************
	X*** 268,283
	X  		fprintf(ser_wr_fp, "From: %s@%s (",
	X  			passwd->pw_name,
	X  			host_name);
	X- 	else
	X- 		fprintf(ser_wr_fp, "From: %s@%s.%s (",
	X- 			passwd->pw_name,
	X- 			host_name,
	X- 			DOMAIN);
	X- #endif /* HIDDENNET */
	X- #else
	X- 	fprintf(ser_wr_fp, "From: %s@%s (",
	X- 		passwd->pw_name,
	X- 		host_name);
	X  #endif
	X  
	X  	for (cp = full_name; *cp != '\0'; ++cp)
	X
	X--- 325,330 -----
	X  		fprintf(ser_wr_fp, "From: %s@%s (",
	X  			passwd->pw_name,
	X  			host_name);
	X  #endif
	X  
	X  		for (cp = full_name; *cp != '\0'; ++cp)
	X***************
	X*** 280,295
	X  		host_name);
	X  #endif
	X  
	X! 	for (cp = full_name; *cp != '\0'; ++cp)
	X! 		if (*cp != '&')
	X! 			putc(*cp, ser_wr_fp);
	X! 		else {		/* Stupid & hack.  God damn it. */
	X! 			putc(toupper(passwd->pw_name[0]), ser_wr_fp);
	X! 			fprintf(ser_wr_fp, passwd->pw_name+1);
	X! 		}
	X! 
	X! 	fprintf(ser_wr_fp, ")\r\n");
	X! 
	X  #ifdef HIDDENNET
	X  	/* Only the login name - nntp server will add uucp name */
	X  	fprintf(ser_wr_fp, "Path: %s\r\n", passwd->pw_name);
	X
	X--- 327,342 -----
	X  			host_name);
	X  #endif
	X  
	X! 		for (cp = full_name; *cp != '\0'; ++cp)
	X! 			if (*cp != '&')
	X! 				putc(*cp, ser_wr_fp);
	X! 			else {		/* Stupid & hack.  God damn it. */
	X! 				putc(toupper(passwd->pw_name[0]), ser_wr_fp);
	X! 				fprintf(ser_wr_fp, passwd->pw_name+1);
	X! 			}
	X! 		fprintf(ser_wr_fp, ")\r\n");
	X! 	}
	X! 	if (which == PATH){
	X  #ifdef HIDDENNET
	X  	/* Only the login name - nntp server will add uucp name */
	X  		fprintf(ser_wr_fp, "Path: %s\r\n", passwd->pw_name);
	X***************
	X*** 292,298
	X  
	X  #ifdef HIDDENNET
	X  	/* Only the login name - nntp server will add uucp name */
	X! 	fprintf(ser_wr_fp, "Path: %s\r\n", passwd->pw_name);
	X  #else /* HIDDENNET */
	X  	fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name, passwd->pw_name);
	X  #endif /* HIDDENNET */
	X
	X--- 339,345 -----
	X  	if (which == PATH){
	X  #ifdef HIDDENNET
	X  	/* Only the login name - nntp server will add uucp name */
	X! 		fprintf(ser_wr_fp, "Path: %s\r\n", passwd->pw_name);
	X  #else /* HIDDENNET */
	X  		fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name,
	X  			passwd->pw_name);
	X***************
	X*** 294,300
	X  	/* Only the login name - nntp server will add uucp name */
	X  	fprintf(ser_wr_fp, "Path: %s\r\n", passwd->pw_name);
	X  #else /* HIDDENNET */
	X! 	fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name, passwd->pw_name);
	X  #endif /* HIDDENNET */
	X  }
	X  
	X
	X--- 341,348 -----
	X  	/* Only the login name - nntp server will add uucp name */
	X  		fprintf(ser_wr_fp, "Path: %s\r\n", passwd->pw_name);
	X  #else /* HIDDENNET */
	X! 		fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name,
	X! 			passwd->pw_name);
	X  #endif /* HIDDENNET */
	X  	}
	X  }
	X***************
	X*** 296,301
	X  #else /* HIDDENNET */
	X  	fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name, passwd->pw_name);
	X  #endif /* HIDDENNET */
	X  }
	X  
	X  
	X
	X--- 344,350 -----
	X  		fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name,
	X  			passwd->pw_name);
	X  #endif /* HIDDENNET */
	X+ 	}
	X  }
	X  
	X  
SHAR_EOF
if test 12508 -ne "`wc -c < 'inews.diff'`"
then
	echo shar: error transmitting "'inews.diff'" '(should have been 12508 characters)'
fi
fi # end of overwriting check
echo shar: done with directory "'inews'"
cd ..
if test ! -d 'xfer'
then
	echo shar: creating directory "'xfer'"
	mkdir 'xfer'
fi
echo shar: entering directory "'xfer'"
cd 'xfer'
echo shar: extracting "'xfer.diff'" '(1652 characters)'
if test -f 'xfer.diff'
then
	echo shar: will not over-write existing file "'xfer.diff'"
else
sed 's/^	X//' << \SHAR_EOF > 'xfer.diff'
	XIndex: nntpxfer.c
	XPrereq: 1.5
	X*** nntpxfer.c	Tue Jan 16 01:18:59 1990
	X--- ../../nntp/xfer/nntpxfer.c	Thu Jul  5 02:04:38 1990
	X***************
	X*** 1,5
	X  #ifndef lint
	X! static char * scsid = "@(#)$Header: nntpxfer.c,v 1.5 90/01/16 01:18:32 sob Exp $";
	X  #endif
	X  /*
	X   * nntpxfer
	X
	X--- 1,5 -----
	X  #ifndef lint
	X! static char * scsid = "@(#)$Header: nntpxfer.c,v 1.6 90/07/05 02:04:28 sob Exp $";
	X  #endif
	X  /*
	X   * nntpxfer
	X***************
	X*** 60,67
	X  #endif
	X  
	X  #ifdef DBM
	X! #include <dbm.h>
	X! #endif
	X  
	X  #ifdef NDBM
	X  #include <ndbm.h>
	X
	X--- 60,70 -----
	X  #endif
	X  
	X  #ifdef DBM
	X! # undef NULL
	X! # include <dbm.h>
	X! # undef NULL
	X! # define NULL	0
	X! #endif DBM
	X  
	X  #ifdef NDBM
	X  #include <ndbm.h>
	X***************
	X*** 435,443
	X  	if (setjmp(SFGstack)) {
	X  		(void) alarm(0);	/* reset alarm clock */
	X  		(void) signal(SIGALRM, SIG_DFL);
	X- #ifdef apollo
	X- 		rd_fp->_flag |= _SIERR;
	X- #else
	X  		rd_fp->_flag |= _IOERR;	/* set stdio error */
	X  #endif
	X  #ifndef ETIMEDOUT
	X
	X--- 438,443 -----
	X  	if (setjmp(SFGstack)) {
	X  		(void) alarm(0);	/* reset alarm clock */
	X  		(void) signal(SIGALRM, SIG_DFL);
	X  		rd_fp->_flag |= _IOERR;	/* set stdio error */
	X  #ifndef ETIMEDOUT
	X  		errno = EPIPE;		/* USG doesn't have ETIMEDOUT */
	X***************
	X*** 439,445
	X  		rd_fp->_flag |= _SIERR;
	X  #else
	X  		rd_fp->_flag |= _IOERR;	/* set stdio error */
	X- #endif
	X  #ifndef ETIMEDOUT
	X  		errno = EPIPE;		/* USG doesn't have ETIMEDOUT */
	X  #else
	X
	X--- 439,444 -----
	X  		(void) alarm(0);	/* reset alarm clock */
	X  		(void) signal(SIGALRM, SIG_DFL);
	X  		rd_fp->_flag |= _IOERR;	/* set stdio error */
	X  #ifndef ETIMEDOUT
	X  		errno = EPIPE;		/* USG doesn't have ETIMEDOUT */
	X  #else
SHAR_EOF
if test 1652 -ne "`wc -c < 'xfer.diff'`"
then
	echo shar: error transmitting "'xfer.diff'" '(should have been 1652 characters)'
fi
fi # end of overwriting check
echo shar: done with directory "'xfer'"
cd ..
if test ! -d 'xmit'
then
	echo shar: creating directory "'xmit'"
	mkdir 'xmit'
fi
echo shar: entering directory "'xmit'"
cd 'xmit'
echo shar: extracting "'xmitauth.c'" '(1269 characters)'
if test -f 'xmitauth.c'
then
	echo shar: will not over-write existing file "'xmitauth.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'xmitauth.c'
	X#ifndef lint
	Xstatic char *rcsid = "$Header: xmitauth.c,v 1.2 90/07/08 01:03:23 sob Exp $";
	X#endif
	X#include <stdio.h>
	X#include "../common/conf.h"
	X#include "../common/nntp.h"
	X#include "nntpxmit.h"
	X
	X#ifdef AUTH
	X
	Xextern char Debug;
	Xextern int converse();
	X
	XFILE *sys;
	X
	Xxmitauth(host)
	Xchar *host;
	X	{
	X	char remote[64], user[16], pass[16];
	X	char buf[1024];
	X	int i;
	X	char savedebug;
	X
	X	sys = fopen(PASSFILE, "r");
	X	if (sys == NULL)
	X		{
	X		exit(1);
	X		}
	X	
	X	while(fgets(buf, sizeof(buf), sys))
	X		{
	X		if (buf[0] == '#')
	X			continue;
	X		
	X		i = sscanf(buf,"%s %s %s", remote, user, pass);
	X		/* malformed entry? */
	X		if (i != 3)
	X			{
	X			log(L_NOTICE,"malformed entry in nntp.sys");
	X			continue;
	X			}
	X		
	X		/* right host? */
	X		if (!strcasecmp(remote,host))
	X			break;
	X		}
	X	if (feof(sys))
	X		{
	X		sprintf(buf,"host %s authinfo not in nntp.sys", host);
	X		log(L_NOTICE, buf);
	X		exit(1);
	X		}
	X	
	X	sprintf(buf,"authinfo user %s", user);
	X	if (converse(buf, sizeof(buf)) != NEED_AUTHDATA)
	X		{
	X		log(L_NOTICE, buf);
	X		exit(1);
	X		}
	X	
	X	/* don't display the password even if debug is on */
	X	savedebug = Debug;
	X	Debug = FALSE;
	X
	X	sprintf(buf,"authinfo pass %s", pass);
	X	if (converse(buf, sizeof(buf)) != OK_AUTH)
	X		{
	X		log(L_NOTICE, buf);
	X		exit(1);
	X		}
	X	
	X	Debug = savedebug;
	X
	X	fclose(sys);
	X	}
	X
	X#endif AUTH
	X
SHAR_EOF
if test 1269 -ne "`wc -c < 'xmitauth.c'`"
then
	echo shar: error transmitting "'xmitauth.c'" '(should have been 1269 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'xmit.diff'" '(2822 characters)'
if test -f 'xmit.diff'
then
	echo shar: will not over-write existing file "'xmit.diff'"
else
sed 's/^	X//' << \SHAR_EOF > 'xmit.diff'
	XIndex: Makefile
	X*** Makefile	Mon Jan 15 02:03:11 1990
	X--- ../../nntp/xmit/Makefile	Sun Jul  8 01:10:57 1990
	X***************
	X*** 2,8
	X  # Makefile for nntpxmit
	X  #
	X  
	X! SRVRSRC = nntpxmit.c remote.c llist.c get_tcp_conn.c ../server/fakesyslog.c
	X  
	X  SRVROBJ = nntpxmit.o remote.o llist.o get_tcp_conn.o fakesyslog.o
	X  
	X
	X--- 2,8 -----
	X  # Makefile for nntpxmit
	X  #
	X  
	X! SRVRSRC = nntpxmit.c remote.c llist.c get_tcp_conn.c xmitauth.c ../server/fakesyslog.c ../server/strcasecmp.c
	X  
	X  SRVROBJ = nntpxmit.o remote.o llist.o get_tcp_conn.o xmitauth.o fakesyslog.o strcasecmp.o
	X  
	X***************
	X*** 4,10
	X  
	X  SRVRSRC = nntpxmit.c remote.c llist.c get_tcp_conn.c ../server/fakesyslog.c
	X  
	X! SRVROBJ = nntpxmit.o remote.o llist.o get_tcp_conn.o fakesyslog.o
	X  
	X  SRVRINC = ../common/conf.h ../common/nntp.h nntpxmit.h get_tcp_conn.h \
	X  	llist.h sysexits.h ../common/nntp.h ../server/fakesyslog.h
	X
	X--- 4,10 -----
	X  
	X  SRVRSRC = nntpxmit.c remote.c llist.c get_tcp_conn.c xmitauth.c ../server/fakesyslog.c ../server/strcasecmp.c
	X  
	X! SRVROBJ = nntpxmit.o remote.o llist.o get_tcp_conn.o xmitauth.o fakesyslog.o strcasecmp.o
	X  
	X  SRVRINC = ../common/conf.h ../common/nntp.h nntpxmit.h get_tcp_conn.h \
	X  	llist.h sysexits.h ../common/nntp.h ../server/fakesyslog.h
	X***************
	X*** 53,58
	X  
	X  fakesyslog.o: ../server/fakesyslog.c ../server/fakesyslog.h
	X  	${CC} ${CFLAGS} -c ../server/fakesyslog.c
	X  
	X  nntpxmit.o: nntpxmit.c nntpxmit.h llist.h ../common/conf.h
	X  
	X
	X--- 53,61 -----
	X  
	X  fakesyslog.o: ../server/fakesyslog.c ../server/fakesyslog.h
	X  	${CC} ${CFLAGS} -c ../server/fakesyslog.c
	X+ 
	X+ strcasecmp.o: ../server/strcasecmp.c 
	X+ 	${CC} ${CFLAGS} -c ../server/strcasecmp.c
	X  
	X  nntpxmit.o: nntpxmit.c nntpxmit.h llist.h ../common/conf.h
	X
	XIndex: nntpxmit.c  
	XPrereq: 1.2
	X*** nntpxmit.c	Mon Jan 15 02:24:09 1990
	X--- ../../nntp/xmit/nntpxmit.c	Sun Jul  8 01:18:10 1990
	X***************
	X*** 1,5
	X  #ifndef lint
	X! static char * rcsid = "@(#)$Header: nntpxmit.c,v 1.2 90/01/15 01:36:48 sob Exp $";
	X  #endif
	X  /* nntpxmit - transmit netnews articles across the internet with nntp
	X  **
	X
	X--- 1,5 -----
	X  #ifndef lint
	X! static char * rcsid = "@(#)$Header: nntpxmit.c,v 1.3 90/07/08 01:17:56 sob Exp $";
	X  #endif
	X  /* nntpxmit - transmit netnews articles across the internet with nntp
	X  **
	X***************
	X*** 745,750
	X  		return(ERR_GOTIT);
	X  	}
	X  
	X  	sprintf(buf, "IHAVE %s", id);
	X  	Stats.offered++;
	X  
	X
	X--- 745,751 -----
	X  		return(ERR_GOTIT);
	X  	}
	X  
	X+ again:
	X  	sprintf(buf, "IHAVE %s", id);
	X  	Stats.offered++;
	X  
	X***************
	X*** 756,761
	X  	case ERR_GOTIT:
	X  		Stats.rejected++;
	X  		return(code);
	X  	default:
	X  		return(code);
	X  	}
	X
	X--- 757,767 -----
	X  	case ERR_GOTIT:
	X  		Stats.rejected++;
	X  		return(code);
	X+ #ifdef AUTH
	X+ 	case ERR_NOAUTH:
	X+ 		xmitauth(Host);
	X+ 		goto again;
	X+ #endif
	X  	default:
	X  		return(code);
	X  	}
SHAR_EOF
if test 2822 -ne "`wc -c < 'xmit.diff'`"
then
	echo shar: error transmitting "'xmit.diff'" '(should have been 2822 characters)'
fi
fi # end of overwriting check
echo shar: done with directory "'xmit'"
cd ..
#	End of shell archive
exit 0