source for nmail
utzoo!decvax!duke!mcnc!ikonas!mcm
utzoo!decvax!duke!mcnc!ikonas!mcm
Tue Mar 1 12:30:27 AEST 1983
/*
* nmail.c -- a network mail interface.
* This program accepts as arguments the standard network
* addresses, and expands the section of an argument up to a
* "!" into the actual path the letter must take to get to that
* site. For example, to get to swd at duke, the argument
* "duke!swd" is expanded to "mcnc!duke!swd". "decvax!ittvax!swatt"
* would expand to "mcnc!duke!decvax!ittvax!swatt".
*
* This program uses the output of the mkpath program developed by
* Mike Mitchell at ikonas (duke!mcnc!ikonas!mcm).
*
* The input data should look like:
* sitename (any number of blanks or tabs) printf-string to get there
*
* The input data must be sorted.
*
* Version 2.0 10/15/82
*
* Written by Mike Mitchell (decvax!duke!mcnc!ikonas!mcm)
*
*/
#include <stdio.h>
#define MAILER "/bin/mail" /* the mail program to use */
#define DATA "/usr/lib/PATHS" /* where the data is kept */
#define OK 1 /* all expansions done correctly */
#define BAD 0 /* an expansion done incorrectly */
main(argc,argv,envp)
int argc;
char **argv;
char **envp;
{
FILE *fopen(),*fd;
char route[BUFSIZ],tmp[BUFSIZ];
char site[BUFSIZ],*cp,*index();
char **args,*pos, *malloc(), **calloc();
int num,rc,flag;
args = calloc(argc+1, sizeof(char *));
if (args == NULL) {
fprintf(stderr, "Cannot get memory for argument list.\n");
exit(1);
}
args[0] = "mail";
num = 1;
flag = OK;
fd = fopen(DATA,"r");
while(--argc) {
argv++;
if ((cp=index(*argv,'!')) == NULL) {
pos = malloc(strlen(*argv) + 1);
if (pos == NULL) {
fprintf(stderr,
"Cannot get memory for name %s\n",
*argv);
exit(1);
}
strcpy(pos,*argv);
args[num++] = pos;
}
else {
*cp = '\0';
while( fscanf(fd,"%s%s",site,route) != EOF) {
rc = strcmp(site, *argv);
if (rc > 0) break;
if (rc == 0) {
sprintf(tmp,route,(cp+1));
pos = malloc(strlen(tmp)+1);
if (pos == NULL) {
fprintf(stderr,
"Can't get mem for path %s\n",
tmp);
exit(1);
}
strcpy(pos,tmp);
args[num++] = pos;
break;
}
}
if (rc != 0) {
printf("Can't get to %s from here\n",*argv);
flag = BAD;
}
fseek(fd,0L,0);
}
}
if (flag) {
args[num] = NULL;
for (rc = 0; rc < num; rc++)
printf("%s ",args[rc]);
printf("\n");
execve(MAILER,args,envp);
fprintf(stderr, "execve of %s failed!\n", MAILER);
exit(1);
}
}
More information about the Comp.sources.unix
mailing list