9 date 94.04.21.18.20.50; author jromine; state Exp;
14 date 93.08.25.17.27.27; author jromine; state Exp;
19 date 92.12.15.00.20.22; author jromine; state Exp;
24 date 92.11.04.00.57.54; author jromine; state Exp;
29 date 92.02.12.17.49.00; author jromine; state Exp;
34 date 92.02.05.07.26.30; author jromine; state Exp;
39 date 92.01.31.22.25.16; author jromine; state Exp;
44 date 90.11.05.13.05.54; author mh; state Exp;
49 date 90.04.05.15.02.11; author sources; state Exp;
54 date 90.03.17.09.54.07; author sources; state Exp;
59 date 90.03.12.14.21.19; author sources; state Exp;
64 date 90.02.06.13.28.40; author sources; state Exp;
69 date 90.02.06.13.28.27; author sources; state Exp;
80 @update for scansbr.c -- overload {folder}.c_flags with hdrflg
83 @/* rcvtty.c - a rcvmail program (a lot like rcvalert) handling IPC ttys */
85 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.12 1993/08/25 17:27:27 jromine Exp jromine $";
92 #include "../h/rcvmail.h"
93 #include "../h/scansbr.h"
94 #include "../zotnet/tws.h"
106 "%2(hour{dtimenow}):%02(min{dtimenow}): %<(size)%5(size) %>%<{encrypted}E%>\
107 %<(mymbox{from})%<{to}To:%14(friendly{to})%>%>%<(zero)%17(friendly{from})%> \
108 %{subject}%<{body}<<%{body}>>%>"
110 static struct swit switches[] = {
118 "form formatfile", 0,
136 static jmp_buf myctx;
141 static int message_fd(), header_fd();
145 static int newline = 1;
147 static char *form = NULL;
148 static char *format = NULL;
171 #endif /* not TTYD */
174 setlocale(LC_ALL, "");
176 invo_name = r1bindex (argv[0], '/');
177 mts_init (invo_name);
178 if ((cp = m_find (invo_name)) != NULL) {
179 ap = brkstring (cp = getcpy (cp), " ", "\n");
180 ap = copyip (ap, arguments);
184 (void) copyip (argv + 1, ap);
189 while (cp = *argp++) {
191 switch (smatch (++cp, switches)) {
193 ambigsw (cp, switches);
199 (void) sprintf (buf, "%s [command ...]", invo_name);
200 help (buf, switches);
208 if (!(form = *argp++) || *form == '-')
209 adios (NULLCP, "missing argument to %s", argp[-2]);
213 if (!(format = *argp++) || *format == '-')
214 adios (NULLCP, "missing argument to %s", argp[-2]);
238 if ((md = vecp ? message_fd (vec) : header_fd ()) == NOTOK)
243 if ((uf = fopen ("/etc/utmp", "r")) == NULL)
245 while (fread ((char *) &ut, sizeof ut, 1, uf) == 1)
246 if (ut.ut_name[0] != 0
247 && strncmp (user, ut.ut_name, sizeof ut.ut_name) == 0) {
248 (void) strncpy (tty, ut.ut_line, sizeof ut.ut_line);
263 static TYPESIG alrmser (i)
266 longjmp (myctx, DONE);
270 static int message_fd (vec)
279 (void) unlink (mktemp (strcpy (tmpfil, "/tmp/rcvttyXXXXX")));
280 if ((fd = creat (tmpfil, 0600)) == NOTOK)
284 if ((fd = open (tmpfil, 2)) == NOTOK)
286 (void) unlink (tmpfil);
290 switch (child_id = vfork ()) {
297 if (dup2 (fd, 1) == NOTOK || dup2 (fd, 2) == NOTOK)
301 (void) setpgrp (0, getpid ());
303 execvp (vec[0], vec);
307 switch (setjmp (myctx)) {
309 (void) signal (SIGALRM, alrmser);
310 bytes = fstat (fileno (stdin), &st) != NOTOK
311 ? (int) st.st_size : 100;
314 (void) alarm ((unsigned) (bytes * 60 + 300));
316 (void) pidwait (child_id, OK);
319 if (fstat (fd, &st) != NOTOK && st.st_size > (off_t)0)
326 (void) kill (child_id, SIGKILL);
328 (void) killpg (child_id, SIGKILL);
338 static int header_fd () {
342 (void) strcpy (tmpfil, m_tmpfil (invo_name));
343 if ((fd = creat (tmpfil, 0600)) == NOTOK)
347 if ((fd = open (tmpfil, 2)) == NOTOK)
349 (void) unlink (tmpfil);
352 (void) scan (stdin, 0, 0, new_fs (form, format, SCANFMT), 0, 0, 0,
355 (void) write (fd, "\n\r", 2);
356 (void) write (fd, scanl, strlen (scanl));
358 (void) write (fd, "\007", 1);
366 static alert (tty, md)
376 (void) sprintf (ttyspec, "/dev/%s", tty);
377 if (stat (ttyspec, &st) == NOTOK ||
378 (st.st_mode & (biff ? S_IEXEC :
387 switch (setjmp (myctx)) {
389 (void) signal (SIGALRM, alrmser);
391 td = open (ttyspec, 1);
402 (void) lseek (md, (off_t)0, 0);
404 while ((i = read (md, buffer, sizeof buffer)) > 0)
405 if (write (td, buffer, i) != i)
414 static alert (user, md)
422 if ((td = ttyw ("notify", NULLCP, NULLCP, user)) == NOTOK)
424 (void) signal (SIGPIPE, SIG_IGN);
426 (void) lseek (md, (off_t), 0);
427 while ((i = read (md, buffer, sizeof buffer)) > 0)
428 if (write (td, buffer, i) != i)
439 @off_t fixes for BSD44
444 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.11 1992/12/15 00:20:22 jromine Exp jromine $";
447 (void) scan (stdin, 0, 0, new_fs (form, format, SCANFMT), 0, 0, 0, 0, 0L, 0);
458 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.10 1992/11/04 00:57:54 jromine Exp jromine $";
464 if (fstat (fd, &st) != NOTOK && st.st_size > 0L)
467 (void) lseek (md, 0L, 0);
470 (void) lseek (md, 0L, 0);
482 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.9 1992/02/12 17:49:00 jromine Exp jromine $";
521 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.8 1992/02/05 07:26:30 jromine Exp jromine $";
526 static int alrmser (i)
532 @put unseen sequence in mh-format
537 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.7 1992/01/31 22:25:16 jromine Exp jromine $";
540 %<(mymbox{from})To:%14(friendly{to})%|%17(friendly{from})%> \
551 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.6 1990/11/05 13:05:54 mh Exp jromine $";
554 (void) scan (stdin, 0, 0, new_fs (form, format, SCANFMT), 0, 0, 0, 0L, 0);
560 @fix from author -- don't display size if zero
565 static char ident[] = "@@(#)$Id: rcvtty.c,v 1.5 90/04/05 15:02:11 sources Exp Locker: mh $";
571 if (ut.ut_name[0] != NULL
582 static char ident[] = "@@(#)$Id:$";
585 "%2(hour{dtimenow}):%02(min{dtimenow}): %5(size) %<{encrypted}E%>\
591 @fixes from jeff honig
592 add {dtimenow} to scansbr
593 add a bunch of options to rcvtty
602 @check group write on tty under BSD43
611 (void) scan (stdin, 0, 0, NULLCP, 0, 0, 0, 0L, 0);
615 if (stat (ttyspec, &st) == NOTOK ||
617 (st.st_mode & 02) == 0
619 (st.st_mode & (S_IWRITE >> 3)) == 0 /* group permissions */
632 if (stat (ttyspec, &st) == NOTOK || (st.st_mode & 02) == 0)