|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 8797 (0x225d)
Types: TextFile
Names: »uucp-queue.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z«
└─⟦f9e35cd84⟧
└─⟦this⟧ »sendmail/uiuc/uucp-queue.c«
#include <stdio.h>
#include <sysexits.h>
#include "path.h"
#ifndef lint
static char RCSid[] = "$Header: uucp-queue.c,v 4.4 86/11/07 08:34:15 essick Exp $";
#endif /* !lint */
#ifndef MAILLOG
#define MAILLOG "/usr/lib/mail/MailLog"
#endif /* !MAILLOG */
/*
* uucp-queue
*
* This program takes a letter formatted for UUCP transmission
* as standard input and a pair of arguements which correspond
* to the host and user. The end result is an invocation of
* UUX on some nearby machine with a properly expended path.
*
* Note that this method can result in loops. Let's hope that
* things like sendmail will notice that the letter has been
* through here before and do something about it....
*
* Ray Essick May 1, 1984
*
*/
int Debug = 0;
int Pathalias = 0; /* paths have embedded %s */
int PrefixBase = 0; /* expand user */
char *Command = (char *) NULL; /* command to do */
#define DFLTCOMMAND "/usr/bin/uux" /* normally this */
extern char *strsave (); /* in misc.c */
extern int strlower ();
extern char *getpath (); /* in getpath.c */
extern char *index ();
main (argc, argv)
int argc;
char **argv;
{
int i,
j,
k;
char *p,
*q,
*r;
char *neighbor,
*rest;
char *remainder;
char remotbuf[1024]; /* hold some bigass paths */
char cmdline[1024];
FILE * myson;
FILE * popen ();
char nextdoor[255]; /* my neighbor */
char *host;
char *domain; /* portion of full host */
char *path;
int fullroute; /* complete route ? */
char *InvokedAs;
char options[1024]; /* uux options */
FILE * logfd; /* log traffic */
char *Logfromuser = "UnSpecified";
int messagebytes;
char Logtouser[BUFSIZ];
struct findpath_f hostpath;
struct findpath_f *hostp;
struct findpath_f *userp;
struct findpath_f *findpath();
InvokedAs = argv[0]; /* save command name */
argc--;
argv++;
while (argc > 0 && argv[0][0] == '-') /* parse options */
{ /* wish i had getopt() */
if (strcmp (argv[0], "-") == 0) /* end of options */
{
argc--;
argv++;
break;
}
if (strcmp (argv[0], "-c") == 0) /* -c == common */
{
PrefixBase++;
argc--;
argv++;
continue;
}
if (strcmp (argv[0], "-d") == 0) /* -d == Debugging */
{
Debug++;
argc--;
argv++;
continue;
}
if (strcmp (argv[0], "-p") == 0) /* -p == pathalias format */
{
Pathalias++;
argc--;
argv++;
continue;
}
if (strncmp (argv[0], "-f", 2) == 0) /* -fsender */
{
if (argv[0][2] != '\0') /* not bare option */
{
Logfromuser = strsave (&argv[0][2]);
}
argc--;
argv++;
continue;
}
if (strncmp (argv[0], "-C", 2) == 0) /* -Ccommand */
{
p = &argv[0][2]; /* "command" */
if (*p == 0)
{
goto usage; /* empty command */
}
if (Command != (char *) NULL)
{
fprintf (stderr, "Only one -C option allowed\n");
goto usage;
}
Command = p; /* save the comand */
argc--;
argv++;
}
fprintf (stderr, "Unknown option: %s\n", argv[0]);
goto usage;
}
/*
* if "Command" is still null, load the default
*/
if (Command == (char *) NULL)
{
Command = DFLTCOMMAND;
}
/*
* collect any options that we should pass to uux
*/
options[0] = '\0'; /* empty option list */
while (argc > 0 && **argv == '-') /* while its a - */
{
strcat (options, " ");
strcat (options, argv[0]);
argv++;
argc--;
}
if (Debug)
fprintf (stderr, "option line is: %s\n", options);
/*
* time for the nitty gritty
*/
if (argc < 2)
{
fprintf (stderr,
"Improper argument count\n");
usage:
fprintf (stderr,
"Usage: %s [-p] [-c] [-Ccommand] [-d] [-] [commandoptions] host user\n",
InvokedAs);
exit (EX_USAGE);
}
host = *argv;
argc--;
argv++; /* count it out */
if (Debug)
fprintf (stderr, "Looking for Host: %s\n", host);
domain = strsave (host); /* make a copy */
strlower (domain); /* and go lower case */
hostp = findpath (domain); /* get a route */
if (hostp != (struct findpath_f *) NULL) /* is a path */
{
hostpath = *hostp;
}
else
{
hostpath.fp_path = (char *) NULL;
hostpath.fp_matched = (char *) NULL;
hostpath.fp_fullroute = 1;
}
if (hostpath.fp_path != (char *) NULL) /* got a path? */
{
if (Pathalias &&
strlen (hostpath.fp_path) >= 2 &&
strncmp (hostpath.fp_path, "%s", 2) == 0)
{
/*
* we got a path like "%s" or "%s@site"
* but we really want a path of the form
* "host!...%s...." so we can strip a
* leading host...
*/
fprintf (stderr, "%s: %s: no leftmost host!.\n",
InvokedAs, hostpath.fp_path);
exit (EX_UNAVAILABLE);
}
neighbor = nextdoor;
q = hostpath.fp_path;
while (*q && *q != '!') /* get first hop */
*neighbor++ = *q++;
*neighbor = '\0'; /* terminate */
remainder = strsave (++q); /* rest of path */
*--q = '!'; /* and restore */
if (!Pathalias) /* append a %s */
{
char buf[1024];
sprintf (buf, "%s%%s", remainder);
free (remainder);
remainder = strsave (buf);
}
}
else
{
/*
* no path to the site or any of the enclosing domains.
* set things up as if we had a straight shot to the site.
*/
strcpy (nextdoor, host);
remainder = "%s"; /* printf fmt */
}
#ifdef ALIASESINPATH
/*
* if our first hop is through ALIASEINPATH, we shouldn't
* be doing this; we should have defered this letter somewhere
* upstream.
* so, to keep from going to non-existent sites, we will
* defer this letter.
*/
if (strcmp (nextdoor, ALIASESINPATH) == 0)
{
if (Debug)
{
fprintf (stderr, "first hop through %s, defer the letter\n",
ALIASESINPATH);
}
exit (EX_TEMPFAIL);
}
#endif /* ALIASESINPATH */
sprintf (cmdline, "%s %s %s!rmail",
Command, options, nextdoor);
/*
* now for each user...
*/
Logtouser[0] = '\0'; /* empty the string */
while (argc > 0)
{
char addon[1024];
char userbuf[512];
char buildbuf[1024];
char *touser;
char *up; /* hold user */
char *hp; /* hold host */
if (Debug)
fprintf (stderr, "User: %s\n", *argv);
if (!PrefixBase)
{
/*
* see if we have a "full route". if so, we want to hand
* off just the plain "user" field. if not, we need to
* build a "host!user" string and hand that to the
* segment that builds the rmail arguements.
*/
if (hostpath.fp_fullroute)
{
/*
* know the whole thing
*/
touser = *argv;
}
else
{
/*
* incomplete route; prepend the host name
*/
sprintf (buildbuf, "%s!%s", host, *argv);
touser = buildbuf;
}
}
else
{
/*
* PrefixBase work
*
* find a path to the user.
* compare it for common prefixes with that to host
* remove first hop
* rebuild new user information.
* pass it on down to the command line formatting.
*
* have to make some sort of distinction between how an
* address like site!user will come across vs how
* an address like hop!site!user will come across.
* we don't want to do the user path expansion for the
* second case. i'm not sure how i want to do this.
*/
}
sprintf (userbuf, remainder, touser); /* make arg */
sprintf (addon, " \"(%s)\"", userbuf);
if (Debug)
{
fprintf (stderr, "\ttouser = %s\n", touser);
fprintf (stderr, "\tadded to cmdline: %s\n", addon);
}
strcat (cmdline, addon); /* append to cmd */
#ifdef MAILLOG
strcat (Logtouser, " "); /* separator */
strcat (Logtouser, *argv); /* and user */
#endif /* MAILLOG */
argc--;
argv++;
}
if (Debug)
{
printf ("Doing: %s\n", cmdline);
exit (EX_UNAVAILABLE);
}
myson = popen (cmdline, "w"); /* send text here */
if (myson == NULL)
{
printf ("Couldn't make pipe to \"%s\"\n", cmdline);
exit (EX_UNAVAILABLE);
}
messagebytes = 0;
while ((i = getc (stdin)) != EOF)
{
putc (i, myson); /* copy it all */
messagebytes++;
}
#ifdef MAILLOG
/*
* LOG the following:
*
* Neighbor, Fromstring, Size, FullPath, [users]
*/
if ((logfd = fopen (MAILLOG, "a")) != (FILE *) NULL)/* if there */
{
fprintf (logfd, "%s\t%s\t%d\t%s\t%s\n",
nextdoor, Logfromuser, messagebytes,
hostpath.fp_path, Logtouser);
/*
* could include [%s ] and Logtouser
*/
fclose (logfd);
}
#endif /* MAILLOG */
exit (pclose (myson) >> 8);
}