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

Defined functions

hdrstop defined in line 320; used 2 times
main defined in line 39; never used

Defined variables

copyright defined in line 8; never used
hdrjmp defined in line 26; used 2 times
sccsid defined in line 14; never used
Last modified: 1985-09-18
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1412
Valid CSS Valid XHTML 1.0 Strict