📄 deliver.c
字号:
validate,
user );
if ( announce && ( userp != BADUSER ) && remoteMail )
trumpet( userp->beep); /* Yes --> Inform the user */
return delivered;
} /* if */
} /* if */
/*--------------------------------------------------------------------*/
/* No system alias, verify the user is valid */
/*--------------------------------------------------------------------*/
if ( userp == BADUSER ) /* Invalid user id? */
{ /* Yes --> Dump in trash bin */
return Bounce( input,
"Invalid local address (not defined in PASSWD or ALIASES)",
user,
user,
validate );
} /* if */
/*--------------------------------------------------------------------*/
/* The user id validated; handle the mail */
/*--------------------------------------------------------------------*/
mkfilename(mboxname, userp->homedir, DOTFORWARD);
if (access( mboxname, 0 )) /* The .forward file exists? */
announce = TRUE; /* No --> Fall through */
else {
delivered += DeliverFile( input,
mboxname,
0,
LONG_MAX,
&announce,
userp,
FALSE,
validate,
user );
if (announce && remoteMail) /* Did we deliver mail locally? */
trumpet( userp->beep); /* Yes --> Inform the user */
return delivered;
} /* if */
} /* if (validate) */
/*--------------------------------------------------------------------*/
/* The user is valid (or not validated) and not forwarded */
/*--------------------------------------------------------------------*/
if ((*user == '/') || (isalpha( *user ) && user[1] == ':'))
/* Absolute path from recursive call? */
strcpy(mboxname, user); /* Yes --> Use it as-is */
else
mkmailbox(mboxname, user);
/* No --> Build normal name */
printmsg(1,"Delivering mail %sfrom %s%s%s to %s",
stats( input ),
ruser,
remoteMail ? "@" : "",
remoteMail ? rnode : "",
user );
if ( announce && remoteMail )
trumpet( userp->beep); /* Local delivery, inform the user */
mbox = FOPEN( mboxname , "a",TEXT_MODE );
if (mbox == NULL )
{
printerr(mboxname);
printmsg(0,"Cannot open mailbox \"%s\" for output",
mboxname);
panic();
}
if (!isatty(fileno(mbox)))
fputs(MESSAGESEP,mbox); /* Write separator line */
return CopyData( FALSE, input , mbox );
} /* DeliverLocal */
/*--------------------------------------------------------------------*/
/* D e l i v e r F i l e */
/* */
/* Process a local or system aliases file */
/*--------------------------------------------------------------------*/
static int DeliverFile( const char *input,
const char *fwrdname,
const long start,
const long end,
boolean *announce,
struct UserTable *userp,
const boolean sysalias, /* Already sys alias */
const boolean validate,
const char *user )
{
char buf[BUFSIZ];
FILE *fwrd = FOPEN(fwrdname, "r",TEXT_MODE);
char *cwd = sysalias ? E_tempdir : userp->homedir;
int delivered = 0;
if ( fwrd == NULL )
{
printerr( fwrdname );
return Bounce( input,
"Cannot open forward file",
fwrdname,
user,
validate );
}
if ( start != 0 )
fseek( fwrd, start, SEEK_SET);
while((ftell(fwrd) < end) && (fgets( buf, BUFSIZ, fwrd) != NULL ))
{
char *s = buf;
char c;
char *nextfile = NULL;
if ( buf[ strlen(buf) - 1 ]== '\n')
buf[ strlen(buf) - 1 ] = '\0';
while( *s && ! isgraph( *s )) /* Trim leading white space */
s++;
printmsg(8,"Forwarding to \"%s\"", s);
if ( equalni( buf, INCLUDE, strlen(INCLUDE)))
{
nextfile = strtok( s + strlen(INCLUDE), WHITESPACE );
if ( nextfile == NULL )
{
return Bounce(input,
"Missing forwarding file for alias",
fwrdname,
user,
validate );
}
else
c = ':';
} /* if */
else if ( isalpha(*s ) && (s[1] == ':')) /* Drive name? */
c = '/'; /* Yes --> flag as absolute path */
else if ( *s == ':') /* Avoid false triggers ... */
c = ' '; /* ... by making it general case */
else /* Handle other cases in switch ... */
c = *s;
switch(c)
{
case '#':
break; /* Comment, ignore */
case '\0':
break; /* Empty line, ignore */
case '|': /* Pipe mail into a command */
{
long here = ftell(fwrd);
fclose(fwrd);
PushDir( cwd );
printmsg(1,"Piping mail%s from %s@%s for %s into %s",
stats( input ),
ruser,
rnode,
user,
s + 1 );
executeCommand( s + 1, input, NULL, TRUE, FALSE );
PopDir();
delivered += 1;
fwrd = FOPEN(fwrdname, "r",TEXT_MODE);
fseek( fwrd, here, SEEK_SET);
break;
} /* case */
case '\\': /* Deliver without forwarding */
delivered += Deliver( input, &s[1], TRUE, FALSE );
*announce = TRUE;
break;
case ':':
{
char fname[FILENAME_MAX];
strcpy( fname, nextfile);
expand_path(nextfile, NULL, cwd, E_mailext);
delivered += DeliverFile( input, nextfile, 0, LONG_MAX,
announce, userp,
FALSE, TRUE, user );
break;
}
case '/': /* Save in absolute path name */
case '~':
if (expand_path(s, NULL, cwd, E_mailext) == NULL )
{
return Bounce(input,
"Invalid path in forwarding file name",
s,
user,
validate );
}
else
delivered += DeliverLocal( input, s, sysalias, FALSE );
*announce = TRUE;
break;
default: /* Deliver normally */
delivered += Deliver( input, s, sysalias, validate );
} /* switch */
} /* while */
fclose( fwrd );
return delivered;
} /* DeliverFile */
/*--------------------------------------------------------------------*/
/* D e l i v e r G a t e w a y */
/* */
/* Deliver mail via a gateway program */
/*--------------------------------------------------------------------*/
static size_t DeliverGateway( const char *input,
const char *user,
const char *node,
const struct HostTable *hostp,
const boolean validate )
{
char command[BUFSIZ];
int rc;
/*--------------------------------------------------------------------*/
/* Format the command and tell the user what we're going to do */
/*--------------------------------------------------------------------*/
sprintf(command , "%s %s %s %s",
hostp->via, /* Program to perform forward */
hostp->hostname, /* Nominal host routing via */
node , /* Final destination system */
user ); /* user on "node" for delivery*/
printmsg(3,"DeliverGateway: %s", command);
printmsg(1,
"Gatewaying mail %sfrom %s@%s to %s@%s via %s using \"%s\"",
stats( input ),
ruser, rnode, user, node, hostp->hostname, hostp->via);
/*--------------------------------------------------------------------*/
/* Run the command and return caller with count of mail delivered */
/*--------------------------------------------------------------------*/
rc = executeCommand( command, input, NULL, TRUE, FALSE );
if ( rc == 0 )
return 1;
else {
char who[MAXADDR];
sprintf( who, "%s@%s", user, node );
return Bounce( input,
"Gateway command returned non-zero exit status",
command,
who,
validate );
} /* else */
} /* DeliveryGateway */
/*--------------------------------------------------------------------*/
/* D e l i v e r R e m o t e */
/* */
/* Queue mail for delivery on another system via UUCP */
/*--------------------------------------------------------------------*/
static size_t DeliverRemote( const char *input, /* Input file name */
const char *address, /* Target address */
const char *path)
{
static char *spool_fmt = SPOOLFMT; /* spool file name */
static char *dataf_fmt = DATAFFMT;
static char *send_cmd = "S %s %s %s - %s 0666\n";
static long seqno = 0;
static char *SavePath = NULL;
FILE *stream; /* For writing out data */
static char everyone[500]; /* 512, with room for "rmail " */
char msfile[FILENAME_MAX]; /* MS-DOS format name of files */
char msname[22]; /* MS-DOS format w/o path name */
char tmfile[15]; /* Call file, UNIX format name */
static char ixfile[15]; /* eXecute file for remote system,
UNIX format name for local system */
static char idfile[15]; /* Data file, UNIX format name */
static char rdfile[15]; /* Data file name on remote system,
UNIX format */
static char rxfile[15]; /* Remote system UNIX name of eXecute
file */
printmsg(1,"Spooling mail %sfrom %s%s%s to %s via %s",
stats( input ),
ruser,
remoteMail ? "@" : "",
remoteMail ? rnode : "",
address ,
path);
/*--------------------------------------------------------------------*/
/* Create the UNIX format of the file names we need */
/*--------------------------------------------------------------------*/
if ((seqno == 0) ||
(SavePath == NULL) ||
!equal(SavePath, path) ||
((int) (strlen(everyone) + strlen(address) + 2) > (int) sizeof everyone))
{
char *seq;
seqno = getseq();
seq = JobNumber( seqno );
if (SavePath != NULL )
{
free(SavePath);
SavePath = NULL;
} /* if */
sprintf(tmfile, spool_fmt, 'C', path, 'C' , seq);
sprintf(idfile, dataf_fmt, 'D', E_nodename , seq, 'd');
sprintf(rdfile, dataf_fmt, 'D', E_nodename , seq, 'r');
sprintf(ixfile, dataf_fmt, 'D', E_nodename , seq, 'e');
sprintf(rxfile, dataf_fmt, 'X', E_nodename , seq, 'r');
strcpy(everyone,address);
} /* if */
else {
strcat(everyone," ");
strcat(everyone,address);
} /* else */
/*--------------------------------------------------------------------*/
/* create remote X (xqt) file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -