#/* Module Name: ex.source Installation: ln ex.source ex.c if $1x = finalx goto final cc ex.c -lj rm -f ex.c exit : final cc -O -s ex.c -lj if ! -r a.out exit su cp a.out /usr/bin/ex rm -f a.out ex.c Synopsis: ex [ -f filename ] [ - ] [ -s subject ] [ -o ] Function: Extract the body of a message and write it as a file with the same name as the subject line. Parameters: -f use the specified filename as input - equivalent to -f <std input> -s extract only the specified subject -o put output on std output Compile time parameters and effects: MBX the name of the default mailbox to be scanned MSGSEP the separator inserted by the recieving mailer Module History: Written 14 Dec 77 by Greg Noel Mods by R Balocca 78Jan6 : added all the options added includes general massaging for CAC system Modified 23Jan78 by Greg Noel removed includes to permit easier transportability added defines tinkered with logic slightly to improve speed */ #define MBX ".mail" /* default mailbox name */ #define MSGSEP "\1\1\1\1" /* end-of-message inserted by recieving mailer */ char line[500]; int fi; /* output file designator */ struct { /* input file buffering */ int fid; /* file descriptor */ int nleft; /* chars left in buffer */ char *nextp; /* ptr to next character */ char buff[512]; /* the buffer */ } in; main(argc, argv) int argc; char **argv; { register int len; register char *p; register char * fname; static char * subj; /* static for the 0 */ static int output; /* ditto */ /* set up */ for(fname = MBX,in.fid = -1;;) { argc--; argv++; if(argc<=0) break; if(argv[0][0] == '-') { switch(argv[0][1]) { case 'f': /* particular input file */ fname = argv[1]; argc--; argv++; break; case '\0': in.fid = 0; break; case 's': /* particular subject line */ subj = argv[1]; argc--; argv++; break; case 'o': /* output on stdout */ output = 1; break; } } } if(in.fid == -1 && fopen(fname, &in) < 0) { printf(2, "Bad input file specification\n"); flush(); exit(); } /* go through file extracting texts */ for(;;){ for(;;) { len = getline(); line[8] = 0; if(strcomp(line, "Subject:") == 0) { if(subj == 0) break; else { line[len-1] = '\0'; /* sorry */ if(strcomp(subj, &line[9]) == 0) break; line[len-1] = '\n'; } } } /* should strip off leading blanks on &line[9] */ /* found subject line; get filename */ line[len-1] = 0; /* change newline to null */ if( output ) fi = dup(1); else if( (fi = creat(&line[9], 0644)) < 0) { printf(2, "Can't open file: '%s'\n", &line[9]); flush(); /* should make up name... */ fi = dup(1); /* so put it on std output */ } /* skip past rest of header */ while(getline() > 1); /* copy body to output file */ for(;;) { if((len = getline()) > 5) { for(p = line; *p++ == '-';); if(*--p == '\n') break; /* trailing hyphens put on by mailer */ } line[len-1] = '\0'; /* sorry */ if(strcomp(line, MSGSEP) == 0) break; /* mail marker inserted by recieving mailer */ line[len-1] = '\n'; write(fi, line, len); } /* close up shop on this file */ close(fi); flush(); } } getline() { register char *p; p = line; do { if( (*p = getc(&in)) < 0) exit(); } while(*p++ != '\n'); *p = 0; /* null terminate */ return(p-line); } strcomp(a, b) char *a, *b; { register char *p, *q, c; p = a; q = b; while( (c = *p++) == *q++ && c); return(*--p - *--q); }