Upgraded to Taylor UUCP 1.05 (Thanks to John Kohl).

This commit is contained in:
jtc 1994-10-24 22:15:56 +00:00
parent f3c9ca2e05
commit b8b0d848d6
25 changed files with 3045 additions and 784 deletions

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ LIBUUCONF!=cd $(.CURDIR)/../libuuconf; \
LIBUUCP!=cd $(.CURDIR)/../libuucp; \
printf "xxx:\n\techo \$${.OBJDIR}/libuucp.a\n" | ${MAKE} -r -s -f - xxx
VERSION= 1.04
VERSION= 1.05
owner= uucp
bindir= /usr/bin
sbindir= /usr/libexec/uucp

View File

@ -1,8 +1,8 @@
This is the README file for version 1.04 of the Taylor UUCP package.
This is the README file for version 1.05 of the Taylor UUCP package.
It was written by Ian Lance Taylor. I can be reached at ian@airs.com,
or, equivalently, uunet!cygint!airs!ian, or c/o Cygnus Support, 4th
Floor, Building 200, 1 Kendall Square, Cambridge MA, 02139, USA.
or, equivalently, uunet!cygint!airs!ian, or c/o Cygnus Support,
Building 200, 1 Kendall Square, Cambridge MA, 02139, USA.
There is a mailing list for discussion of the package. To join (or
get off) the list, send mail to taylor-uucp-request@gnu.ai.mit.edu.
@ -11,6 +11,10 @@ joining the list, make sure you include the address at which you want
to receive mail in the body of your message. To send a message to the
list, send it to taylor-uucp@gnu.ai.mit.edu.
Jeff Ross has volunteered to maintain patches for UUCP releases. They
may be obtained via anonymous FTP from ftp.fdu.edu, in the directory
pub/taylor-uucp.
This package is covered by the Gnu Public License. See the file
COPYING for details. If you would like to do something with this
package that you feel is reasonable but you feel is prohibited by the
@ -25,8 +29,7 @@ uupick, and cu, as well as uuchk (a program to check configuration
files), uuconv (a program to convert from one type of configuration
file to another) and tstuu (a test harness for the package).
The Free Software Foundation plans to make this their standard UUCP
package.
This is the standard UUCP package of the Free Software Foundation.
The package currently supports the 'f', 'g' (in all window and packet
sizes), 'G', 't' and 'e' protocols, as well a Zmodem protocol and two
@ -77,80 +80,13 @@ If you start using this package, I suggest that you join the mailing
list (see above) to keep up to date on patches and new versions. I am
also open to suggestions for improvements and modifications.
CHANGES SINCE 1.03
For a complete list, see ChangeLog.
IMPORTANT: the default when talking to another version of 1.04 is to
use the new bidirectional 'i' protocol. If you are using a
half-duplex modem, such as a Telebit T2500, you will want to either
mark the port as half-duplex with the ``half-duplex'' command, or
force use of the 'g' protocol by using the ``protocol'' command in the
sys or port file or by adding ``,g'' after the port name in the
Systems or L.sys or Devices file.
As usual, many bugs were fixed.
Bidirectional transfers are supported with the new 'i' protocol;
it requires an eight-bit clear datapath.
New programs: uusched, cu, uuto and uupick.
The 'G' protocol and a new Zmodem protocol were added.
A number of uustat options were added to support uuclean, and a
sample uuclean shell script was added to the contrib directory.
The uustat output formats were changed slightly.
A protocol extension eliminates transfer of the command file for
simple commands, such as rmail or rnews, when talking to another
version of 1.04.
Some TLI support was added.
UUCP forwarding was added, along with the ``forward-to'',
``forward-from'' and ``forward'' commands.
If a file transfer fails in the middle, the retry will now start
from where it left off. The implementation is compatible with
SVR4.
The work queue is checked every 10 minutes during a conversation;
if there is new work and a bidirectional protocol is not in use,
the receiving uucico requests the sender to transfer control.
The amount of free disk space is checked periodically as a file is
received, and if it drops too low the call is aborted.
The UUCP configuration file reading routines were moved into a
standalone library, uuconf. All known bugs in V2 and HDB
configuration file reading were fixed.
The ``half-duplex'' command was added for the port and dialer
files.
The ``max-retries'', ``success-wait'', ``send-request'' and
``receive-request'' commands were added for the sys file. The
``call-request'' and ``called-request'' commands were eliminated
(they did not work correctly anyhow).
\d in chat scripts now calls sleep (2) rather than sleep (1), so
it will sleep longer (on some systems sleep(1) may delay much less
than one second).
SPOOLDIR_SVR4 was added for SVR4 style spool directories.
Defaults are now permitted in the port and dialer files.
The ALIAS field is supported in the HDB Permissions file.
DOCUMENTATION
The documentation is in the file uucp.texi, which is a Texinfo file.
Texinfo is a format used by the Free Software Foundation. You can
print the documentation using TeX in combination with the file
texinfo.tex. DVI, PostScript and info versions of the documentation
are available in a separate package, uucp-doc-1.04.tar.Z.
are available in a separate package, uucp-doc-1.05.tar.gz.
See the TODO file for things which should be done. Please feel free
to do them, although you may want to check with me first. Send me
@ -174,7 +110,7 @@ The compilation instructions are in uucp.texi. Here is a summary.
what is available on your system, so if your system is at all
unusual you will need to pass in $CC and $LIBS correctly.
The configure script will create conf.h from conf.h.in and
The configure script will create config.h from config.h.in and
Makefile from Makefile.in. It will also create config.status,
which is a shell script which actually creates the files. Please
report any configuration problems, so that they can be fixed in
@ -195,7 +131,23 @@ The compilation instructions are in uucp.texi. Here is a summary.
use -posix, instead I run gcc with -D_POSIX_SOURCE, and add
-lcposix to LIBS.
Examine conf.h and Makefile to make sure they're right.
On some versions of BSDI there is a bug in the shell which causes
the default value for CFLAGS to be set incorrectly. If ``echo
${CFLAGS--g}'' echoes ``g'' rather than ``-g'', then you must set
CFLAGS in the environment before running configure. There is a
patch available from BSDI for this bug. (From David Vrona).
On AIX 3.2.5, and possibly other versions, cc -E does not work,
reporting ``Option NOROCONST is not valid.'' Test this before
running configure by doing something like
touch /tmp/foo.c
cc -E /tmp/foo.c
This may give a warning about the file being empty, but it should
not give the ``Option NOROCONST'' warning. The workaround is to
remove the ",noroconst" entry from the "options" clause in the
"cc" stanza in /etc/xlc.cfg. (From Chris Lewis).
Examine config.h and Makefile to make sure they're right.
Edit policy.h for your local system.
@ -204,4 +156,7 @@ The compilation instructions are in uucp.texi. Here is a summary.
Use ``uuchk'' to check configuration files. You can use
``uuconv'' to convert between configuration file formats.
Type ``make install'' to install.
Type ``make install'' to install. Note that by default the
programs are compiled with debugging information, and they are not
stripped when they are installed. Read the man page for strip for
more information.

View File

@ -92,11 +92,6 @@ UUCP protocols to do file transfers. This would allow ftp work to be
done late at night, and allow neighbors of cooperative Internet sites
to use UUCP forwarding for anonymous FTP.
31.
David Nugent: add a -C option to uucico to only call the system if
there is work to do.
32.
It would be nice if uucico could sleep until a line was available.
@ -194,11 +189,6 @@ expect strings.
Use POSIX fcntl locks when possible instead of creating a lock file.
130.
Chip Salzenberg: BSD lets you override the timeout for a particular
expect string by using a trailing ~.
138.
T. William Wells: BNU apparently uses a file named A.whatever to hold
@ -323,20 +313,6 @@ system and command locks, and do any other type of file.
Scott Blachowicz: provide some sort of include mechanism for the
configuration files.
162.
Chris Lewis: add uuxqtpolicy command, probably in config, supporting
the following values which determine when uuxqt should be run:
- never (let cron or something else worry about it)
- perinvocation (when uucico exits for good - current behaviour)
- persite (when uucico terminates a conversation - HDBish)
- periodic (per 5 or 10 incoming X. files - BSDish)
- perturnaround?
163.
Sort jobs in the send queue by size. Pretty easy.
164.
Ed Carp: preserve files if uuxqt execution fails.
@ -349,11 +325,6 @@ Marc Sheldon: use exit codes from <sysexits.h> in uux and uucp.
Chip Salzenberg: allow chat failure strings to specify a retry time.
167.
Gregory Bond: allow a dialer sequence for a TCP port, so you can make
a TCP connection to a modem and then dial out.
168.
Jose A. Manas: allow a maximum connect time, after which we try to
@ -421,14 +392,6 @@ number''.
Don Phillips: should there be some way to restrict of grade of
transfers even when the other system places the call?
179.
Nickolay Saukh: add something to chat scripts to specify the timeout
for an expect string, e.g. AT\c OK\W3 to wait for 3 seconds. Except
that perhaps the unit should not be seconds. Berkeley apparently uses
~number, not \W number, but I don't see any reason to prevent use of
the ~ character in an expect string.
180.
Nickolay Saukh: if we have received a partial file, request the remote
@ -451,12 +414,6 @@ statement.
Optionally check for interrupts in fcopy_file, since it can take a
long time to copy a file named in a uucp request.
184.
Ian Moran: if an attempt is made to a copy a file to a directory which
denies write permission, perhaps the file should be saved somewhere.
It must be saved in a private location, though.
185.
A syntax error in a command received from the remote system should not
@ -536,11 +493,6 @@ to do, and then try again later. This would require a protocol
extension. I don't know if it's worth it. The code should be checked
to see how well it handles a disk full situation.
196.
For real adjustability, provide some mechanism for picking the lead
characters to use for the shell scripts, between : and #!.
197.
Try alternate IP addresses if there are any.
@ -571,3 +523,220 @@ Bill Foote: have uuchk check whether a system is defined more than
once.
203.
Eric Ziegast: allow specification of the minimum grade to receive, as
well as the maximum grade. Probably sending a second character after
the -pM argument would work fine.
204.
Tom Rushworth: perhaps there should be some program which can be used
to retrieve the current spool directory. Perhaps on option on uustat.
207.
James B. O'Connor: use additional messages in the status file when
placing a call, such as Dialing, Chatting, and the like. Slightly
less efficient.
208.
When checking whether a file may be received into a directory, perhaps
uucico should check using the real user ID rather than insisting that
the directory be world writable. This should be a policy.h parameter.
This would enable sites which use different uids for each incoming
UUCP login to have better control over security.
209.
Jon Vos: add an alias command for ports.
210.
Joe Wells: I'd like to have a way so that if the dial chat fails due
to "NO CARRIER", in addition to this log message:
ERROR: Chat script failed: Got "NO\sCARRIER"
I would get another log message right next to it that would look like
this:
ERROR: Chat script failed: 5 "RRING" strings seen
Ian: I doubt this is worth implementing in uucico, but it might make
sense for an external, or otherwise more independent and controllable,
chat program.
211.
Joe Wells: In some cases it would be nice to be able to change the set
of chat-fail strings in the middle of the chat script. Personally, I
think this is too complex for the simple chat scripts currently
implemented.
212.
Joe Wells: There should be an option to all programs directing them to
send all debugging output to the log file. This would just involve
calling ulog_to_file at some point just after reporting any usage
messages.
213.
Joe Wells: There should be a way to specify the execution directory
used by uuxqt. This would avoid certain sorts of permissions
problems. Some mechanism would still be needed for using multiple
directories.
214.
Joe Wells: uuto should be documented.
215.
Joe Wells: Perhaps it should be possible to use multiple spool
directories. It would be a lot of work, though.
216.
Joe Wells: It should be possible to specify only one of complete or
abort.
217.
Dan Everhart: It would be nice if the chat-fail string could affect
the error message reported by uustat, so that uustat could say
something ``Line was busy''.
218.
Andrew A. Chernov: Add a chat-char-delay xx configuration parameter,
which has the effect of adding \p after each character, with delay xx.
This is to accommodate modems which can't accept command characters at
a given baud rate.
219.
Gert Doering: Provide some mechanism for specifying the maximum length
of a call. Convenient for anonymous UUCP sites.
220.
Joe Wells: There should be some way for "cu" to obey user commands
during the dial chat. Right now, the only thing the user can do is
send signals (e.g. type Control-C). This leads to user complaints
that "cu" is not obeying its documentation.
221.
Joe Wells: Right now, if there is any failure in the dial or login
chat scripts, the remote system alternate is skipped even though the
cause of the failure may have been the local serial port or modem.
"uucico" will not try another modem with the same remote system
alternate. If the remote system only has one alternate, then it is
skipped entirely.
Thus, there should be a way to specify that when certain expect
strings are not seen or certain chat-fail strings are seen that the
port is skipped instead of the remote system alternate.
222.
Richard H. Gumpertz: Support pipelines in uuxqt. Right now they are
only supported if uux puts in an 'e' line (which it does) and shell
executions are permitted (which they normally are not). It would be
possible to permit restricted pipelines by handling the pipe character
specially and making sure all commands in the pipeline were permitted.
223.
Bill Sommerfeld: When dialing out, set the status to DIALING rather
than CONNECTION CLOSED. Setting the status takes a bit of time; it's
hard to tell where the right break-even point is.
224.
Joe Wells: Keep track of the last successful incoming call separately
from the last successful outgoing call. Currently the two times are
both put together in the status file.
225.
Joe Wells: It would be nice if uustat would provide a way to avoid
bouncing mail that it sent itself, to avoid sending notification
e-mail for notification e-mail. I can't think of a mechanism, though
(using a special grade for uustat does not work because most mail
programs do not provide a mechanism for passing a grade through to
uux).
226.
Joe Wells: It would be nice if uustat could know whether it had sent
mail for a particular job, to avoid generating multiple messages for
the job.
227.
Joe Wells: It would be nice if dialcode suffixes were supported, as
well as prefixes.
228.
Joe Wells: It would be nice to support another spool directory scheme
which split stuff up more to avoid very large directories. This would
be most useful for the files which are named in C. and X. files,
rather than for the C. and X. files themselves (since C. and X. files
are rarely looked up by name). Basically, some sort of partition of
the D. directory is called for.
229.
Joe Wells: ``It would be nice if the exit sequence of "cu", where it
runs the complete chat script and then disconnects could be aborted
without disconnecting. (Yes, I know, this is a strange desire.) It
would be nice to be able to reinvoke the dial chat by user command in
"cu". It would be nice to be able to invoke an arbitrary named chat
script in "cu".''
230.
Kevin Johnson: Provide some mechanism such that all requests to a
particular system were automatically forwarded through some other
system. This would be useful to hide details of a non-strongly-
connected network, particularly if the details were subject to change.
231.
Gert Doering: Perhaps it should be possible to -r the default for uucp
and uux. This would require adding a new option to force the
invocation of uucico.
232.
Mark Davies: spaces are not handled correctly in the -a argument of
uux. If an E command is generated, the requestor address is not
quoted correctly, nor is it parsed correctly. If an execution file is
generated, the R line is not parsed correctly.
233.
Emmanuel Mogenet: provide some mechanism for a maximum number of
garbage bytes during a chat script before giving up.
234.
Scott Ballantyne: The address for a TCP port should be separate from
the phone number, so that a TCP dialer can use \D.
235.
Peter Wemm: The 'i' protocol default parameters do not work at 2400
baud, because the time it takes to transfer half the packets is less
than the timeout time. Of course people can always change the
parameters, but it would be nice if this were dealt with somehow.
236.
Andrew A. Chernov: Perhaps uuxqt should log when it terminates.
237.

View File

@ -1,4 +1,4 @@
Version 1.04
Version 1.05
a complete, unmodified version of this program is available from
prep.ai.mit.edu.

View File

@ -1,7 +1,7 @@
/* chat.c
Chat routine for the UUCP package.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char chat_rcsid[] = "$Id: chat.c,v 1.1 1993/08/04 19:30:29 jtc Exp $";
const char chat_rcsid[] = "$Id: chat.c,v 1.2 1994/10/24 22:17:03 jtc Exp $";
#endif
#include <ctype.h>
@ -153,6 +153,9 @@ fchat (qconn, puuconf, qchat, qsys, qdial, zphone, ftranslate, zport, ibaud)
/* Loop over subexpects and subsends. */
while (TRUE)
{
char *ztimeout;
int ctimeout;
/* Copy the expect string into the buffer so that we can
modify it in cescape. */
clen = strlen (*pzchat);
@ -167,6 +170,23 @@ fchat (qconn, puuconf, qchat, qsys, qdial, zphone, ftranslate, zport, ibaud)
azstrings[0] = zbuf;
if (azstrings[0][0] == '-')
++azstrings[0];
/* \Wnum at the end of the string is a timeout. */
ctimeout = qchat->uuconf_ctimeout;
ztimeout = strrchr (azstrings[0], '\\');
if (ztimeout != NULL && ztimeout[1] == 'W')
{
char *zend;
int cval;
cval = (int) strtol (ztimeout + 2, &zend, 10);
if (zend != ztimeout + 2 && *zend == '\0')
{
ctimeout = cval;
*ztimeout = '\0';
}
}
aclens[0] = cescape (azstrings[0]);
if (aclens[0] == 0
@ -185,8 +205,7 @@ fchat (qconn, puuconf, qchat, qsys, qdial, zphone, ftranslate, zport, ibaud)
int istr;
istr = icexpect (qconn, cstrings, azstrings, aclens,
qchat->uuconf_ctimeout,
qchat->uuconf_fstrip);
ctimeout, qchat->uuconf_fstrip);
/* If we found the string, break out of the
subexpect/subsend loop. */
@ -640,7 +659,7 @@ fcsend (qconn, puuconf, z, qsys, qdial, zphone, ftranslate, fstrip)
break;
case 'd':
fquote = fcsend_debug (fquote, (size_t) 0, "sleep");
usysdep_sleep (2);
usysdep_sleep (1);
break;
case 'e':
fquote = fcsend_debug (fquote, (size_t) 0, "echo-check-off");
@ -717,6 +736,8 @@ fcsend (qconn, puuconf, z, qsys, qdial, zphone, ftranslate, fstrip)
case 'L':
{
const char *zlog;
char *zcopy;
size_t clen;
if (qsys == NULL)
{
@ -756,18 +777,24 @@ fcsend (qconn, puuconf, z, qsys, qdial, zphone, ftranslate, fstrip)
}
zlog = zcallout_login;
}
zcopy = zbufcpy (zlog);
clen = cescape (zcopy);
fquote = fcsend_debug (fquote, (size_t) 0, "login");
fquote = fcsend_debug (fquote, strlen (zlog), zlog);
if (! (*pfwrite) (qconn, zlog, strlen (zlog)))
fquote = fcsend_debug (fquote, clen, zcopy);
if (! (*pfwrite) (qconn, zcopy, clen))
{
ubuffree (zcopy);
ucsend_debug_end (fquote, TRUE);
return FALSE;
}
ubuffree (zcopy);
}
break;
case 'P':
{
const char *zpass;
char *zcopy;
size_t clen;
if (qsys == NULL)
{
@ -807,13 +834,17 @@ fcsend (qconn, puuconf, z, qsys, qdial, zphone, ftranslate, fstrip)
}
zpass = zcallout_pass;
}
zcopy = zbufcpy (zpass);
clen = cescape (zcopy);
fquote = fcsend_debug (fquote, (size_t) 0, "password");
fquote = fcsend_debug (fquote, strlen (zpass), zpass);
if (! (*pfwrite) (qconn, zpass, strlen (zpass)))
fquote = fcsend_debug (fquote, clen, zcopy);
if (! (*pfwrite) (qconn, zcopy, clen))
{
ubuffree (zcopy);
ucsend_debug_end (fquote, TRUE);
return FALSE;
}
ubuffree (zcopy);
}
break;
case 'D':
@ -1168,6 +1199,7 @@ fcprogram (qconn, puuconf, pzprogram, qsys, qdial, zphone, zport, ibaud)
for (zfrom = *pz; *zfrom != '\0'; zfrom++)
{
const char *zadd = NULL;
char *zfree = NULL;
size_t cadd;
char abadd[15];
@ -1241,7 +1273,9 @@ fcprogram (qconn, puuconf, pzprogram, qsys, qdial, zphone, zport, ibaud)
}
zlog = zcallout_login;
}
zadd = zlog;
zfree = zbufcpy (zlog);
(void) cescape (zfree);
zadd = zfree;
}
break;
case 'P':
@ -1287,7 +1321,9 @@ fcprogram (qconn, puuconf, pzprogram, qsys, qdial, zphone, zport, ibaud)
}
zpass = zcallout_pass;
}
zadd = zpass;
zfree = zbufcpy (zpass);
(void) cescape (zfree);
zadd = zfree;
}
break;
case 'D':
@ -1405,6 +1441,7 @@ fcprogram (qconn, puuconf, pzprogram, qsys, qdial, zphone, zport, ibaud)
memcpy (zto, zadd, cadd + 1);
zto += cadd;
clen += cadd;
ubuffree (zfree);
}
if (! fret)

View File

@ -0,0 +1,461 @@
/* conf.h. Generated automatically by configure. */
/* Configuration header file for Taylor UUCP. -*- C -*- */
/* If your compiler does not use const correctly, then undefine it
here. This #undef is commented out by the configure script if it
determines that const is supported. */
/* #undef const */
/* If your compiler supports prototypes, set HAVE_PROTOTYPES to 1. */
#define HAVE_PROTOTYPES 1
/* Set ECHO_PROGRAM to a program which echoes its arguments; if echo
is a shell builtin you can just use "echo". */
#define ECHO_PROGRAM "echo"
/* The following macros indicate what header files you have. Set the
macro to 1 if you have the corresponding header file, or 0 if you
do not. */
#define HAVE_STDDEF_H 1 /* <stddef.h> */
#define HAVE_STDARG_H 1 /* <stdarg.h> */
#define HAVE_STRING_H 1 /* <string.h> */
#define HAVE_STRINGS_H 1 /* <strings.h> */
#define HAVE_UNISTD_H 1 /* <unistd.h> */
#define HAVE_STDLIB_H 1 /* <stdlib.h> */
#define HAVE_LIMITS_H 1 /* <limits.h> */
#define HAVE_TIME_H 1 /* <time.h> */
#define HAVE_SYS_WAIT_H 1 /* <sys/wait.h> */
#define HAVE_SYS_IOCTL_H 1 /* <sys/ioctl.h> */
#define HAVE_DIRENT_H 1 /* <dirent.h> */
#define HAVE_MEMORY_H 1 /* <memory.h> */
#define HAVE_SYS_PARAM_H 1 /* <sys/param.h> */
#define HAVE_UTIME_H 1 /* <utime.h> */
#define HAVE_FCNTL_H 1 /* <fcntl.h> */
#define HAVE_SYS_FILE_H 1 /* <sys/file.h> */
#define HAVE_SYS_TIME_H 1 /* <sys/time.h> */
#define HAVE_SYS_TIMES_H 1 /* <sys/times.h> */
#define HAVE_LIBC_H 0 /* <libc.h> */
#define HAVE_SYSEXITS_H 1 /* <sysexits.h> */
#define HAVE_POLL_H 0 /* <poll.h> */
#define HAVE_TIUSER_H 0 /* <tiuser.h> */
#define HAVE_XTI_H 0 /* <xti.h> */
#define HAVE_SYS_TLI_H 0 /* <sys/tli.h> */
#define HAVE_STROPTS_H 0 /* <stropts.h> */
#define HAVE_FTW_H 0 /* <ftw.h> */
#define HAVE_GLOB_H 1 /* <glob.h> */
#define HAVE_SYS_SELECT_H 0 /* <sys/select.h> */
#define HAVE_SYS_TYPES_TCP_H 0 /* <sys/types.tcp.h> */
/* If major and minor are not defined in <sys/types.h>, but are in
<sys/mkdev.h>, set MAJOR_IN_MKDEV to 1. If they are in
<sys/sysmacros.h>, set MAJOR_IN_SYSMACROS to 1. */
#define MAJOR_IN_MKDEV 0
#define MAJOR_IN_SYSMACROS 0
/* If the macro offsetof is not defined in <stddef.h>, you may give it
a definition here. If you do not, the code will use a definition
(in uucp.h) that should be fairly portable. */
/* #define offsetof */
/* Set RETSIGTYPE to the return type of a signal handler. On newer
systems this will be void; some older systems use int. */
#define RETSIGTYPE void
/* If the macro S_ISDIR is defined in <sys/stat.h>, but is incorrect,
define STAT_MACROS_BROKEN to be 1. This is said to be the case on
Tektronix UTekV, Amdahl UTS and Motorola System V/88. */
#define STAT_MACROS_BROKEN 0
/* Set TIME_WITH_SYS_TIME to 1 if <time.h> and <sys/time.h> can both
be included in a single source file; if you don't have either or
both of them, it doesn't matter what you set this to. */
#define TIME_WITH_SYS_TIME 1
/* Set TM_IN_SYS_TIME to 1 if struct tm is defined in <sys/time.h>
rather than in <time.h>. */
#define TM_IN_SYS_TIME 0
/* Set HAVE_TERMIOS_AND_SYS_IOCTL_H to 1 if <termios.h> and <sys/ioctl.h>
can both be included in a single source file; if you don't have either
or both of them, it doesn't matter what you set this to. */
#define HAVE_TERMIOS_AND_SYS_IOCTL_H 1
/* If you are configuring by hand, you should set one of the terminal
driver options in policy.h. If you are autoconfiguring, the script
will check whether your system defines CBREAK, which is a terminal
setting; if your system supports CBREAK, and you don't set a terminal
driver in policy.h, the code will assume that you have a BSD style
terminal driver. */
#define HAVE_CBREAK 1
/* The package needs several standard types. If you are using the
configure script, it will look in standard places for these types,
and give default definitions for them here if it doesn't find them.
The default definitions should work on most systems, but you may
want to check them. If you are configuring by hand, you will have
to figure out whether the types are defined on your system, and
what they should be defined to.
Any type that is not defined on your system should get a macro
definition. The definition should be of the name of the type in
all capital letters. For example, #define PID_T int. If the type
is defined in a standard header file, the macro name should not be
defined. */
/* The type pid_t is used to hold a process ID number. It is normally
defined in <sys/types.h>. This is the type returned by the
functions fork or getpid. Usually int will work fine. */
#undef PID_T
/* The type uid_t is used to hold a user ID number. It is normally
defined in <sys/types.h>. This is the type returned by the getuid
function. Usually int will work fine. */
#undef UID_T
/* The type gid_t is used to hold a group ID number. It is sometimes
defined in <sys/types.h>. This is the type returned by the getgid
function. Usually int will work fine. */
#undef GID_T
/* The type off_t is used to hold an offset in a file. It is sometimes
defined in <sys/types.h>. This is the type of the second argument to
the lseek function. Usually long will work fine. */
#undef OFF_T
/* Set HAVE_SIG_ATOMIC_T_IN_SIGNAL_H if the type sig_atomic_t is defined
in <signal.h> as required by ANSI C. */
#define HAVE_SIG_ATOMIC_T_IN_SIGNAL_H 1
/* Set HAVE_SIG_ATOMIC_T_IN_TYPES_H if the type sig_atomic_t is defined
in <sys/types.h>. This is ignored if HAVE_SIG_ATOMIC_T_IN_SIGNAL_H is
set to 1. */
#define HAVE_SIG_ATOMIC_T_IN_TYPES_H 0
/* The type sig_atomic_t is used to hold a value which may be
referenced in a single atomic operation. If it is not defined in
either <signal.h> or <sys/types.h>, you may want to give it a
definition here. If you don't, the code will use char. If your
compiler does not support sig_atomic_t, there is no type which is
really correct; fortunately, for this package it does not really
matter very much. */
#undef SIG_ATOMIC_T
/* Set HAVE_SIZE_T_IN_STDDEF_H to 1 if the type size_t is defined in
<stddef.h> as required by ANSI C. */
#define HAVE_SIZE_T_IN_STDDEF_H 1
/* Set HAVE_SIZE_T_IN_TYPES_H to 1 if the type size_t is defined in
<sys/types.h>. This is ignored if HAVE_SIZE_T_IN_STDDEF_H is set
to 1. */
#define HAVE_SIZE_T_IN_TYPES_H 1
/* The type size_t is used to hold the size of an object. In
particular, an argument of this type is passed as the size argument
to the malloc and realloc functions. If size_t is not defined in
either <stddef.h> or <sys/types.h>, you may want to give it a
definition here. If you don't, the code will use unsigned. */
#undef SIZE_T
/* Set HAVE_TIME_T_IN_TIME_H to 1 if the type time_t is defined in
<time.h>, as required by the ANSI C standard. */
#define HAVE_TIME_T_IN_TIME_H 1
/* Set HAVE_TIME_T_IN_TYPES_H to 1 if the type time_t is defined in
<sys/types.h>. This is ignored if HAVE_TIME_T_IN_TIME_H is set to
1. */
#define HAVE_TIME_T_IN_TYPES_H 1
/* When Taylor UUCP is talking to another instance of itself, it will
tell the other side the size of a file before it is transferred.
If the package can determine how much disk space is available, it
will use this information to avoid filling up the disk. Define one
of the following macros to tell the code how to determine the
amount of available disk space. It is possible that none of these
are appropriate; it will do no harm to use none of them, but, of
course, nothing will then prevent the package from filling up the
disk. Note that this space check is only useful when talking to
another instance of Taylor UUCP.
STAT_STATVFS statvfs function
STAT_STATFS2_BSIZE two argument statfs function with f_bsize field
STAT_STATFS2_FSIZE two argument statfs function with f_fsize field
STAT_STATFS2_FS_DATA two argument statfs function with fd_req field
STAT_STATFS4 four argument statfs function
STAT_DUSTAT dustat function (AIX PS/2)
STAT_DISK_SPACE disk_space function (QNX)
STAT_USTAT the ustat function with 512 byte blocks. */
#define STAT_STATVFS 0
#define STAT_STATFS2_BSIZE 0
#define STAT_STATFS2_FSIZE 1
#define STAT_STATFS2_FS_DATA 0
#define STAT_STATFS4 0
#define STAT_DUSTAT 0
#define STAT_DISK_SPACE 0
#define STAT_USTAT 0
/* Set HAVE_VOID to 1 if the compiler supports declaring functions with
a return type of void and casting values to void. */
#define HAVE_VOID 1
/* Set HAVE_UNSIGNED_CHAR to 1 if the compiler supports the type unsigned
char. */
#define HAVE_UNSIGNED_CHAR 1
/* Set HAVE_ERRNO_DECLARATION to 1 if errno is declared in <errno.h>. */
#define HAVE_ERRNO_DECLARATION 1
/* Set HAVE_TXADDCD to 1 if TXADDCD is defined in <sys/ioctl.h>, as it
is on AIX. */
#define HAVE_TXADDCD 0
/* There are now a number of functions to check for. For each of
these, the macro HAVE_FUNC should be set to 1 if your system has
FUNC. For example, HAVE_VFPRINTF should be set to 1 if your system
has vfprintf, 0 otherwise. */
/* Taylor UUCP will take advantage of the following functions if they
are available, but knows how to deal with their absence. */
#define HAVE_VFPRINTF 1
#define HAVE_FTRUNCATE 1
#define HAVE_LTRUNC 0
#define HAVE_WAITPID 1
#define HAVE_WAIT4 1
#define HAVE_GLOB 1
#define HAVE_SETREUID 0 /* deprecated */
/* There are several functions which are replaced in the subdirectory
lib. If they are missing, the configure script will automatically
add them to lib/Makefile to force them to be recompiled. If you
are configuring by hand, you will have to do this yourself. The
string @LIBOBJS@ in lib/Makefile.in should be replaced by a list of
object files in lib/Makefile. The following comments tell you
which object file names to add (they are generally fairly obvious,
given that the file names have no more than six characters before
the period). */
/* For each of these functions, if it does not exist, the indicated
object file should be added to lib/Makefile. */
#define HAVE_BSEARCH 1 /* bsrch.o */
#define HAVE_GETLINE 0 /* getlin.o */
#define HAVE_MEMCHR 1 /* memchr.o */
#define HAVE_STRDUP 1 /* strdup.o */
#define HAVE_STRSTR 1 /* strstr.o */
#define HAVE_STRTOL 1 /* strtol.o */
/* If neither of these functions exists, you should add bzero.o to
lib/Makefile. */
#define HAVE_BZERO 1
#define HAVE_MEMSET 1
/* If neither of these functions exists, you should add memcmp.o to
lib/Makefile. */
#define HAVE_MEMCMP 1
#define HAVE_BCMP 1
/* If neither of these functions exists, you should add memcpy.o to
lib/Makefile. */
#define HAVE_MEMCPY 1
#define HAVE_BCOPY 1
/* If neither of these functions exists, you should add strcas.o to
lib/Makefile. */
#define HAVE_STRCASECMP 1
#define HAVE_STRICMP 0
/* If neither of these functions exists, you should add strncs.o to
lib/Makefile. */
#define HAVE_STRNCASECMP 1
#define HAVE_STRNICMP 0
/* If neither of these functions exists, you should add strchr.o to
lib/Makefile. */
#define HAVE_STRCHR 1
#define HAVE_INDEX 1
/* If neither of these functions exists, you should add strrch.o to
lib/Makefile. */
#define HAVE_STRRCHR 1
#define HAVE_RINDEX 1
/* There are also Unix specific functions which are replaced in the
subdirectory unix. If they are missing, the configure script will
automatically add them to unix/Makefile to force them to be
recompiled. If you are configuring by hand, you will have to do
this yourself. The string @UNIXOBJS@ in unix/Makefile.in should be
replaced by a list of object files in unix/Makefile. The following
comments tell you which object file names to add. */
/* For each of these functions, if it does not exist, the indicated
object file should be added to unix/Makefile. */
#define HAVE_OPENDIR 1 /* dirent.o */
#define HAVE_DUP2 1 /* dup2.o */
#define HAVE_FTW 0 /* ftw.o */
#define HAVE_REMOVE 1 /* remove.o */
#define HAVE_RENAME 1 /* rename.o */
#define HAVE_STRERROR 1 /* strerr.o */
/* The code needs to know how to create directories. If you have the
mkdir function, set HAVE_MKDIR to 1 and replace @UUDIR@ in
Makefile.in with '# ' (the configure script will set @UUDIR@
according to the variable UUDIR). Otherwise, set HAVE_MKDIR to 0,
remove @UUDIR@ from Makefile.in, set MKDIR_PROGRAM to the name of
the program which will create a directory named on the command line
(e.g., "/bin/mkdir"), and add mkdir.o to the @UNIXOBJS@ string in
unix/Makefile.in. */
#define HAVE_MKDIR 1
#define MKDIR_PROGRAM unused
/* The code also needs to know how to remove directories. If you have
the rmdir function, set HAVE_RMDIR to 1. Otherwise, set
RMDIR_PROGRAM to the name of the program which will remove a
directory named on the command line (e.g., "/bin/rmdir") and add
rmdir.o to the @UNIXOBJS@ string in unix/Makefile.in. */
#define HAVE_RMDIR 1
#define RMDIR_PROGRAM unused
/* The code needs to know to how to get the name of the current
directory. If getcwd is available it will be used, otherwise if
getwd is available it will be used. Otherwise, set PWD_PROGRAM to
the name of the program which will print the name of the current
working directory (e.g., "/bin/pwd") and add getcwd.o to the
@UNIXOBJS@ string in unix/Makefile.in. */
#define HAVE_GETCWD 1
#define HAVE_GETWD 1
#define PWD_PROGRAM unused
/* If you have either sigsetjmp or setret, it will be used instead of
setjmp. These functions will only be used if your system restarts
system calls after interrupts (see HAVE_RESTARTABLE_SYSCALLS,
below). */
#define HAVE_SIGSETJMP 0
#define HAVE_SETRET 0
/* The code needs to know what function to use to set a signal
handler. If will try to use each of the following functions in
turn. If none are available, it will use signal, which is assumed
to always exist. */
#define HAVE_SIGACTION 1
#define HAVE_SIGVEC 1
#define HAVE_SIGSET 0
/* If the code is going to use sigvec (HAVE_SIGACTION is 0 and
HAVE_SIGVEC is 1), then HAVE_SIGVEC_SV_FLAGS must be set to 1 if
the sigvec structure contains the sv_flags field, or 0 if the
sigvec structure contains the sv_onstack field. If the code is not
going to use sigvec, it doesn't matter what this is set to. */
#define HAVE_SIGVEC_SV_FLAGS 1
/* The code will try to use each of the following functions in turn
when blocking signals from delivery. If none are available, a
relatively unimportant race condition will exist. */
#define HAVE_SIGPROCMASK 1
#define HAVE_SIGBLOCK 1
#define HAVE_SIGHOLD 0
/* If you have either of the following functions, it will be used to
determine the number of file descriptors which may be open.
Otherwise, the code will use OPEN_MAX if defined, then NOFILE if
defined, then 20. */
#define HAVE_GETDTABLESIZE 1
#define HAVE_SYSCONF 0
/* The code will use one of the following functions when detaching
from a terminal. One of these must exist. */
#define HAVE_SETPGRP 1
#define HAVE_SETSID 1
/* If you do not specify the local node name in the main configuration
file, Taylor UUCP will try to use each of the following functions
in turn. If neither is available, you must specify the local node
name in the configuration file. */
#define HAVE_GETHOSTNAME 1
#define HAVE_UNAME 0
/* The code will try to use each of the following functions in turn to
determine the current time. If none are available, it will use
time, which is assumed to always exist. */
#define HAVE_GETTIMEOFDAY 1
#define HAVE_FTIME 0
/* If neither gettimeofday nor ftime is available, the code will use
times (if available) to measure a span of time. See also the
discussion of TIMES_TICK in policy.h. */
#define HAVE_TIMES 1
/* When a chat script requests a pause of less than a second with \p,
Taylor UUCP will try to use each of the following functions in
turn. If none are available, it will sleep for a full second.
Also, the (non-portable) tstuu program requires either select or
poll. */
#define HAVE_NAPMS 0
#define HAVE_NAP 0
#define HAVE_USLEEP 1
#define HAVE_POLL 0
#define HAVE_SELECT 1
/* If the getgrent function is available, it will be used to determine
all the groups a user belongs to when checking file access
permissions. */
#define HAVE_GETGRENT 1
/* If the socket function is available, TCP support code will be
compiled in. */
#define HAVE_SOCKET 1
/* If the t_open function is available, TLI support code will be
compiled in. This may require adding a library, such as -lnsl or
-lxti, to the Makefile variables LIBS. */
#define HAVE_T_OPEN 0
/* If the dev_info function is available (QNX only), it will be used
to determine if any other process has the serial port open, and
that will cause uucico and cu to presume the port is locked. */
#define HAVE_DEV_INFO 0
/* That's the end of the list of the functions. Now there are a few
last miscellaneous items. */
/* On some systems the following functions are declared in such a way
that the code cannot make a simple extern. On other systems, these
functions are not declared at all, and the extern is required. If
a declaration of the function, as shown, compiles on your system,
set the value to 1. Not all functions declared externally are
listed here, only the ones with which I have had trouble. */
/* extern long times (); */
#define TIMES_DECLARATION_OK 0
/* extern struct passwd *getpwnam (); */
#define GETPWNAM_DECLARATION_OK 1
/* extern struct passwd *getpwuid (); */
#define GETPWUID_DECLARATION_OK 0
/* extern struct group *getgrent (); */
#define GETGRENT_DECLARATION_OK 1
/* Set HAVE_BSD_PGRP to 1 if your getpgrp call takes 1 argument and
your setpgrp calls takes 2 arguments (on System V they generally
take no arguments). You can safely set this to 1 on System V,
provided the call will compile without any errors. */
#define HAVE_BSD_PGRP 0
/* Set HAVE_UNION_WAIT to 1 if union wait is defined in the header
file <sys/wait.h>. */
#define HAVE_UNION_WAIT 1
/* Set HAVE_LONG_FILE_NAMES to 1 if the system supports file names
longer than 14 characters. */
#define HAVE_LONG_FILE_NAMES 1
/* If slow system calls are restarted after interrupts, set
HAVE_RESTARTABLE_SYSCALLS to 1. This is ignored if HAVE_SIGACTION
is 1 or if HAVE_SIGVEC is 1 and HAVE_SIGVEC_SV_FLAGS is 1 and
SV_INTERRUPT is defined in <signal.h>. In both of these cases
system calls can be prevented from restarting. */
#define HAVE_RESTARTABLE_SYSCALLS 1
/* Some systems supposedly need the following macros to be defined.
These are handled by the configure script. If you are configuring
by hand, you may add appropriate definitions here, or just add them
to CFLAGS when running make. */
#undef _ALL_SOURCE
#undef _POSIX_SOURCE
#undef _MINIX
#undef _POSIX_1_SOURCE

View File

@ -1,7 +1,7 @@
/* conn.c
Connection routines for the Taylor UUCP package.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char conn_rcsid[] = "$Id: conn.c,v 1.1 1993/08/04 19:30:39 jtc Exp $";
const char conn_rcsid[] = "$Id: conn.c,v 1.2 1994/10/24 22:17:07 jtc Exp $";
#endif
#include <ctype.h>
@ -35,21 +35,19 @@ const char conn_rcsid[] = "$Id: conn.c,v 1.1 1993/08/04 19:30:39 jtc Exp $";
#include "uuconf.h"
#include "conn.h"
static boolean fcdo_dial P((struct sconnection *qconn, pointer puuconf,
struct uuconf_dialer *qdialer,
const char *zphone, boolean ftranslate));
/* Create a new connection. This relies on system dependent functions
to set the qcmds and psysdep fields. If qport is NULL, it opens a
standard input port. */
standard input port, in which case ttype is the type of port to
use. */
boolean
fconn_init (qport, qconn)
fconn_init (qport, qconn, ttype)
struct uuconf_port *qport;
struct sconnection *qconn;
enum uuconf_porttype ttype;
{
qconn->qport = qport;
switch (qport == NULL ? UUCONF_PORTTYPE_STDIN : qport->uuconf_ttype)
switch (qport == NULL ? ttype : qport->uuconf_ttype)
{
case UUCONF_PORTTYPE_STDIN:
return fsysdep_stdin_init (qconn);
@ -65,8 +63,10 @@ fconn_init (qport, qconn)
case UUCONF_PORTTYPE_TLI:
return fsysdep_tli_init (qconn);
#endif
case UUCONF_PORTTYPE_PIPE:
return fsysdep_pipe_init (qconn);
default:
ulog (LOG_ERROR, "Unknown port type");
ulog (LOG_ERROR, "Unknown or unsupported port type");
return FALSE;
}
}
@ -202,8 +202,9 @@ fconn_close (qconn, puuconf, qdialer, fsuccess)
fret = (*qconn->qcmds->pfclose) (qconn, puuconf, qdialer, fsuccess);
/* Make sure any signal reporting has been done before we set
fLog_sighup back to TRUE. */
/* Ignore any SIGHUP we may have gotten, and make sure any signal
reporting has been done before we reset fLog_sighup. */
afSignal[INDEXSIG_SIGHUP] = FALSE;
ulog (LOG_ERROR, (const char *) NULL);
fLog_sighup = TRUE;
@ -211,17 +212,6 @@ fconn_close (qconn, puuconf, qdialer, fsuccess)
return fret;
}
/* Reset the connection. */
boolean
fconn_reset (qconn)
struct sconnection *qconn;
{
DEBUG_MESSAGE0 (DEBUG_PORT, "fconn_reset: Resetting connection");
return (*qconn->qcmds->pfreset) (qconn);
}
/* Dial out on the connection. */
@ -347,7 +337,7 @@ fconn_break (qconn)
{
boolean (*pfbreak) P((struct sconnection *));
pfbreak = *qconn->qcmds->pfbreak;
pfbreak = qconn->qcmds->pfbreak;
if (pfbreak == NULL)
return TRUE;
@ -419,7 +409,112 @@ iconn_baud (qconn)
return (*pibaud) (qconn);
}
/* Modem dialing routines. */
/* Run through a dialer sequence. The pzdialer argument is a list of
strings, which are considered in dialer/token pairs. The dialer
string names a dialer to use. The token string is what \D and \T
in the chat script expand to. If there is no token for the last
dialer, the zphone argument is used. The qdialer argument is
filled in with information for the first dialer, and *ptdialerfound
is set to whether the information should be freed or not. However,
if *ptdialerfound is not DIALERFOUND_FALSE when this function is
called, then the information for the first dialer is already in
qdialer. */
boolean
fconn_dial_sequence (qconn, puuconf, pzdialer, qsys, zphone, qdialer,
ptdialerfound)
struct sconnection *qconn;
pointer puuconf;
char **pzdialer;
const struct uuconf_system *qsys;
const char *zphone;
struct uuconf_dialer *qdialer;
enum tdialerfound *ptdialerfound;
{
const char *zname;
boolean ffirst, ffreefirst;
if (qconn->qport == NULL)
zname = NULL;
else
zname = qconn->qport->uuconf_zname;
ffirst = TRUE;
ffreefirst = FALSE;
while (*pzdialer != NULL)
{
struct uuconf_dialer *q;
struct uuconf_dialer s;
const char *ztoken;
boolean ftranslate;
if (! ffirst)
q = &s;
else
q = qdialer;
if (! ffirst || *ptdialerfound == DIALERFOUND_FALSE)
{
int iuuconf;
iuuconf = uuconf_dialer_info (puuconf, *pzdialer, q);
if (iuuconf == UUCONF_NOT_FOUND)
{
ulog (LOG_ERROR, "%s: Dialer not found", *pzdialer);
if (ffreefirst)
(void) uuconf_dialer_free (puuconf, qdialer);
return FALSE;
}
else if (iuuconf != UUCONF_SUCCESS)
{
ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
if (ffreefirst)
(void) uuconf_dialer_free (puuconf, qdialer);
return FALSE;
}
if (ffirst)
{
*ptdialerfound = DIALERFOUND_FREE;
ffreefirst = TRUE;
}
}
++pzdialer;
ztoken = *pzdialer;
ftranslate = FALSE;
if (ztoken == NULL
|| strcmp (ztoken, "\\D") == 0)
ztoken = zphone;
else if (strcmp (ztoken, "\\T") == 0)
{
ztoken = zphone;
ftranslate = TRUE;
}
if (! fchat (qconn, puuconf, &q->uuconf_schat, qsys, q, ztoken,
ftranslate, zname, iconn_baud (qconn)))
{
if (q == &s)
(void) uuconf_dialer_free (puuconf, q);
if (ffreefirst)
(void) uuconf_dialer_free (puuconf, qdialer);
return FALSE;
}
if (ffirst)
ffirst = FALSE;
else
(void) uuconf_dialer_free (puuconf, q);
if (*pzdialer != NULL)
++pzdialer;
}
return TRUE;
}
/* Modem dialing routine. */
/*ARGSUSED*/
boolean
@ -431,88 +526,58 @@ fmodem_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound)
struct uuconf_dialer *qdialer;
enum tdialerfound *ptdialerfound;
{
char **pzdialer;
*ptdialerfound = DIALERFOUND_FALSE;
if (qconn->qport->uuconf_u.uuconf_smodem.uuconf_pzdialer != NULL)
pzdialer = qconn->qport->uuconf_u.uuconf_smodem.uuconf_pzdialer;
if (pzdialer != NULL && *pzdialer != NULL)
{
char **pz;
boolean ffirst;
int iuuconf;
boolean fret;
/* The pzdialer field is a sequence of dialer/token pairs. The
dialer portion names a dialer to use. The token portion is
what \D and \T in the chat script expand to. If there is no
token for the last dialer, the phone number for the system is
used. */
ffirst = TRUE;
pz = qconn->qport->uuconf_u.uuconf_smodem.uuconf_pzdialer;
while (*pz != NULL)
iuuconf = uuconf_dialer_info (puuconf, *pzdialer, qdialer);
if (iuuconf == UUCONF_NOT_FOUND)
{
int iuuconf;
struct uuconf_dialer *q;
struct uuconf_dialer s;
const char *ztoken;
boolean ftranslate;
if (! ffirst)
q = &s;
else
q = qdialer;
iuuconf = uuconf_dialer_info (puuconf, *pz, q);
if (iuuconf == UUCONF_NOT_FOUND)
{
ulog (LOG_ERROR, "%s: Dialer not found", *pz);
return FALSE;
}
else if (iuuconf != UUCONF_SUCCESS)
{
ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
return FALSE;
}
++pz;
ztoken = *pz;
ftranslate = FALSE;
if (ztoken == NULL
|| strcmp (ztoken, "\\D") == 0)
ztoken = zphone;
else if (strcmp (ztoken, "\\T") == 0)
{
ztoken = zphone;
ftranslate = TRUE;
}
if (! fcdo_dial (qconn, puuconf, q, ztoken, ftranslate))
{
(void) uuconf_dialer_free (puuconf, q);
if (! ffirst)
(void) uuconf_dialer_free (puuconf, qdialer);
return FALSE;
}
if (ffirst)
{
*ptdialerfound = DIALERFOUND_FREE;
ffirst = FALSE;
}
else
(void) uuconf_dialer_free (puuconf, q);
if (*pz != NULL)
++pz;
ulog (LOG_ERROR, "%s: Dialer not found", *pzdialer);
return FALSE;
}
else if (iuuconf != UUCONF_SUCCESS)
{
ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
return FALSE;
}
return TRUE;
*ptdialerfound = DIALERFOUND_FREE;
fret = (fsysdep_modem_begin_dial (qconn, qdialer)
&& fconn_dial_sequence (qconn, puuconf, pzdialer, qsys, zphone,
qdialer, ptdialerfound)
&& fsysdep_modem_end_dial (qconn, qdialer));
if (! fret)
(void) uuconf_dialer_free (puuconf, qdialer);
return fret;
}
else if (qconn->qport->uuconf_u.uuconf_smodem.uuconf_qdialer != NULL)
{
struct uuconf_dialer *q;
const char *zname;
q = qconn->qport->uuconf_u.uuconf_smodem.uuconf_qdialer;
*qdialer = *q;
*ptdialerfound = DIALERFOUND_TRUE;
return fcdo_dial (qconn, puuconf, q, zphone, FALSE);
if (qconn->qport == NULL)
zname = NULL;
else
zname = qconn->qport->uuconf_zname;
return (fsysdep_modem_begin_dial (qconn, q)
&& fchat (qconn, puuconf, &q->uuconf_schat, qsys, q,
zphone, FALSE, zname, iconn_baud (qconn))
&& fsysdep_modem_end_dial (qconn, q));
}
else
{
@ -520,33 +585,3 @@ fmodem_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound)
return FALSE;
}
}
/* Actually use a dialer. We set up the modem (which may include
opening the dialer device), run the chat script, and finish dealing
with the modem. */
static boolean
fcdo_dial (qconn, puuconf, qdial, zphone, ftranslate)
struct sconnection *qconn;
pointer puuconf;
struct uuconf_dialer *qdial;
const char *zphone;
boolean ftranslate;
{
const char *zname;
if (! fsysdep_modem_begin_dial (qconn, qdial))
return FALSE;
if (qconn->qport == NULL)
zname = NULL;
else
zname = qconn->qport->uuconf_zname;
if (! fchat (qconn, puuconf, &qdial->uuconf_schat,
(const struct uuconf_system *) NULL, qdial,
zphone, ftranslate, zname, iconn_baud (qconn)))
return FALSE;
return fsysdep_modem_end_dial (qconn, qdial);
}

View File

@ -1,7 +1,7 @@
/* conn.h
Header file for routines which manipulate connections.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#ifndef CONN_H
@ -121,8 +121,6 @@ struct sconncmds
pointer puuconf,
struct uuconf_dialer *qdialer,
boolean fsuccess));
/* Reset the connection so that another call may be accepted. */
boolean (*pfreset) P((struct sconnection *qconn));
/* Dial a number on a connection. This set *qdialer to the dialer
used, if any, and sets *ptdialerfound appropriately. The qsys
and zphone arguments are for the chat script. This field may be
@ -170,9 +168,11 @@ struct sconncmds
/* Initialize a connection. This must be called before any of the
other connection functions are called. It initializes the fields
of qconn. It returns FALSE on error. */
of qconn. If qport is NULL, this opens standard input as a port
using type ttype. This function returns FALSE on error. */
extern boolean fconn_init P((struct uuconf_port *qport,
struct sconnection *qconn));
struct sconnection *qconn,
enum uuconf_porttype ttype));
/* Free up connection data. */
extern void uconn_free P((struct sconnection *qconn));
@ -199,9 +199,6 @@ extern boolean fconn_close P((struct sconnection *qconn,
struct uuconf_dialer *qdialer,
boolean fsuccess));
/* Reset a connection such that another call may be accepted. */
extern boolean fconn_reset P((struct sconnection *q));
/* Dial out on a connection. The qsys and zphone arguments are for
the chat scripts; zphone is the phone number to dial. If qdialer
is not NULL, *qdialer will be set to the dialer information used if
@ -275,6 +272,15 @@ extern boolean fconn_carrier P((struct sconnection *qconn,
extern boolean fconn_run_chat P((struct sconnection *qconn,
char **pzprog));
/* Run through a dialer sequence. This is a support routine for the
port type specific dialing routines. */
extern boolean fconn_dial_sequence P((struct sconnection *qconn,
pointer puuconf, char **pzdialer,
const struct uuconf_system *qsys,
const char *zphone,
struct uuconf_dialer *qdialer,
enum tdialerfound *ptdialerfound));
/* Dialing out on a modem is partially system independent. This is
the modem dialing routine. */
extern boolean fmodem_dial P((struct sconnection *qconn, pointer puuconf,
@ -308,5 +314,6 @@ extern boolean fsysdep_tcp_init P((struct sconnection *qconn));
#if HAVE_TLI
extern boolean fsysdep_tli_init P((struct sconnection *qconn));
#endif
extern boolean fsysdep_pipe_init P((struct sconnection *qconn));
#endif /* ! defined (CONN_H) */

View File

@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char copy_rcsid[] = "$Id: copy.c,v 1.1 1993/08/04 19:30:44 jtc Exp $";
const char copy_rcsid[] = "$Id: copy.c,v 1.2 1994/10/24 22:17:13 jtc Exp $";
#endif
#include "uudefs.h"

View File

@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
/* The user settable variables supported by cu. */

View File

@ -1,7 +1,7 @@
/* log.c
Routines to add entries to the log files.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,22 +20,25 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char log_rcsid[] = "$Id: log.c,v 1.1 1993/08/04 19:30:50 jtc Exp $";
const char log_rcsid[] = "$Id: log.c,v 1.2 1994/10/24 22:17:16 jtc Exp $";
#endif
#include <ctype.h>
#include <errno.h>
#if ANSI_C
#if HAVE_STDARG_H
#include <stdarg.h>
#endif
#if HAVE_TIME_H
#if TM_IN_SYS_TIME
#include <sys/time.h>
#else
#include <time.h>
#endif
@ -45,8 +48,12 @@ const char log_rcsid[] = "$Id: log.c,v 1.1 1993/08/04 19:30:50 jtc Exp $";
/* Local functions. */
__inline__ static char *zstpcpy P((char *zto, const char *zfrom));
static const char *zldate_and_time P((void));
/* Program name. Set by main function. */
const char *zProgram;
/* Log file name. */
static const char *zLogfile;
@ -86,9 +93,6 @@ static FILE *eLdebug;
/* Whether we've tried to open the debugging file. */
static boolean fLdebug_tried;
/* Whether we've written out any debugging information. */
static boolean fLdebugging;
#endif
/* Statistics file name. */
@ -212,11 +216,24 @@ ulog_device (zdevice)
zLdevice = zbufcpy (zdevice);
}
/* A helper function for ulog. */
__inline__ static char *
zstpcpy (zto, zfrom)
char *zto;
const char *zfrom;
{
while ((*zto++ = *zfrom++) != '\0')
;
return zto - 1;
}
/* Make a log entry. We make a token concession to non ANSI_C systems,
but it clearly won't always work. */
#if ! ANSI_C
#if ! HAVE_PROTOTYPES || ! HAVE_STDARG_H
#undef HAVE_VFPRINTF
#define HAVE_VFPRINTF 0
#endif
/*VARARGS2*/
@ -235,7 +252,11 @@ ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
#endif
FILE *e, *edebug;
boolean fstart, fend;
const char *zhdr, *zstr;
const char *zhdr;
char *zprefix;
register char *zset;
char *zformat;
char *zfrom;
/* Log any received signal. We do it this way to avoid calling ulog
from the signal handler. A few routines call ulog to get this
@ -276,11 +297,10 @@ ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
if (fLfile
&& eLdebug == NULL
&& ! fLdebug_tried
&& (fLdebugging || (int) ttype >= (int) LOG_DEBUG))
&& iDebug != 0)
{
fLdebug_tried = TRUE;
eLdebug = esysdep_fopen (zLdebugfile, FALSE, TRUE, TRUE);
fLdebugging = TRUE;
}
#endif /* DEBUG > 1 */
@ -307,6 +327,8 @@ ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
#else /* HAVE_HDB_LOGGING */
{
const char *zsys;
char *zbase;
char *zlower;
char *zfile;
/* We want to write to .Log/program/system, e.g.
@ -316,11 +338,23 @@ ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
else
zsys = zLsystem;
zbase = zsysdep_base_name (zProgram);
if (zbase == NULL)
zbase = zbufcpy (zProgram);
/* On some systems the native uusched will invoke uucico
with an upper case argv[0]. We work around that by
forcing the filename to lower case here. */
for (zlower = zbase; *zlower != '\0'; zlower++)
if (isupper (*zlower))
*zlower = tolower (*zlower);
zfile = zbufalc (strlen (zLogfile)
+ strlen (abProgram)
+ strlen (zbase)
+ strlen (zsys)
+ 1);
sprintf (zfile, zLogfile, abProgram, zsys);
sprintf (zfile, zLogfile, zbase, zsys);
ubuffree (zbase);
eLlog = esysdep_fopen (zfile, TRUE, TRUE, TRUE);
ubuffree (zfile);
}
@ -328,10 +362,13 @@ ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
if (eLlog == NULL)
{
/* We can't open the log file. We don't even have a
safe way to report this problem, since we may not be
able to write to stderr (it may, for example, be
attached to the incoming call). */
/* We can't open the log file. We report the problem to
stderr. This is not ideal, since if this is uucico
running on an inbound call stderr is actually
connected to a remote system, but is better than
doing nothing. */
fprintf (stderr, "%s: %s: can not open log file\n",
zProgram, zLogfile);
if (pfLfatal != NULL)
(*pfLfatal) ();
usysdep_exit (FALSE);
@ -392,99 +429,122 @@ ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
break;
}
if (fstart)
if (! fstart)
zprefix = zbufcpy ("");
else
{
if (! fLfile)
{
fprintf (e, "%s: ", abProgram);
if (edebug != NULL)
fprintf (edebug, "%s: ", abProgram);
zprefix = zbufalc (strlen (zProgram) + 3);
sprintf (zprefix, "%s: ", zProgram);
}
else
{
zprefix = zbufalc (strlen (zProgram)
+ (zLsystem == NULL ? 1 : strlen (zLsystem))
+ (zLuser == NULL ? 4 : strlen (zLuser))
+ sizeof "1991-12-31 12:00:00.00"
+ strlen (zhdr)
+ 100);
zset = zprefix;
#if HAVE_TAYLOR_LOGGING
fprintf (e, "%s ", abProgram);
if (edebug != NULL)
fprintf (edebug, "%s ", abProgram);
{
char *zbase;
zbase = zsysdep_base_name (zProgram);
if (zbase == NULL)
zbase = zbufcpy (zProgram);
zset = zstpcpy (zset, zbase);
*zset++ = ' ';
ubuffree (zbase);
}
#else /* ! HAVE_TAYLOR_LOGGING */
fprintf (e, "%s ", zLuser == NULL ? "uucp" : zLuser);
if (edebug != NULL)
fprintf (edebug, "%s ", zLuser == NULL ? "uucp" : zLuser);
zset = zstpcpy (zset, zLuser == NULL ? "uucp" : zLuser);
*zset++ = ' ';
#endif /* HAVE_TAYLOR_LOGGING */
fprintf (e, "%s ", zLsystem == NULL ? "-" : zLsystem);
if (edebug != NULL)
fprintf (edebug, "%s ", zLsystem == NULL ? "-" : zLsystem);
zset = zstpcpy (zset, zLsystem == NULL ? "-" : zLsystem);
*zset++ = ' ';
#if HAVE_TAYLOR_LOGGING
fprintf (e, "%s ", zLuser == NULL ? "-" : zLuser);
if (edebug != NULL)
fprintf (edebug, "%s ", zLuser == NULL ? "-" : zLuser);
zset = zstpcpy (zset, zLuser == NULL ? "-" : zLuser);
*zset++ = ' ';
#endif /* HAVE_TAYLOR_LOGGING */
zstr = zldate_and_time ();
fprintf (e, "(%s", zstr);
if (edebug != NULL)
fprintf (edebug, "(%s", zstr);
*zset++ = '(';
zset = zstpcpy (zset, zldate_and_time ());
if (iLid != 0)
{
#if ! HAVE_HDB_LOGGING
#if HAVE_TAYLOR_LOGGING
fprintf (e, " %d", iLid);
if (edebug != NULL)
fprintf (edebug, " %d", iLid);
sprintf (zset, " %d", iLid);
#else /* ! HAVE_TAYLOR_LOGGING */
fprintf (e, "-%d", iLid);
if (edebug != NULL)
fprintf (edebug, "-%d", iLid);
sprintf (zset, "-%d", iLid);
#endif /* ! HAVE_TAYLOR_LOGGING */
#else /* HAVE_HDB_LOGGING */
/* I assume that the second number here is meant to be
some sort of file sequence number, and that it should
correspond to the sequence number in the statistics
file. I don't have any really convenient way to do
this, so I won't unless somebody thinks it's very
important. */
fprintf (e, ",%d,%d", iLid, 0);
if (edebug != NULL)
fprintf (edebug, ",%d,%d", iLid, 0);
sprintf (zset, ",%d,%d", iLid, 0);
#endif /* HAVE_HDB_LOGGING */
zset += strlen (zset);
}
fprintf (e, ") ");
if (edebug != NULL)
fprintf (edebug, ") ");
#if QNX_LOG_NODE_ID
sprintf (zset, " %ld", (long) getnid ());
zset += strlen (zset);
#endif
fprintf (e, "%s", zhdr);
if (edebug != NULL)
fprintf (edebug, "%s", zhdr);
*zset++ = ')';
*zset++ = ' ';
strcpy (zset, zhdr);
}
}
zformat = zbufalc (2 * strlen (zprefix) + strlen (zmsg) + 2);
zset = zformat;
zfrom = zprefix;
while (*zfrom != '\0')
{
if (*zfrom == '%')
*zset++ = '%';
*zset++ = *zfrom++;
}
ubuffree (zprefix);
zset = zstpcpy (zset, zmsg);
if (fend)
{
*zset++ = '\n';
*zset = '\0';
}
#if HAVE_VFPRINTF
va_start (parg, zmsg);
vfprintf (e, zmsg, parg);
vfprintf (e, zformat, parg);
va_end (parg);
if (edebug != NULL)
{
va_start (parg, zmsg);
vfprintf (edebug, zmsg, parg);
vfprintf (edebug, zformat, parg);
va_end (parg);
}
#else /* ! HAVE_VFPRINTF */
fprintf (e, zmsg, a, b, c, d, f, g, h, i, j);
fprintf (e, zformat, a, b, c, d, f, g, h, i, j);
if (edebug != NULL)
fprintf (edebug, zmsg, a, b, c, d, f, g, h, i, j);
fprintf (edebug, zformat, a, b, c, d, f, g, h, i, j);
#endif /* ! HAVE_VFPRINTF */
if (fend)
{
fprintf (e, "\n");
if (edebug != NULL)
fprintf (edebug, "\n");
}
ubuffree (zformat);
(void) fflush (e);
if (edebug != NULL)
@ -581,13 +641,24 @@ ustats (fsucceeded, zuser, zsystem, fsent, cbytes, csecs, cmicros, fmaster)
cbps = 0;
else
{
long cmillis;
long cmillis, cdiv, crem;
/* This computation will not overflow provided csecs < 2147483
and cbytes and cbps both fit in a long. */
/* Compute ((csecs * 1000) / cmillis) using integer division.
Where DIV is integer division, we know
a = (a DIV b) * b + a % b
so
a / b = (a DIV b) + (a % b) / b
We compute the latter with a as csecs and b as cmillis,
mixing the multiplication by 1000. */
cmillis = csecs * 1000 + cmicros / 1000;
cbps = ((cbytes / cmillis) * 1000
+ ((cbytes % cmillis) * 1000) / cmillis);
cdiv = (cbytes / cmillis) * 1000;
crem = (cbytes % cmillis) * 1000;
cbps = cdiv + (crem / cmillis);
if (cmillis < 0 || cdiv < 0 || crem < 0 || cbps < 0)
{
/* We overflowed using milliseconds, so use seconds. */
cbps = cbytes / (csecs + ((cmicros > 500000L) ? 1 : 0));
}
}
if (eLstats == NULL)
@ -602,11 +673,12 @@ ustats (fsucceeded, zuser, zsystem, fsent, cbytes, csecs, cmicros, fmaster)
#if HAVE_TAYLOR_LOGGING
fprintf (eLstats,
"%s %s (%s) %s%s %ld bytes in %ld.%03ld seconds (%ld bytes/sec)\n",
"%s %s (%s) %s%s %ld bytes in %ld.%03ld seconds (%ld bytes/sec) on port %s\n",
zuser, zsystem, zldate_and_time (),
fsucceeded ? "" : "failed after ",
fsent ? "sent" : "received",
cbytes, csecs, cmicros / 1000, cbps);
cbytes, csecs, cmicros / 1000, cbps,
zLdevice == NULL ? "unknown" : zLdevice);
#endif /* HAVE_TAYLOR_LOGGING */
#if HAVE_V2_LOGGING
fprintf (eLstats,
@ -625,18 +697,16 @@ ustats (fsucceeded, zuser, zsystem, fsent, cbytes, csecs, cmicros, fmaster)
probably correspond to the sequence number in the log file, but
that is currently always 0; using this fake sequence number
will still at least reveal which transfers are from different
calls. We don't report a failed data transfer with this
format. */
if (! fsucceeded)
return;
calls. */
++iseq;
fprintf (eLstats,
"%s!%s %c (%s) (C,%d,%d) [%s] %s %ld / %ld.%03ld secs, %ld %s\n",
"%s!%s %c (%s) (C,%d,%d) [%s] %s %ld / %ld.%03ld secs, %ld%s%s\n",
zsystem, zuser, fmaster ? 'M' : 'S', zldate_and_time (),
iLid, iseq, zLdevice == NULL ? "unknown" : zLdevice,
fsent ? "->" : "<-",
cbytes, csecs, cmicros / 1000, cbps,
"bytes/sec");
" bytes/sec",
fsucceeded ? "" : " [PARTIAL FILE]");
}
#endif /* HAVE_HDB_LOGGING */

View File

@ -1,7 +1,7 @@
/* policy.h
Configuration file for policy decisions. To be edited on site.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
/* This header file contains macro definitions which must be set by
@ -72,14 +72,19 @@
figure out what's happening if something goes wrong. */
#if HAVE_BSD_TTY + HAVE_SYSV_TERMIO + HAVE_POSIX_TERMIOS == 0
#ifdef __QNX__
#undef HAVE_POSIX_TERMIOS
#define HAVE_POSIX_TERMIOS 1
#else /* ! defined (__QNX__) */
#if HAVE_CBREAK
#undef HAVE_BSD_TTY
#define HAVE_BSD_TTY 1
#else
#else /* ! HAVE_CBREAK */
#undef HAVE_SYSV_TERMIO
#define HAVE_SYSV_TERMIO 1
#endif
#endif
#endif /* ! HAVE_CBREAK */
#endif /* ! defined (__QNX__) */
#endif /* HAVE_BSD_TTY + HAVE_SYSV_TERMIO + HAVE_POSIX_TERMIOS == 0 */
/* On some systems a write to a serial port will block even if the
file descriptor has been set to not block. File transfer can be
@ -155,12 +160,23 @@
#define HAVE_STRIP_BUG 0
#if HAVE_BSD_TTY
#ifdef __ultrix__
#ifndef ultrix
#define ultrix
#endif
#endif
#ifdef ultrix
#undef HAVE_STRIP_BUG
#define HAVE_STRIP_BUG 1
#endif
#endif
/* If your system implements full duplex pipes, set
HAVE_FULLDUPLEX_PIPES to 1. Everything should work fine if you
leave it set to 0, but setting it to 1 can be slightly more
efficient. */
#define HAVE_FULLDUPLEX_PIPES 0
/* TIMES_TICK is the fraction of a second which times(2) returns (for
example, if times returns 100ths of a second TIMES_TICK should be
set to 100). On a true POSIX system (one which has the sysconf
@ -206,6 +222,34 @@
have the nap function. */
#define HAVE_HUNDREDTHS_NAP 0
/* Set MAIL_PROGRAM to a program which can be used to send mail. It
will be used for mail to both local and remote users. Set
MAIL_PROGRAM_TO_BODY to 1 if the recipient should be specified as a
To: line in the body of the message; otherwise, the recipient will
be provided as an argument to MAIL_PROGRAM. Set
MAIL_PROGRAM_SUBJECT_BODY if the subject should be specified as a
Subject: line in the body of the message; otherwise, the subject
will be provided using the -s option to MAIL_PROGRAM (if your mail
program does not support the -s option, you must set
MAIL_PROGRAM_SUBJECT_BODY to 1). If your system uses sendmail, use
the sendmail choice below. Otherwise, select one of the other
choices as appropriate. */
#if 1
#define MAIL_PROGRAM "/usr/sbin/sendmail -t"
#define MAIL_PROGRAM_TO_BODY 1
#define MAIL_PROGRAM_SUBJECT_BODY 1
#endif
#if 0
#define MAIL_PROGRAM "/usr/ucb/mail"
#define MAIL_PROGRAM_TO_BODY 0
#define MAIL_PROGRAM_SUBJECT_BODY 0
#endif
#if 0
#define MAIL_PROGRAM "/bin/mail"
#define MAIL_PROGRAM_TO_BODY 0
#define MAIL_PROGRAM_SUBJECT_BODY 1
#endif
/* Set PS_PROGRAM to the program to run to get a process status,
including the arguments to pass it. This is used by ``uustat -p''.
Set HAVE_PS_MULTIPLE to 1 if a comma separated list of process
@ -229,6 +273,13 @@
#define PS_PROGRAM "/bin/ps -flp"
#define HAVE_PS_MULTIPLE 1
#endif
#ifdef __QNX__
/* Use this for QNX, along with HAVE_QNX_LOCKFILES. */
#undef PS_PROGRAM
#undef HAVE_PS_MULTIPLE
#define PS_PROGRAM "/bin/ps -l -n -p"
#define HAVE_PS_MULTIPLE 0
#endif
/* If you use other programs that also lock devices, such as cu or
uugetty, the other programs and UUCP must agree on whether a device
@ -269,20 +320,91 @@
device itself, and zzz is the minor device number of the port
device.
Sequent DYNIX/ptx (but perhaps not Dynix 3.x) uses yet another
naming convention. The lock file for /dev/ttyXA/XAAP is named
LCK..ttyXAAP.
Coherent use a completely different method of terminal locking.
See unix/cohtty for details. For locks other than for terminals,
HDB type lock files are used. */
HDB type lock files are used.
QNX lock files are similar to HDB lock files except that the node
ID must be stored in addition to the process ID and for serial
devices the node ID must be included in the lock file name. QNX
boxes are generally used in bunches, and all of them behave like
one big machine to some extent. Thus, processes on different
machines will be sharing the files in the spool directory. To
detect if a process has died and a lock is thus stale, you need the
node ID of the process as well as the process ID. The process ID
is stored as a number written using ASCII digits padded to 10
characters, followed by a space, followed by the node ID written
using ASCII digits padded to 10 characters, followed by a newline.
The format for QNX lock files was made up just for Taylor UUCP.
QNX doesn't come with a version of UUCP. */
#define HAVE_V2_LOCKFILES 0
#define HAVE_HDB_LOCKFILES 1
#define HAVE_HDB_LOCKFILES 0
#define HAVE_SCO_LOCKFILES 0
#define HAVE_SVR4_LOCKFILES 0
#define HAVE_SEQUENT_LOCKFILES 0
#define HAVE_COHERENT_LOCKFILES 0
#define HAVE_QNX_LOCKFILES 0
/* This tries to pick a default based on preprocessor definitions.
Ignore it if you have explicitly set one of the above values. */
#if HAVE_V2_LOCKFILES + HAVE_HDB_LOCKFILES + HAVE_SCO_LOCKFILES + HAVE_SVR4_LOCKFILES + HAVE_SEQUENT_LOCKFILES + HAVE_COHERENT_LOCKFILES + HAVE_QNX_LOCKFILES == 0
#ifdef __QNX__
#undef HAVE_QNX_LOCKFILES
#define HAVE_QNX_LOCKFILES 1
#else /* ! defined (__QNX__) */
#ifdef __COHERENT__
#undef HAVE_COHERENT_LOCKFILES
#define HAVE_COHERENT_LOCKFILES 1
#else /* ! defined (__COHERENT__) */
#ifdef _SEQUENT_
#undef HAVE_SEQUENT_LOCKFILES
#define HAVE_SEQUENT_LOCKFILES 1
#else /* ! defined (_SEQUENT) */
#ifdef sco
#undef HAVE_SCO_LOCKFILES
#define HAVE_SCO_LOCKFILES 1
#else /* ! defined (sco) */
#ifdef __svr4__
#undef HAVE_SVR4_LOCKFILES
#define HAVE_SVR4_LOCKFILES 1
#else /* ! defined (__svr4__) */
/* Final default is HDB. There's no way to tell V2 from HDB. */
#undef HAVE_HDB_LOCKFILES
#define HAVE_HDB_LOCKFILES 1
#endif /* ! defined (__svr4__) */
#endif /* ! defined (sco) */
#endif /* ! defined (_SEQUENT) */
#endif /* ! defined (__COHERENT__) */
#endif /* ! defined (__QNX__) */
#endif /* no LOCKFILES define */
/* If your system supports Internet mail addresses (which look like
user@host.domain rather than system!user), HAVE_INTERNET_MAIL
should be set to 1. This is checked by uuxqt when sending error
(or success, if requested) notifications to the person who
submitted the job. */
should be set to 1. This is checked by uuxqt and uustat when
sending notifications to the person who submitted the job.
If your system does not understand addresses of the form user@host,
you must set HAVE_INTERNET_MAIL to 0.
If your system does not understand addresses of the form host!user,
which is unlikely, you must set HAVE_INTERNET_MAIL to 1.
If your system sends mail addressed to "A!B@C" to host C (i.e., it
parses the address as "(A!B)@C"), you must set HAVE_INTERNET_MAIL
to 1.
If your system sends mail addressed to "A!B@C" to host A (i.e., it
parses the address as "A!(B@C)"), you must set HAVE_INTERNET_MAIL
to 0.
Note that in general it is best to avoid addresses of the form
"A!B@C" because of this ambiguity of precedence. UUCP will not
intentionally generate addresses of this form, but it can occur in
certain rather complex cases. */
#define HAVE_INTERNET_MAIL 1
/* Adminstrative decisions. */
@ -303,6 +425,16 @@
file size will be very helpful. */
#define DEBUG 2
/* Set HAVE_ENCRYPTED_PASSWORDS to 1 if you want login passwords to be
encrypted before comparing them against the values in the file.
This only applies when uucico is run with the -l or -e switches and
is doing its own login prompting. Note that the passwords used are
from the UUCP password file, not the system /etc/passwd file. See
the documentation for further details. If you set this, you are
responsible for encrypting the passwords in the UUCP password file.
The function crypt will be used to do comparisons. */
#define HAVE_ENCRYPTED_PASSWORDS 0
/* Set the default grade to use for a uucp command if the -g option is
not used. The grades, from highest to lowest, are 0 to 9, A to Z,
a to z. */
@ -351,6 +483,15 @@
#define SPOOLDIR_SVR4 0
#define SPOOLDIR_TAYLOR 1
/* The status file generated by UUCP can use either the traditional
HDB upper case comments or new easier to read lower case comments.
This affects the display of uustat -m or uustat -q. Some
third-party programs read these status files and expect them to be
in a certain format. The default is to use the traditional
comments when using an HDB or SVR4 spool directory, and to use
lower case comments otherwise. */
#define USE_TRADITIONAL_STATUS (SPOOLDIR_HDB || SPOOLDIR_SVR4)
/* You must select which type of logging you want by setting exactly
one of the following to 1. These control output to the log file
and to the statistics file.
@ -392,6 +533,27 @@
#define HAVE_V2_LOGGING 0
#define HAVE_HDB_LOGGING 0
/* If QNX_LOG_NODE_ID is set to 1, log messages will include the QNX
node ID just after the process ID. This is a policy decision
because it changes the log file entry format, which can break other
programs (e.g., some of the ones in the contrib directory) which
expect to read the standard log file format. */
#ifdef __QNX__
#define QNX_LOG_NODE_ID 1
#else
#define QNX_LOG_NODE_ID 0
#endif
/* If LOG_DEVICE_PREFIX is 1, log messages will give the full
pathname of a device rather than just the final component. This is
important because on QNX //2/dev/ser2 refers to a different device
than //4/dev/ser2. */
#ifdef __QNX__
#define LOG_DEVICE_PREFIX 1
#else
#define LOG_DEVICE_PREFIX 0
#endif
/* If you would like the log, debugging and statistics files to be
closed after each message, set CLOSE_LOGFILES to 1. This will
permit the log files to be easily moved. If a log file does not

View File

@ -1,7 +1,7 @@
/* prot.c
Protocol support routines to move commands and data around.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,18 +20,19 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char prot_rcsid[] = "$Id: prot.c,v 1.1 1993/08/04 19:30:55 jtc Exp $";
const char prot_rcsid[] = "$Id: prot.c,v 1.2 1994/10/24 22:17:22 jtc Exp $";
#endif
#include <errno.h>
#include "uudefs.h"
#include "uuconf.h"
#include "system.h"
#include "conn.h"
#include "prot.h"
@ -76,6 +77,9 @@ fsend_data (qconn, zsend, csend, fdoread)
--crec;
}
if (crec == 0)
return fconn_write (qconn, zsend, csend);
csent = csend;
if (! fconn_io (qconn, zsend, &csent, abPrecbuf + iPrecend, &crec))

View File

@ -1,7 +1,7 @@
/* prot.h
Protocol header file.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
/* We need the definition of uuconf_cmdtab to declare the protocol
@ -49,6 +49,8 @@ struct sprotocol
int ireliable;
/* The maximum number of channels this protocol can support. */
int cchans;
/* Whether files may be reliably restarted using this protocol. */
boolean frestart;
/* Protocol parameter commands. */
struct uuconf_cmdtab *qcmds;
/* A routine to start the protocol. If *pzlog is set to be
@ -163,6 +165,7 @@ extern boolean fijstart P((struct sdaemon *qdaemon, char **pzlog,
extern struct uuconf_cmdtab asGproto_params[];
extern boolean fgstart P((struct sdaemon *qdaemon, char **pzlog));
extern boolean fbiggstart P((struct sdaemon *qdaemon, char **pzlog));
extern boolean fvstart P((struct sdaemon *qdaemon, char **pzlog));
extern boolean fgshutdown P((struct sdaemon *qdaemon));
extern boolean fgsendcmd P((struct sdaemon *qdaemon, const char *z,
int ilocal, int iremote));

View File

@ -1,7 +1,7 @@
/* sysh.unx -*- C -*-
The header file for the UNIX system dependent routines.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#ifndef SYSH_UNX_H
@ -34,14 +34,9 @@ struct uuconf_system;
struct sconnection;
#endif
/* Make sure the defines do not conflict. These are in this file
because they are Unix dependent. */
#if HAVE_V2_LOCKFILES + HAVE_HDB_LOCKFILES + HAVE_SCO_LOCKFILES + HAVE_SVR4_LOCKFILES + HAVE_COHERENT_LOCKFILES != 1
#error LOCKFILES define not set or duplicated
#endif
/* SCO and SVR4 lockfiles are basically just like HDB lockfiles. */
#if HAVE_SCO_LOCKFILES || HAVE_SVR4_LOCKFILES
/* SCO, SVR4 and Sequent lockfiles are basically just like HDB
lockfiles. */
#if HAVE_SCO_LOCKFILES || HAVE_SVR4_LOCKFILES || HAVE_SEQUENT_LOCKFILES
#undef HAVE_HDB_LOCKFILES
#define HAVE_HDB_LOCKFILES 1
#endif
@ -230,6 +225,9 @@ typedef struct termios sterminal;
failed. */
#define PRESERVEDIR ".Preserve"
/* The name of the directory to which we move corrupt files. */
#define CORRUPTDIR ".Corrupt"
/* The length of the sequence number used in a file name. */
#define CSEQLEN (4)
@ -284,6 +282,10 @@ typedef struct termios sterminal;
#define S_IXOTH 0001
#endif
#if STAT_MACROS_BROKEN
#undef S_ISDIR
#endif
#ifndef S_ISDIR
#ifdef S_IFDIR
#define S_ISDIR(i) (((i) & S_IFMT) == S_IFDIR)
@ -351,12 +353,16 @@ struct ssysdep_conn
{
/* File descriptor. */
int o;
/* File descriptor to read from (used by stdin and pipe port types). */
int ord;
/* File descriptor to write to (used by stdin and pipe port types). */
int owr;
/* Device name. */
char *zdevice;
/* File status flags. */
int iflags;
/* File status flags for descriptor 1 (-1 if not standard input). */
int istdout_flags;
/* File status flags for write descriptor (-1 if not used). */
int iwr_flags;
/* Hold the real descriptor when using a dialer device. */
int ohold;
/* TRUE if this is a terminal and the remaining fields are valid. */
@ -369,6 +375,9 @@ struct ssysdep_conn
sterminal sorig;
/* Current terminal settings. */
sterminal snew;
/* Process ID of currently executing pipe command, or parent process
of forked TCP or TLI server, or -1. */
pid_t ipid;
#if HAVE_COHERENT_LOCKFILES
/* On Coherent we need to hold on to the real port name which will
be used to enable the port. Ick. */
@ -428,6 +437,19 @@ extern FILE *espopen P((const char **pazargs, boolean frd,
prototype. */
extern int ixswait P((unsigned long ipid, const char *zreport));
/* Read from a connection using two file descriptors. */
extern boolean fsdouble_read P((struct sconnection *qconn, char *zbuf,
size_t *pclen, size_t cmin, int ctimeout,
boolean freport));
/* Write to a connection using two file descriptors. */
extern boolean fsdouble_write P((struct sconnection *qconn,
const char *zbuf, size_t clen));
/* Run a chat program on a connection using two file descriptors. */
extern boolean fsdouble_chat P((struct sconnection *qconn,
char **pzprog));
/* Find a spool file in the spool directory. For a local file, the
bgrade argument is the grade of the file. This is needed for
SPOOLDIR_SVR4. */
@ -435,7 +457,7 @@ extern char *zsfind_file P((const char *zsimple, const char *zsystem,
int bgrade));
/* Return the grade given a sequence number. */
extern char bsgrade P((pointer pseq));
extern int bsgrade P((pointer pseq));
/* Lock a string. */
extern boolean fsdo_lock P((const char *, boolean fspooldir,
@ -493,7 +515,7 @@ extern int dup2 P((int oold, int onew));
#if ! HAVE_FTW
extern int ftw P((const char *zdir,
int (*pfn) P((const char *zfile,
const struct stat *qstat,
struct stat *qstat,
int iflag)),
int cdescriptors));
#endif

View File

@ -2,7 +2,7 @@
Header file for system dependent stuff in the Taylor UUCP package.
This file is not itself system dependent.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -21,7 +21,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#ifndef SYSTEM_H
@ -73,6 +73,11 @@ extern size_t cSysdep_max_name_len;
means, on Unix, this program is normally installed setuid. */
#define INIT_SUID (04)
/* Do not close all open descriptors. This is not used by the UUCP
code, but it is used by other programs which share some of the
system dependent libraries. */
#define INIT_NOCLOSE (010)
extern void usysdep_initialize P((pointer puuconf, int iflags));
/* Exit the program. The fsuccess argument indicates whether to
@ -172,9 +177,13 @@ extern const char *zsysdep_port_name P((boolean *pftcp_port));
desirable on other systems. This should always return an absolute
path name, probably in the public directory. It should return NULL
on error; otherwise the return value should be allocated using
zbufcpy or zbufalc. */
zbufcpy or zbufalc. If pfbadname is not NULL, then if the function
returns NULL *pfbadname should be set to TRUE if the error is just
that the file name is badly specified; *pfbadname should be set to
FALSE for some sort of internal error. */
extern char *zsysdep_local_file P((const char *zname,
const char *zpubdir));
const char *zpubdir,
boolean *pfbadname));
/* Return whether a file name is in a directory, and check for read or
write access. This should check whether zfile is within zdir (or
@ -201,17 +210,16 @@ extern boolean fsysdep_in_directory P((const char *zfile,
return error. */
extern boolean fsysdep_file_exists P((const char *zfile));
/* Start up a program. The code expects fsysdep_run to return after
doing a fork, but at least for now everything will work fine if it
does not (on a system which does not support forking). The three
string arguments may be catenated together to form the program to
execute; I did it this way to make it easy to call execl(2), and
because I never needed more than two arguments. The program will
always be "uucico" or "uuxqt". The return value will be passed
directly to usysdep_exit, and should be TRUE on success, FALSE on
/* Start up a program. If the ffork argument is true, this should
spawn a new process and return. If the ffork argument is false,
this may either return or not. The three string arguments may be
catenated together to form the program to execute; I did it this
way to make it easy to call execl(2), and because I never needed
more than two arguments. The program will always be "uucico" or
"uuxqt". The return value should be TRUE on success, FALSE on
error. */
extern boolean fsysdep_run P((const char *zprogram, const char *zarg1,
const char *zarg2));
extern boolean fsysdep_run P((boolean ffork, const char *zprogram,
const char *zarg1, const char *zarg2));
/* Send a mail message. This function will be passed an array of
strings. All necessary newlines are already included; the strings
@ -329,6 +337,12 @@ extern boolean fsysdep_did_work P((pointer pseq));
the file. */
extern const char *zsysdep_save_temp_file P((pointer pseq));
/* Save a file in a location used to hold corrupt files. This is
called if a bad execution file is found by uuxqt. This should
return the new name of the file (allocated by zbufalc), or NULL if
the move failed (in which the original file should remain). */
extern char *zsysdep_save_corrupt_file P((const char *zfile));
/* Cleanup anything left over by fsysdep_get_work_init and
fsysdep_get_work. This may be called even though
fsysdep_get_work_init has not been. */
@ -397,23 +411,27 @@ extern openfile_t esysdep_open_send P((const struct uuconf_system *qsys,
/* Return a temporary file name to receive into. This file will be
opened by esysdep_open_receive. The qsys argument is the system
the file is coming from, the zto argument is the name the file will
have after it has been fully received, and the ztemp argument, if
it is not NULL, is from the command sent by the remote system. The
return value must be freed using ubuffree. The function should
return NULL on error. */
have after it has been fully received, the ztemp argument, if it is
not NULL, is from the command sent by the remote system, and the
frestart argument is TRUE if the protocol and remote system permit
file transfers to be restarted. The return value must be freed
using ubuffree. The function should return NULL on error. */
extern char *zsysdep_receive_temp P((const struct uuconf_system *qsys,
const char *zfile,
const char *ztemp));
const char *ztemp,
boolean frestart));
/* Open a file to receive from another system. The zreceive argument
is the return value of zsysdep_receive_temp with the same qsys,
zfile and ztemp arguments. If the function can determine that this
file has already been partially received, it should set *pcrestart
to the number of bytes that have been received. If the file has
not been partially received, *pcrestart should be set to -1. The
function should return EFILECLOSED on error. After the file is
written, fsysdep_move_file will be called to move the file to its
final destination, and to set the correct file mode. */
not been partially received, *pcrestart should be set to -1.
pcrestart will be passed in as NULL if file restart is not
supported by the protocol or the remote system. The function
should return EFILECLOSED on error. After the file is written,
fsysdep_move_file will be called to move the file to its final
destination, and to set the correct file mode. */
extern openfile_t esysdep_open_receive P((const struct uuconf_system *qsys,
const char *zto,
const char *ztemp,
@ -428,8 +446,8 @@ extern openfile_t esysdep_open_receive P((const struct uuconf_system *qsys,
this should make sure the directory is writeable by the user zuser
(if zuser is NULL, then it must be writeable by any user); this is
to avoid a window of vulnerability between fsysdep_in_directory and
fsysdep_move_file. This function should return FALSE on error; the
zorig file should be removed even if an error occurs. */
fsysdep_move_file. This function should return FALSE on error, in
which case the zorig file should still exist. */
extern boolean fsysdep_move_file P((const char *zorig, const char *zto,
boolean fmkdirs, boolean fpublic,
boolean fcheck, const char *zuser));
@ -675,7 +693,8 @@ extern boolean fsysdep_move_uuxqt_files P((int cfiles,
started in rather than in the public directory. This should return
NULL on error. */
extern char *zsysdep_local_file_cwd P((const char *zname,
const char *zpubdir));
const char *zpubdir,
boolean *pfbadname));
/* Add the working directory to a file name. The named file is
actually on a remote system. If the file already has a directory,
@ -748,9 +767,11 @@ extern boolean usysdep_walk_tree P((const char *zdir,
extern char *zsysdep_jobid P((const struct uuconf_system *qsys,
pointer pseq));
/* See whether the current user is permitted to kill jobs submitted by
another user. This should return TRUE if permission is granted,
FALSE otherwise. */
/* See whether the current user is privileged. Privileged users are
permitted to kill jobs submitted by another user, and they are
permitted to use the -u argument to uucico; other uses of this call
may be added later. This should return TRUE if permission is
granted, FALSE otherwise. */
extern boolean fsysdep_privileged P((void));
/* Kill a job, given the jobid. This should remove all associated
@ -778,6 +799,11 @@ extern long ixsysdep_work_time P((const struct uuconf_system *qsys,
value must use the same epoch as ixsysdep_time. */
extern long ixsysdep_file_time P((const char *zfile));
/* Touch a file to make it appear as though it was created at the
current time. This is called by uustat on execution files. On
error this should log an error message and return FALSE. */
extern boolean fsysdep_touch_file P((const char *zfile));
/* Get the size in bytes of a file. If this file does not exist, this
should not give an error message, but should return -1. If some
other error occurs, this should return -2. */
@ -942,7 +968,8 @@ extern boolean fsysdep_uupick_free P((const char *zsystem,
zsysdep_local_file_cwd except that a file beginning with ~/ is
placed in the user's home directory rather than in the public
directory. */
extern char *zsysdep_uupick_local_file P((const char *zfile));
extern char *zsysdep_uupick_local_file P((const char *zfile,
boolean *pfbadname));
/* Remove a directory and all the files in it. */
extern boolean fsysdep_rmdir P((const char *zdir));

View File

@ -1,7 +1,7 @@
/* tcp.c
Code to handle TCP connections.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char tcp_rcsid[] = "$Id: tcp.c,v 1.1 1993/08/04 19:31:06 jtc Exp $";
const char tcp_rcsid[] = "$Id: tcp.c,v 1.2 1994/10/24 22:17:27 jtc Exp $";
#endif
#if HAVE_TCP
@ -72,7 +72,6 @@ static boolean ftcp_close P((struct sconnection *qconn,
pointer puuconf,
struct uuconf_dialer *qdialer,
boolean fsuccess));
static boolean ftcp_reset P((struct sconnection *qconn));
static boolean ftcp_dial P((struct sconnection *qconn, pointer puuconf,
const struct uuconf_system *qsys,
const char *zphone,
@ -88,7 +87,6 @@ static const struct sconncmds stcpcmds =
NULL, /* pfunlock */
ftcp_open,
ftcp_close,
ftcp_reset,
ftcp_dial,
fsysdep_conn_read,
fsysdep_conn_write,
@ -110,9 +108,11 @@ fsysdep_tcp_init (qconn)
q = (struct ssysdep_conn *) xmalloc (sizeof (struct ssysdep_conn));
q->o = -1;
q->ord = -1;
q->owr = -1;
q->zdevice = NULL;
q->iflags = -1;
q->istdout_flags = -1;
q->iwr_flags = -1;
q->fterminal = FALSE;
q->ftli = FALSE;
q->ibaud = 0;
@ -175,6 +175,10 @@ ftcp_open (qconn, ibaud, fwait)
return FALSE;
}
/* We save our process ID in the qconn structure. This is checked
in ftcp_close. */
qsysdep->ipid = getpid ();
/* If we aren't waiting for a connection, we're done. */
if (! fwait)
return TRUE;
@ -347,23 +351,16 @@ ftcp_close (qconn, puuconf, qdialer, fsuccess)
fret = FALSE;
}
qsysdep->o = -1;
return fret;
}
/* Reset the port. This will be called by a child which was forked
off in ftcp_open, above. We don't want uucico to continue looping
and giving login prompts, so we pretend that we received a SIGINT
signal. This should probably be handled more cleanly. The signal
will not be recorded in the log file because we don't set
afLog_signal[INDEXSIG_SIGINT]. */
/*ARGSUSED*/
static boolean
ftcp_reset (qconn)
struct sconnection *qconn;
{
afSignal[INDEXSIG_SIGINT] = TRUE;
return TRUE;
/* If the current pid is not the one we used to open the port, then
we must have forked up above and we are now the child. In this
case, we are being called from within the fendless loop in
uucico.c. We return FALSE to force the loop to end and the child
to exit. This should be handled in a cleaner fashion. */
if (qsysdep->ipid != getpid ())
fret = FALSE;
return fret;
}
/* Dial out on a TCP port, so to speak: connect to a remote computer. */
@ -383,6 +380,7 @@ ftcp_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialer)
struct hostent *q;
struct sockaddr_in s;
const char *zport;
char **pzdialer;
qsysdep = (struct ssysdep_conn *) qconn->psysdep;
@ -411,9 +409,9 @@ ftcp_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialer)
}
s.sin_family = q->h_addrtype;
memcpy (&s.sin_addr.s_addr, q->h_addr, (size_t) q->h_length);
zport = qconn->qport->uuconf_u.uuconf_stcp.uuconf_zport;
s.sin_port = itcp_port_number (zport);
memcpy (&s.sin_addr.s_addr, q->h_addr, (size_t) q->h_length);
if (connect (qsysdep->o, (struct sockaddr *) &s, sizeof s) < 0)
{
@ -421,6 +419,15 @@ ftcp_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialer)
return FALSE;
}
/* Handle the dialer sequence, if any. */
pzdialer = qconn->qport->uuconf_u.uuconf_stcp.uuconf_pzdialer;
if (pzdialer != NULL && *pzdialer != NULL)
{
if (! fconn_dial_sequence (qconn, puuconf, pzdialer, qsys, zphone,
qdialer, ptdialer))
return FALSE;
}
return TRUE;
}

View File

@ -1,7 +1,7 @@
/* tli.c
Code to handle TLI connections.
Copyright (C) 1992 Ian Lance Taylor
Copyright (C) 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char tli_rcsid[] = "$Id: tli.c,v 1.1 1993/08/04 19:31:09 jtc Exp $";
const char tli_rcsid[] = "$Id: tli.c,v 1.2 1994/10/24 22:17:29 jtc Exp $";
#endif
#if HAVE_TLI
@ -92,9 +92,11 @@ extern int t_errno;
extern char *t_errlist[];
extern int t_nerr;
#ifndef HAVE_TIUSER_H
#ifndef t_alloc
extern pointer t_alloc ();
#endif
#endif
/* This code handles TLI connections. It's Unix specific. It's
largely based on code from Unix Network Programming, by W. Richard
@ -110,7 +112,6 @@ static boolean ftli_close P((struct sconnection *qconn,
pointer puuconf,
struct uuconf_dialer *qdialer,
boolean fsuccess));
static boolean ftli_reset P((struct sconnection *qconn));
static boolean ftli_dial P((struct sconnection *qconn, pointer puuconf,
const struct uuconf_system *qsys,
const char *zphone,
@ -125,7 +126,6 @@ static const struct sconncmds stlicmds =
NULL, /* pfunlock */
ftli_open,
ftli_close,
ftli_reset,
ftli_dial,
fsysdep_conn_read,
fsysdep_conn_write,
@ -149,7 +149,8 @@ ztlierror ()
return t_errlist[t_errno];
}
/* Initialize a TLI connection. */
/* Initialize a TLI connection. This may be called with qconn->qport
NULL, when opening standard input as a TLI connection. */
boolean
fsysdep_tli_init (qconn)
@ -159,9 +160,11 @@ fsysdep_tli_init (qconn)
q = (struct ssysdep_conn *) xmalloc (sizeof (struct ssysdep_conn));
q->o = -1;
q->ord = -1;
q->owr = -1;
q->zdevice = NULL;
q->iflags = -1;
q->istdout_flags = -1;
q->iwr_flags = -1;
q->fterminal = FALSE;
q->ftli = TRUE;
q->ibaud = 0;
@ -295,6 +298,10 @@ ftli_open (qconn, ibaud, fwait)
return FALSE;
}
/* We save our process ID in the qconn structure. This is checked
in ftli_close. */
qsysdep->ipid = getpid ();
/* If we aren't waiting for a connection, we can bind to any local
address, and then we're finished. */
if (! fwait)
@ -463,23 +470,15 @@ ftli_close (qconn, puuconf, qdialer, fsuccess)
qsysdep->o = -1;
}
return fret;
}
/* Reset the port. This will be called by a child which was forked
off in ftli_open, above. We don't want uucico to continue looping
and giving login prompts, so we pretend that we received a SIGINT
signal. This should probably be handled more cleanly. The signal
will not be recorded in the log file because we don't set
afLog_signal[INDEXSIG_SIGINT]. */
/* If the current pid is not the one we used to open the port, then
we must have forked up above and we are now the child. In this
case, we are being called from within the fendless loop in
uucico.c. We return FALSE to force the loop to end and the child
to exit. This should be handled in a cleaner fashion. */
if (qsysdep->ipid != getpid ())
fret = FALSE;
/*ARGSUSED*/
static boolean
ftli_reset (qconn)
struct sconnection *qconn;
{
afSignal[INDEXSIG_SIGINT] = TRUE;
return TRUE;
return fret;
}
/* Dial out on a TLI port, so to speak: connect to a remote computer. */
@ -569,73 +568,12 @@ ftli_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound)
if (! ftli_push (qconn))
return FALSE;
/* Handle the rest of the dialer sequence. This is similar to
fmodem_dial, and they should, perhaps, be combined somehow. */
if (pzdialer != NULL)
/* Handle the rest of the dialer sequence. */
if (pzdialer != NULL && *pzdialer != NULL)
{
boolean ffirst;
ffirst = TRUE;
while (*pzdialer != NULL)
{
int iuuconf;
struct uuconf_dialer *q;
struct uuconf_dialer s;
const char *ztoken;
boolean ftranslate;
if (! ffirst)
q = &s;
else
q = qdialer;
iuuconf = uuconf_dialer_info (puuconf, *pzdialer, q);
if (iuuconf == UUCONF_NOT_FOUND)
{
ulog (LOG_ERROR, "%s: Dialer not found", *pzdialer);
return FALSE;
}
else if (iuuconf != UUCONF_SUCCESS)
{
ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
return FALSE;
}
++pzdialer;
ztoken = *pzdialer;
ftranslate = FALSE;
if (ztoken == NULL
|| strcmp (ztoken, "\\D") == 0)
ztoken = zphone;
else if (strcmp (ztoken, "\\T") == 0)
{
ztoken = zphone;
ftranslate = TRUE;
}
if (! fchat (qconn, puuconf, &q->uuconf_schat,
(const struct uuconf_system *) NULL, q,
zphone, ftranslate, qconn->qport->uuconf_zname,
(long) 0))
{
(void) uuconf_dialer_free (puuconf, q);
if (! ffirst)
(void) uuconf_dialer_free (puuconf, qdialer);
return FALSE;
}
if (ffirst)
{
*ptdialerfound = DIALERFOUND_FREE;
ffirst = FALSE;
}
else
(void) uuconf_dialer_free (puuconf, q);
if (*pzdialer != NULL)
++pzdialer;
}
if (! fconn_dial_sequence (qconn, puuconf, pzdialer, qsys, zphone,
qdialer, ptdialerfound))
return FALSE;
}
return TRUE;

View File

@ -1,7 +1,7 @@
/* trans.h
Header file for file and command transfer routines.
Copyright (C) 1992 Ian Lance Taylor
Copyright (C) 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
/* The maximum possible number of channels. */
@ -56,6 +56,10 @@ struct sdaemon
{
/* Global uuconf pointer. */
pointer puuconf;
/* Configuration file name argument (from -I option). */
const char *zconfig;
/* How often to spawn uuxqt (from uuconf_runuuxqt). */
int irunuuxqt;
/* Remote system information. */
const struct uuconf_system *qsys;
/* Local name being used. */
@ -64,6 +68,8 @@ struct sdaemon
struct sconnection *qconn;
/* Protocol being used. */
const struct sprotocol *qproto;
/* Number of channels being used. */
int cchans;
/* The largest file size permitted for a local request. */
long clocal_size;
/* The largest file size permitted for a remote request. */
@ -72,6 +78,13 @@ struct sdaemon
long cmax_ever;
/* The remote system ulimit. */
long cmax_receive;
/* Number of bytes sent. */
long csent;
/* Number of bytes received. */
long creceived;
/* Number of execution files received since the last time we spawned
uuxqt. */
long cxfiles_received;
/* Features supported by the remote side. */
int ifeatures;
/* TRUE if we should request the remote side to hang up. */
@ -266,3 +279,10 @@ extern void usent_receive_ack P((struct sdaemon *qdaemon,
lost. */
extern void uwindow_acked P((struct sdaemon *qdaemon,
boolean fallacked));
/* Spawn a uuxqt process. The ffork argument is passed to
fsysdep_run. If the zsys argument is not NULL, then -s zsys is
passed to uuxqt. The zconfig argument is the name of the
configuration file, from the -I option. */
extern boolean fspawn_uuxqt P((boolean ffork, const char *zsys,
const char *zconfig));

View File

@ -1,7 +1,7 @@
/* util.c
A couple of UUCP utility functions.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char util_rcsid[] = "$Id: util.c,v 1.1 1993/08/04 19:31:13 jtc Exp $";
const char util_rcsid[] = "$Id: util.c,v 1.2 1994/10/24 22:17:31 jtc Exp $";
#endif
#include <ctype.h>
@ -95,6 +95,46 @@ funknown_system (puuconf, zsystem, qsys)
return TRUE;
}
/* Remove all occurrences of the local system name followed by an
exclamation point from the front of a string, returning the new
string. This is used by uucp and uux. */
char *
zremove_local_sys (qlocalsys, z)
struct uuconf_system *qlocalsys;
char *z;
{
size_t clen;
char *zexclam;
clen = strlen (qlocalsys->uuconf_zname);
zexclam = strchr (z, '!');
while (zexclam != NULL)
{
if (z == zexclam
|| (zexclam - z == clen
&& strncmp (z, qlocalsys->uuconf_zname, clen) == 0))
;
else if (qlocalsys->uuconf_pzalias == NULL)
break;
else
{
char **pzal;
for (pzal = qlocalsys->uuconf_pzalias; *pzal != NULL; pzal++)
if (strlen (*pzal) == zexclam - z
&& strncmp (z, *pzal, (size_t) (zexclam - z)) == 0)
break;
if (*pzal == NULL)
break;
}
z = zexclam + 1;
zexclam = strchr (z, '!');
}
return z;
}
/* See whether a file is in a directory list, and make sure the user
has appropriate access. */
@ -118,7 +158,7 @@ fin_directory_list (zfile, pzdirs, zpubdir, fcheck, freadable, zuser)
if (pz[0][0] == '!')
{
zuse = zsysdep_local_file (*pz + 1, zpubdir);
zuse = zsysdep_local_file (*pz + 1, zpubdir, (boolean *) NULL);
if (zuse == NULL)
return FALSE;
@ -128,7 +168,7 @@ fin_directory_list (zfile, pzdirs, zpubdir, fcheck, freadable, zuser)
}
else
{
zuse = zsysdep_local_file (*pz, zpubdir);
zuse = zsysdep_local_file (*pz, zpubdir, (boolean *) NULL);
if (zuse == NULL)
return FALSE;

View File

@ -1,7 +1,7 @@
/* uuconf.h
Header file for UUCP configuration routines.
Copyright (C) 1992 Ian Lance Taylor
Copyright (C) 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP uuconf library.
@ -26,7 +26,7 @@
informative, and does not modify the License in any way).
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#ifndef UUCONF_H
@ -348,7 +348,9 @@ enum uuconf_porttype
/* A TCP port. Not supported on all systems. */
UUCONF_PORTTYPE_TCP,
/* A TLI port. Not supported on all systems. */
UUCONF_PORTTYPE_TLI
UUCONF_PORTTYPE_TLI,
/* A pipe port. Not supported on all systems. */
UUCONF_PORTTYPE_PIPE
};
/* Additional information for a stdin port (there is none). */
@ -377,6 +379,8 @@ struct uuconf_modem_port
long uuconf_ihighbaud;
/* Non-zero if the port supports carrier detect. */
int uuconf_fcarrier;
/* Non-zero if the port supports hardware flow control. */
int uuconf_fhardflow;
/* A NULL terminated sequence of dialer/token pairs (element 0 is a
dialer name, element 1 is a token, etc.) May be NULL, in which
case qdialer should not be NULL. */
@ -394,6 +398,10 @@ struct uuconf_direct_port
char *uuconf_zdevice;
/* The baud rate (speed). */
long uuconf_ibaud;
/* Non-zero if the port uses carrier detect. */
int uuconf_fcarrier;
/* Non-zero if the port supports hardware flow control. */
int uuconf_fhardflow;
};
/* Additional information for a TCP port. */
@ -403,6 +411,9 @@ struct uuconf_tcp_port
/* The TCP port number to use. May be a name or a number. May be
NULL, in which case "uucp" is looked up using getservbyname. */
char *uuconf_zport;
/* A NULL terminated sequence of dialer/token pairs (element 0 is a
dialer name, element 1 is a token, etc.) May be NULL. */
char **uuconf_pzdialer;
};
/* Additional information for a TLI port. */
@ -431,6 +442,14 @@ struct uuconf_tli_port
char *uuconf_zservaddr;
};
/* Additional information for a pipe port. */
struct uuconf_pipe_port
{
/* The command and its arguments. */
char **uuconf_pzcmd;
};
/* Information kept for a port. */
struct uuconf_port
@ -460,6 +479,7 @@ struct uuconf_port
struct uuconf_direct_port uuconf_sdirect;
struct uuconf_tcp_port uuconf_stcp;
struct uuconf_tli_port uuconf_stli;
struct uuconf_pipe_port uuconf_spipe;
} uuconf_u;
};
@ -545,6 +565,13 @@ struct uuconf_dialer
be b1 - b2. */
#define UUCONF_GRADE_CMP(b1, b2) (uuconf_grade_cmp ((b1), (b2)))
/* uuconf_runuuxqt returns either a positive number (the number of
execution files to receive between uuxqt invocations) or one of
these constant values. */
#define UUCONF_RUNUUXQT_NEVER (0)
#define UUCONF_RUNUUXQT_ONCE (-1)
#define UUCONF_RUNUUXQT_PERCALL (-2)
/* Most of the uuconf functions returns an error code. A value of
zero (UUCONF_SUCCESS) indicates success. */
@ -849,15 +876,29 @@ extern int uuconf_debuglevel (void *uuconf_pglobal,
extern int uuconf_maxuuxqts (void *uuconf_pglobal,
int *uuconf_pcmaxuuxqt);
/* Get the frequency with which to spawn a uuxqt process. This
returns an integer. A positive number is the number of execution
files that should be received between spawns. Other values are one
of the UUCONF_RUNUUXQT constants listed above. */
extern int uuconf_runuuxqt (void *uuconf_pglobal,
int *uuconf_pirunuuxqt);
/* Check a login name and password. This checks the Taylor UUCP
password file (not /etc/passwd). It will work even if
uuconf_taylor_init was not called. If the login name exists and
the password is correct, this returns UUCONF_SUCCESS. If the login
does not exist, or the password is wrong, this returns
UUCONF_NOT_FOUND. Other errors are also possible. */
uuconf_taylor_init was not called. All comparisons are done via a
callback function. The first argument to the function will be zero
when comparing login names, non-zero when comparing passwords. The
second argument to the function will be the pinfo argument passed
to uuconf_callin. The third argument will be the login name or
password from the UUCP password file. The comparison function
should return non-zero for a match, or zero for a non-match. If
the login name is found and the password compares correctly,
uuconf_callin will return UUCONF_SUCCESS. If the login is not
found, or the password does not compare correctly, uuconf_callin
will return UUCONF_NOT_FOUND. Other errors are also possible. */
extern int uuconf_callin (void *uuconf_pglobal,
const char *uuconf_zlogin,
const char *uuconf_zpassword);
int (*uuconf_cmp) (int, void *, const char *),
void *uuconf_pinfo);
/* Get the callout login name and password for a system. This will
set both *pzlog and *pzpass to a string allocated by malloc, or to
@ -922,6 +963,7 @@ extern int uuconf_statsfile ();
extern int uuconf_debugfile ();
extern int uuconf_debuglevel ();
extern int uuconf_maxuuxqts ();
extern int uuconf_runuuxqt ();
extern int uuconf_callin ();
extern int uuconf_callout ();
extern int uuconf_remote_unknown ();

View File

@ -1,7 +1,7 @@
/* uucp.h
Header file for the UUCP package.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,11 +20,11 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
/* Get the system configuration parameters. */
#include "conf.h"
#include "config.h"
#include "policy.h"
/* Get a definition for ANSI_C if we weren't given one. */
@ -41,11 +41,11 @@
/* We always include some standard header files. We need <signal.h>
to define sig_atomic_t. */
#include <stdio.h>
#include <signal.h>
#if HAVE_STDDEF_H
#include <stddef.h>
#endif
#include <stdio.h>
#include <signal.h>
/* On some systems we need <sys/types.h> to get sig_atomic_t or
size_t or time_t. */
@ -103,21 +103,24 @@ typedef long time_t;
constpointer -- for a generic pointer to constant data.
BUCHAR -- to convert a character to unsigned. */
#if ANSI_C
#if ! HAVE_VOID || ! HAVE_UNSIGNED_CHAR
#error ANSI C compiler without void or unsigned char
#if ! HAVE_VOID || ! HAVE_UNSIGNED_CHAR || ! HAVE_PROTOTYPES
#error ANSI C compiler without void or unsigned char or prototypes
#endif
#define P(x) x
typedef void *pointer;
typedef const void *constpointer;
#define BUCHAR(b) ((unsigned char) (b))
#else /* ! ANSI_C */
/* Handle uses of const, volatile and void in Classic C. */
#define const
/* Handle uses of volatile and void in Classic C. */
#define volatile
#if ! HAVE_VOID
#define void int
#endif
#if HAVE_PROTOTYPES
#define P(x) x
#else
#define P(x) ()
#endif
typedef char *pointer;
typedef const char *constpointer;
#if HAVE_UNSIGNED_CHAR
@ -169,6 +172,7 @@ extern pointer memcpy (), memchr ();
#else /* ! HAVE_STDLIB_H */
extern pointer malloc (), realloc (), bsearch ();
extern long strtol ();
extern unsigned long strtoul ();
extern char *getenv ();
#endif /* ! HAVE_STDLIB_H */
@ -225,6 +229,11 @@ typedef FILE *openfile_t;
#define ffileseek(e, i) (fseek ((e), (long) (i), 0) == 0)
#define ffilerewind(e) (fseek ((e), (long) 0, 0) == 0)
#endif
#ifdef SEEK_END
#define ffileseekend(e) (fseek ((e), (long) 0, SEEK_END) == 0)
#else
#define ffileseekend(e) (fseek ((e), (long) 0, 2) == 0)
#endif
#define ffileclose(e) (fclose (e) == 0)
#else /* ! USE_STDIO */
@ -247,6 +256,11 @@ typedef int openfile_t;
#define ffileseek(e, i) (lseek ((e), (off_t) i, 0) >= 0)
#define ffilerewind(e) (lseek ((e), (off_t) 0, 0) >= 0)
#endif
#ifdef SEEK_END
#define ffileseekend(e) (lseek ((e), (off_t) 0, SEEK_END) >= 0)
#else
#define ffileseekend(e) (lseek ((e), (off_t) 0, 2) >= 0)
#endif
#define ffileclose(e) (close (e) >= 0)
#endif /* ! USE_STDIO */
@ -359,6 +373,11 @@ extern char *strrchr P((const char *z, int b));
extern long strtol P((const char *, char **, int));
#endif
/* Turn a string into a long unsigned integer. */
#if ! HAVE_STRTOUL
extern unsigned long strtoul P((const char *, char **, int));
#endif
/* Lookup a key in a sorted array. */
#if ! HAVE_BSEARCH
extern pointer bsearch P((constpointer pkey, constpointer parray,

View File

@ -1,7 +1,7 @@
/* uudefs.h
Miscellaneous definitions for the UUCP package.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,7 +20,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#if ANSI_C
@ -106,8 +106,8 @@ struct scmd
simple execution, 'H' for hangup, 'Y' for hangup confirm, 'N' for
hangup deny). */
char bcmd;
/* At least one compiler needs an explicit padding byte here. */
char bdummy;
/* Grade of the command ('\0' if from remote system). */
char bgrade;
/* Sequence handle for fsysdep_did_work. */
pointer pseq;
/* File name to transfer from. */
@ -237,6 +237,12 @@ extern boolean fspool_file P((const char *zfile));
extern boolean ftimespan_match P((const struct uuconf_timespan *qspan,
long *pival, int *pcretry));
/* Remove all occurrences of the local system name followed by an
exclamation point from the start of the argument. Return the
possibly shortened argument. */
extern char *zremove_local_sys P((struct uuconf_system *qlocalsys,
char *z));
/* Determine the maximum size that may ever be transferred, given a
timesize span. If there are any time gaps larger than 1 hour not
described by the timesize span, this returns -1. Otherwise it
@ -375,9 +381,8 @@ extern void xfree P((pointer));
/* Global variables. */
/* The name of the program being run. This is statically initialized,
although it should perhaps be set from argv[0]. */
extern char abProgram[];
/* The name of the program being run. Set from argv[0]. */
extern const char *zProgram;
/* When a signal occurs, the signal handlers sets the appropriate
element of the arrays afSignal and afLog_signal to TRUE. The
@ -427,12 +432,6 @@ extern boolean fLog_sighup;
(afSignal[INDEXSIG_SIGHUP] || afSignal[INDEXSIG_SIGQUIT] \
|| afSignal[INDEXSIG_SIGTERM] || afSignal[INDEXSIG_SIGPIPE])
/* File being sent. */
extern openfile_t eSendfile;
/* File being received. */
extern openfile_t eRecfile;
/* Device name to log. This is set by fconn_open. It may be NULL. */
extern char *zLdevice;

View File

@ -1,7 +1,7 @@
/* tstuu.c
Test the uucp package on a UNIX system.
Copyright (C) 1991, 1992 Ian Lance Taylor
Copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor
This file is part of the Taylor UUCP package.
@ -20,13 +20,13 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
c/o Cygnus Support, Building 200, 1 Kendall Square, Cambridge, MA 02139.
*/
#include "uucp.h"
#if USE_RCS_ID
const char tstuu_rcsid[] = "$Id: tstuu.c,v 1.2 1993/08/04 19:29:58 jtc Exp $";
const char tstuu_rcsid[] = "$Id: tstuu.c,v 1.3 1994/10/24 22:16:22 jtc Exp $";
#endif
#include "sysdep.h"
@ -46,7 +46,9 @@ const char tstuu_rcsid[] = "$Id: tstuu.c,v 1.2 1993/08/04 19:29:58 jtc Exp $";
#endif
#if HAVE_SELECT
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
@ -75,9 +77,11 @@ const char tstuu_rcsid[] = "$Id: tstuu.c,v 1.2 1993/08/04 19:29:58 jtc Exp $";
#define O_RDWR 2
#endif
#if HAVE_TIME_H && (HAVE_SYS_TIME_AND_TIME_H || ! HAVE_SELECT)
#if HAVE_TIME_H
#if ! HAVE_SYS_TIME_H || ! HAVE_SELECT || TIME_WITH_SYS_TIME
#include <time.h>
#endif
#endif
#if HAVE_SYS_WAIT_H
#include <sys/wait.h>
@ -264,7 +268,7 @@ main (argc, argv)
break;
default:
fprintf (stderr,
"Taylor UUCP version %s, copyright (C) 1991, 1992 Ian Lance Taylor\n",
"Taylor UUCP %s, copyright (C) 1991, 1992, 1993, 1994 Ian Lance Taylor\n",
VERSION);
fprintf (stderr,
"Usage: tstuu [-xn] [-t #] [-u] [-1 cmd] [-2 cmd]\n");
@ -501,6 +505,9 @@ main (argc, argv)
if (close (oslave1) < 0)
perror ("close");
/* This is said to improve the tests on Linux. */
sleep (3);
if (zDebug != NULL)
fprintf (stderr, "About to exec first process\n");
@ -538,6 +545,9 @@ main (argc, argv)
if (close (oslave2) < 0)
perror ("close");
/* This is said to improve the tests on Linux. */
sleep (5);
if (zDebug != NULL)
fprintf (stderr, "About to exec second process\n");
@ -959,14 +969,13 @@ uprepare_test (fmake, itest, fcall_uucico, zsys)
fprintf (e, "port stdin\n");
fprintf (e, "type stdin\n");
fprintf (e, "pty true\n");
xfclose (e);
e = xfopen ("/usr/tmp/tstuu/Call1", "w");
fprintf (e, "Call out password file\n");
fprintf (e, "%s test1 pass1\n", zsys);
fprintf (e, "%s test1 pass\\s1\n", zsys);
xfclose (e);
@ -1035,7 +1044,7 @@ uprepare_test (fmake, itest, fcall_uucico, zsys)
e = xfopen ("/usr/tmp/tstuu/Pass2", "w");
fprintf (e, "# Call in password file\n");
fprintf (e, "test1 pass1\n");
fprintf (e, "test1 pass\\s1\n");
xfclose (e);
}