1: #
   2: 
   3: #include "rcv.h"
   4: #include <sys/stat.h>
   5: 
   6: /*
   7:  * Mail -- a mail program
   8:  *
   9:  * Startup -- interface with user.
  10:  */
  11: 
  12: static char *SccsId = "@(#)main.c	2.11 6/12/83";
  13: 
  14: jmp_buf hdrjmp;
  15: 
  16: /*
  17:  * Find out who the user is, copy his mail file (if exists) into
  18:  * /tmp/Rxxxxx and set up the message pointers.  Then, print out the
  19:  * message headers and read user commands.
  20:  *
  21:  * Command line syntax:
  22:  *	Mail [ -i ] [ -r address ] [ -h number ] [ -f [ name ] ]
  23:  * or:
  24:  *	Mail [ -i ] [ -r address ] [ -h number ] people ...
  25:  */
  26: 
  27: main(argc, argv)
  28:     char **argv;
  29: {
  30:     register char *ef;
  31:     register int i, argp;
  32:     int mustsend, uflag, hdrstop(), (*prevint)(), f;
  33:     FILE *ibuf, *ftat;
  34:     extern char _sobuf[];
  35:     struct sgttyb tbuf;
  36: 
  37: #ifdef signal
  38:     Siginit();
  39: #endif
  40: 
  41:     /*
  42: 	 * Set up a reasonable environment.  We clobber the last
  43: 	 * element of argument list for compatibility with version 6,
  44: 	 * figure out whether we are being run interactively, set up
  45: 	 * all the temporary files, buffer standard output, and so forth.
  46: 	 */
  47: 
  48:     uflag = 0;
  49:     argv[argc] = (char *) -1;
  50: #ifdef  GETHOST
  51:     inithost();
  52: #endif	GETHOST
  53:     mypid = getpid();
  54:     intty = isatty(0);
  55:     outtty = isatty(1);
  56:     if (outtty) {
  57:         gtty(1, &tbuf);
  58:         baud = tbuf.sg_ospeed;
  59:     }
  60:     else
  61:         baud = B9600;
  62:     image = -1;
  63:     setbuf(stdout, _sobuf);
  64: 
  65:     /*
  66: 	 * Now, determine how we are being used.
  67: 	 * We successively pick off instances of -r, -h, -f, and -i.
  68: 	 * If called as "rmail" we note this fact for letter sending.
  69: 	 * If there is anything left, it is the base of the list
  70: 	 * of users to mail to.  Argp will be set to point to the
  71: 	 * first of these users.
  72: 	 */
  73: 
  74:     ef = NOSTR;
  75:     argp = -1;
  76:     mustsend = 0;
  77:     if (argc > 0 && **argv == 'r')
  78:         rmail++;
  79:     for (i = 1; i < argc; i++) {
  80: 
  81:         /*
  82: 		 * If current argument is not a flag, then the
  83: 		 * rest of the arguments must be recipients.
  84: 		 */
  85: 
  86:         if (*argv[i] != '-') {
  87:             argp = i;
  88:             break;
  89:         }
  90:         switch (argv[i][1]) {
  91:         case 'r':
  92:             /*
  93: 			 * Next argument is address to be sent along
  94: 			 * to the mailer.
  95: 			 */
  96:             if (i >= argc - 1) {
  97:                 fprintf(stderr, "Address required after -r\n");
  98:                 exit(1);
  99:             }
 100:             mustsend++;
 101:             rflag = argv[i+1];
 102:             i++;
 103:             break;
 104: 
 105:         case 'T':
 106:             /*
 107: 			 * Next argument is temp file to write which
 108: 			 * articles have been read/deleted for netnews.
 109: 			 */
 110:             if (i >= argc - 1) {
 111:                 fprintf(stderr, "Name required after -T\n");
 112:                 exit(1);
 113:             }
 114:             Tflag = argv[i+1];
 115:             if ((f = creat(Tflag, 0600)) < 0) {
 116:                 perror(Tflag);
 117:                 exit(1);
 118:             }
 119:             close(f);
 120:             i++;
 121:             break;
 122: 
 123:         case 'u':
 124:             /*
 125: 			 * Next argument is person to pretend to be.
 126: 			 */
 127:             uflag++;
 128:             if (i >= argc - 1) {
 129:                 fprintf(stderr, "Missing user name for -u\n");
 130:                 exit(1);
 131:             }
 132:             strcpy(myname, argv[i+1]);
 133:             i++;
 134:             break;
 135: 
 136:         case 'i':
 137:             /*
 138: 			 * User wants to ignore interrupts.
 139: 			 * Set the variable "ignore"
 140: 			 */
 141:             assign("ignore", "");
 142:             break;
 143: 
 144:         case 'd':
 145:             debug++;
 146:             break;
 147: 
 148:         case 'h':
 149:             /*
 150: 			 * Specified sequence number for network.
 151: 			 * This is the number of "hops" made so
 152: 			 * far (count of times message has been
 153: 			 * forwarded) to help avoid infinite mail loops.
 154: 			 */
 155:             if (i >= argc - 1) {
 156:                 fprintf(stderr, "Number required for -h\n");
 157:                 exit(1);
 158:             }
 159:             mustsend++;
 160:             hflag = atoi(argv[i+1]);
 161:             if (hflag == 0) {
 162:                 fprintf(stderr, "-h needs non-zero number\n");
 163:                 exit(1);
 164:             }
 165:             i++;
 166:             break;
 167: 
 168:         case 's':
 169:             /*
 170: 			 * Give a subject field for sending from
 171: 			 * non terminal
 172: 			 */
 173:             if (i >= argc - 1) {
 174:                 fprintf(stderr, "Subject req'd for -s\n");
 175:                 exit(1);
 176:             }
 177:             mustsend++;
 178:             sflag = argv[i+1];
 179:             i++;
 180:             break;
 181: 
 182:         case 'f':
 183:             /*
 184: 			 * User is specifying file to "edit" with Mail,
 185: 			 * as opposed to reading system mailbox.
 186: 			 * If no argument is given after -f, we read his
 187: 			 * mbox file in his home directory.
 188: 			 */
 189:             if (i >= argc - 1)
 190:                 ef = mbox;
 191:             else
 192:                 ef = argv[i + 1];
 193:             i++;
 194:             break;
 195: 
 196:         case 'n':
 197:             /*
 198: 			 * User doesn't want to source /usr/lib/Mail.rc
 199: 			 */
 200:             nosrc++;
 201:             break;
 202: 
 203:         case 'N':
 204:             /*
 205: 			 * Avoid initial header printing.
 206: 			 */
 207:             noheader++;
 208:             break;
 209: 
 210:         case 'v':
 211:             /*
 212: 			 * Send mailer verbose flag
 213: 			 */
 214:             assign("verbose", "");
 215:             break;
 216: 
 217:         default:
 218:             fprintf(stderr, "Unknown flag: %s\n", argv[i]);
 219:             exit(1);
 220:         }
 221:     }
 222: 
 223:     /*
 224: 	 * Check for inconsistent arguments.
 225: 	 */
 226: 
 227:     if (ef != NOSTR && argp != -1) {
 228:         fprintf(stderr, "Cannot give -f and people to send to.\n");
 229:         exit(1);
 230:     }
 231:     if (mustsend && argp == -1) {
 232:         fprintf(stderr, "The flags you gave make no sense since you're not sending mail.\n");
 233:         exit(1);
 234:     }
 235:     tinit();
 236:     input = stdin;
 237:     rcvmode = argp == -1;
 238:     if (!nosrc)
 239:         load(MASTER);
 240:     load(mailrc);
 241:     if (argp != -1) {
 242:         mail(&argv[argp]);
 243: 
 244:         /*
 245: 		 * why wait?
 246: 		 */
 247: 
 248:         exit(senderr);
 249:     }
 250: 
 251:     /*
 252: 	 * Ok, we are reading mail.
 253: 	 * Decide whether we are editing a mailbox or reading
 254: 	 * the system mailbox, and open up the right stuff.
 255: 	 */
 256: 
 257:     if (ef != NOSTR) {
 258:         char *ename;
 259: 
 260:         edit++;
 261:         ename = expand(ef);
 262:         if (ename != ef) {
 263:             ef = (char *) calloc(1, strlen(ename) + 1);
 264:             strcpy(ef, ename);
 265:         }
 266:         editfile = ef;
 267:         strcpy(mailname, ef);
 268:     }
 269:     if (setfile(mailname, edit) < 0) {
 270:         if (edit)
 271:             perror(mailname);
 272:         else
 273:             fprintf(stderr, "No mail for %s\n", myname);
 274:         exit(1);
 275:     }
 276:     if (!edit && !noheader && value("noheader") == NOSTR) {
 277:         if (setjmp(hdrjmp) == 0) {
 278:             if ((prevint = sigset(SIGINT, SIG_IGN)) != SIG_IGN)
 279:                 sigset(SIGINT, hdrstop);
 280:             announce(!0);
 281:             fflush(stdout);
 282:             sigset(SIGINT, prevint);
 283:         }
 284:     }
 285:     if (edit)
 286:         newfileinfo();
 287:     if (!edit && msgCount == 0) {
 288:         printf("No mail\n");
 289:         fflush(stdout);
 290:         exit(0);
 291:     }
 292:     commands();
 293:     if (!edit) {
 294:         sigset(SIGHUP, SIG_IGN);
 295:         sigset(SIGINT, SIG_IGN);
 296:         sigset(SIGQUIT, SIG_IGN);
 297:         quit();
 298:     }
 299:     exit(0);
 300: }
 301: 
 302: /*
 303:  * Interrupt printing of the headers.
 304:  */
 305: hdrstop()
 306: {
 307: 
 308:     clrbuf(stdout);
 309:     printf("\nInterrupt\n");
 310:     fflush(stdout);
 311:     sigrelse(SIGINT);
 312:     longjmp(hdrjmp, 1);
 313: }

Defined functions

hdrstop defined in line 305; used 2 times
main defined in line 27; never used

Defined variables

SccsId defined in line 12; never used
hdrjmp defined in line 14; used 2 times
Last modified: 1983-07-08
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 984
Valid CSS Valid XHTML 1.0 Strict