Upgraded to Taylor UUCP 1.05 (Thanks to John Kohl).
This commit is contained in:
parent
f3c9ca2e05
commit
b8b0d848d6
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Version 1.04
|
||||
Version 1.05
|
||||
|
||||
a complete, unmodified version of this program is available from
|
||||
prep.ai.mit.edu.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue