Annotation of 43BSD/contrib/mh/uip/rcvtty.c, revision 1.1.1.1

1.1       root        1: /* rcvtty.c - a rcvmail program (a lot like rcvalert) handling IPC ttys */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include "../h/rcvmail.h"
                      5: #include "../h/scansbr.h"
                      6: #include "../zotnet/tws.h"
                      7: #include <signal.h>
                      8: #include <sys/stat.h>
                      9: #ifndef        TTYD
                     10: #include <utmp.h>
                     11: #endif not TTYD
                     12: 
                     13: /*  */
                     14: 
                     15: static struct swit switches[] = {
                     16: #define        HELPSW  0
                     17:     "help", 4,
                     18: 
                     19:     NULL, NULL
                     20: };
                     21: 
                     22: /*  */
                     23: 
                     24: static  jmp_buf myctx;
                     25: 
                     26: long   lseek ();
                     27: char   *getusr ();
                     28: 
                     29: /*  */
                     30: 
                     31: /* ARGSUSED */
                     32: 
                     33: main (argc, argv)
                     34: int     argc;
                     35: char   **argv;
                     36: {
                     37:     int     md,
                     38:            vecp = 0;
                     39:     char   *cp,
                     40:            *user,
                     41:             buf[100],
                     42:           **ap,
                     43:           **argp,
                     44:            *arguments[MAXARGS],
                     45:           *vec[MAXARGS];
                     46: #ifndef        TTYD
                     47:     char    tty[BUFSIZ];
                     48:     struct utmp ut;
                     49:     register FILE  *uf;
                     50: #endif not TTYD
                     51: 
                     52:     invo_name = r1bindex (argv[0], '/');
                     53:     mts_init (invo_name);
                     54:     if ((cp = m_find (invo_name)) != NULL) {
                     55:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     56:        ap = copyip (ap, arguments);
                     57:     }
                     58:     else
                     59:        ap = arguments;
                     60:     (void) copyip (argv + 1, ap);
                     61:     argp = arguments;
                     62: 
                     63: /*  */
                     64: 
                     65:     while (cp = *argp++) {
                     66:        if (*cp == '-')
                     67:            switch (smatch (++cp, switches)) {
                     68:                case AMBIGSW: 
                     69:                    ambigsw (cp, switches);
                     70:                    done (1);
                     71:                case UNKWNSW: 
                     72:                    vec[vecp++] = --cp;
                     73:                    continue;
                     74:                case HELPSW: 
                     75:                    (void) sprintf (buf, "%s [command ...]", invo_name);
                     76:                    help (buf, switches);
                     77:                    done (1);
                     78:            }
                     79:        vec[vecp++] = cp;
                     80:     }
                     81:     vec[vecp] = 0;
                     82: 
                     83: /*  */
                     84: 
                     85:     if ((md = vecp ? message_fd (vec) : header_fd ()) == NOTOK)
                     86:        exit (RCV_MBX);
                     87: 
                     88:     user = getusr ();
                     89: #ifndef        TTYD
                     90:     if ((uf = fopen ("/etc/utmp", "r")) == NULL)
                     91:        exit (RCV_MBX);
                     92:     while (fread ((char *) &ut, sizeof ut, 1, uf) == 1)
                     93:        if (ut.ut_name[0] != NULL
                     94:                && strncmp (user, ut.ut_name, sizeof ut.ut_name) == 0) {
                     95:            (void) strncpy (tty, ut.ut_line, sizeof ut.ut_line);
                     96:            alert (tty, md);
                     97:        }
                     98:     (void) fclose (uf);
                     99: #else  TTYD
                    100:     alert (user, md);
                    101: #endif TTYD
                    102: 
                    103:     exit (RCV_MOK);
                    104: }
                    105: 
                    106: /*  */
                    107: 
                    108: /* ARGSUSED */
                    109: 
                    110: static int alrmser (i)
                    111: int     i;
                    112: {
                    113:     longjmp (myctx, DONE);
                    114: }
                    115: 
                    116: 
                    117: static int  message_fd (vec)
                    118: char   *vec[];
                    119: {
                    120:     int     bytes,
                    121:            child_id,
                    122:             fd;
                    123:     char    tmpfil[BUFSIZ];
                    124:     struct stat st;
                    125: 
                    126:     (void) unlink (mktemp (strcpy (tmpfil, "/tmp/rcvttyXXXXX")));
                    127:     if ((fd = creat (tmpfil, 0600)) == NOTOK)
                    128:        return header_fd ();
                    129:     (void) close (fd);
                    130: 
                    131:     if ((fd = open (tmpfil, 2)) == NOTOK)
                    132:        return header_fd ();
                    133:     (void) unlink (tmpfil);
                    134: 
                    135: /*  */
                    136: 
                    137:     switch (child_id = vfork ()) {
                    138:        case NOTOK: 
                    139:            (void) close (fd);
                    140:            return header_fd ();
                    141: 
                    142:        case OK: 
                    143:            rewind (stdin);
                    144:            if (dup2 (fd, 1) == NOTOK || dup2 (fd, 2) == NOTOK)
                    145:                _exit (-1);
                    146:            closefds (3);
                    147: #ifdef BSD42
                    148:            (void) setpgrp (0, getpid ());
                    149: #endif BSD42
                    150:            execvp (vec[0], vec);
                    151:            _exit (-1);
                    152: 
                    153:        default: 
                    154:            switch (setjmp (myctx)) {
                    155:                case OK: 
                    156:                    (void) signal (SIGALRM, alrmser);
                    157:                    bytes = fstat (fileno (stdin), &st) != NOTOK
                    158:                        ? (int) st.st_size : 100;
                    159:                    if (bytes <= 0)
                    160:                        bytes = 100;
                    161:                    (void) alarm ((unsigned) (bytes * 60 + 300));
                    162: 
                    163:                    (void) pidwait (child_id, OK);
                    164: 
                    165:                    (void) alarm (0);
                    166:                    if (fstat (fd, &st) != NOTOK && st.st_size > 0L)
                    167:                        return fd;
                    168:                    (void) close (fd);
                    169:                    return header_fd ();
                    170: 
                    171:                default: 
                    172: #ifndef        BSD42
                    173:                    (void) kill (child_id, SIGKILL);
                    174: #else  BSD42
                    175:                    (void) killpg (child_id, SIGKILL);
                    176: #endif BSD42
                    177:                    (void) close (fd);
                    178:                    return header_fd ();
                    179:            }
                    180:     }
                    181: }
                    182: 
                    183: /*  */
                    184: 
                    185: static int  header_fd () {
                    186:     int     fd;
                    187:     char    tmpfil[BUFSIZ];
                    188: 
                    189:     (void) strcpy (tmpfil, m_tmpfil (invo_name));
                    190:     if ((fd = creat (tmpfil, 0600)) == NOTOK)
                    191:        return NOTOK;
                    192:     (void) close (fd);
                    193: 
                    194:     if ((fd = open (tmpfil, 2)) == NOTOK)
                    195:        return NOTOK;
                    196:     (void) unlink (tmpfil);
                    197: 
                    198:     rewind (stdin);
                    199:     (void) scan (stdin, 0, 0, NULLVP, 0, 0, 0, 0L, 0);
                    200:     (void) write (fd, scanl, strlen (scanl));
                    201: 
                    202:     return fd;
                    203: }
                    204: 
                    205: /*  */
                    206: 
                    207: #ifndef        TTYD
                    208: static  alert (tty, md)
                    209: register char   *tty;
                    210: int     md;
                    211: {
                    212:     int     i,
                    213:             td;
                    214:     char    buffer[BUFSIZ],
                    215:             ttyspec[BUFSIZ];
                    216:     struct stat st;
                    217: 
                    218:     (void) sprintf (ttyspec, "/dev/%s", tty);
                    219:     if (stat (ttyspec, &st) == NOTOK || (st.st_mode & 02) == 0)
                    220:        return;
                    221: 
                    222:     switch (setjmp (myctx)) {
                    223:        case OK: 
                    224:            (void) signal (SIGALRM, alrmser);
                    225:            (void) alarm (2);
                    226:            td = open (ttyspec, 1);
                    227:            (void) alarm (0);
                    228:            if (td == NOTOK)
                    229:                return;
                    230:            break;
                    231: 
                    232:        default: 
                    233:            (void) alarm (0);
                    234:            return;
                    235:     }
                    236: 
                    237:     (void) lseek (md, 0L, 0);
                    238: 
                    239:     while ((i = read (md, buffer, sizeof buffer)) > 0)
                    240:        if (write (td, buffer, i) != i)
                    241:            break;
                    242: 
                    243:     (void) close (td);
                    244: }
                    245: #else  TTYD
                    246: 
                    247: /*  */
                    248: 
                    249: static  alert (user, md)
                    250: register char   *user;
                    251: int     md;
                    252: {
                    253:     int     i,
                    254:             td;
                    255:     char    buffer[BUFSIZ];
                    256: 
                    257:     if ((td = ttyw ("notify", NULLCP, NULLCP, user)) == NOTOK)
                    258:        return;
                    259:     (void) signal (SIGPIPE, SIG_IGN);
                    260: 
                    261:     (void) lseek (md, 0L, 0);
                    262:     while ((i = read (md, buffer, sizeof buffer)) > 0)
                    263:        if (write (td, buffer, i) != i)
                    264:            break;
                    265: 
                    266:     (void) close (td);
                    267: }
                    268: #endif TTYD

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.