9 date 93.08.25.17.28.05; author jromine; state Exp;
14 date 93.08.20.15.54.44; author jromine; state Exp;
19 date 92.12.15.00.20.22; author jromine; state Exp;
24 date 92.12.03.17.42.42; author jromine; state Exp;
29 date 92.11.24.18.10.13; author jromine; state Exp;
34 date 92.10.26.16.48.46; author jromine; state Exp;
39 date 92.10.16.22.34.49; author jromine; state Exp;
44 date 92.10.16.22.30.15; author jromine; state Exp;
49 date 92.10.16.21.37.40; author jromine; state Exp;
54 date 92.01.31.22.27.17; author jromine; state Exp;
59 date 92.01.31.16.35.02; author jromine; state Exp;
64 date 90.04.05.14.57.18; author sources; state Exp;
69 date 90.02.06.13.30.51; author sources; state Exp;
74 date 90.02.05.14.26.30; author sources; state Exp;
79 date 89.11.17.15.58.11; author sources; state Exp;
84 date 89.11.17.15.44.55; author sources; state Exp;
95 @off_t fixes for BSD44
98 @/* sendsbr.c - routines to help WhatNow/Send along */
100 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.13 1993/08/20 15:54:44 jromine Exp jromine $";
107 #include <sys/types.h>
108 #include <sys/stat.h>
110 static alert(), anno(), annoaux();
112 static int sendaux();
114 static int sendaux2();
119 int debugsw = 0; /* global */
128 char *altmsg = NULL; /* .. */
129 char *annotext = NULL;
130 char *distfile = NULL;
133 static int armed = 0;
143 int sendsbr (vec, vecp, drft, st)
152 switch (setjmp (env)) {
154 status = sendaux (vec, vecp, drft, st) ? NOTOK : OK;
163 (void) unlink (distfile);
171 #include "../h/mhn.h"
173 static int sendaux (vec, vecp, drft, st)
177 register struct stat *st;
198 || stat (drft, &sts) == NOTOK
199 || sts.st_size < CPERMSG) {
202 return sendaux2 (vec, vecp, drft, st);
205 if ((in = fopen (drft, "r")) == NULL)
206 adios (drft, "unable to open for reading");
210 for (compnum = 1, state = FLD;;) {
211 switch (state = m_getfld (state, name, buffer, sizeof buffer, in)) {
217 if (uleq (name, VRSN_FIELD)
218 || uleq (name, "Encrypted")
219 || uleq (name, "Message-ID")) {
220 while (state == FLDPLUS)
221 state = m_getfld (state, name, buffer, sizeof buffer,
225 if (uprf (name, XXX_FIELD_PRF)) {
226 dp = add (concat (name, ":", buffer, NULLCP), dp);
227 while (state == FLDPLUS) {
228 state = m_getfld (state, name, buffer,
230 dp = add (buffer, dp);
234 cp = add (concat (name, ":", buffer, NULLCP), cp);
235 while (state == FLDPLUS) {
236 state = m_getfld (state, name, buffer,
238 cp = add (buffer, cp);
241 if (state != FLDEOF) {
242 start = ftell (in) + 1;
253 adios (NULLCP, "message format error in component #%d",
257 adios (NULLCP, "getfld () returned %d", state);
263 adios (NULLCP, "headers missing from draft");
265 nparts = 1, pos = start;
266 while (fgets (buffer, sizeof buffer - 1, in)) {
269 if ((pos += (len = strlen (buffer))) > CPERMSG)
283 printf ("Sending as %d Partial Messages\n", nparts);
284 (void) fflush (stdout);
288 vec[vecp++] = "-partno";
289 vec[vecp++] = partnum;
291 vec[vecp++] = "-queued";
293 (void) time (&clock);
294 (void) sprintf (msgid, "<%d.%ld@@%s>", getpid (), clock, LocalName ());
296 (void) fseek (in, start, 0);
297 for (partno = 1; partno <= nparts; partno++) {
301 (void) strcpy (tmpdrf, m_scratch (drft, invo_name));
302 if ((out = fopen (tmpdrf, "w")) == NULL)
303 adios (tmpdrf, "unable to open for writing");
304 (void) chmod (tmpdrf, 0600);
306 (void) fputs (cp, out);
307 fprintf (out, "%s: %s\n", VRSN_FIELD, VRSN_VALUE);
309 "%s: message/partial; id=\"%s\"; number=%d; total=%d\n",
310 TYPE_FIELD, msgid, partno, nparts);
311 fprintf (out, "%s: part %d of %d\n\n", DESCR_FIELD, partno,
316 (void) fputs (dp, out);
317 fprintf (out, "Message-ID: %s\n", msgid);
325 if (!fgets (buffer, sizeof buffer - 1, in)) {
326 if (partno == nparts)
328 adios (NULLCP, "premature eof");
331 if ((pos += (len = strlen (buffer))) > CPERMSG) {
332 (void) fseek (in, -len, 1);
336 (void) fputs (buffer, out);
340 adios (tmpdrf, "error writing to");
344 if (!pushsw && verbsw) {
346 (void) fflush (stdout);
348 if (splitsw > 0 && 1 < partno && partno < nparts) {
350 printf ("pausing %d seconds before sending part %d...\n",
352 (void) fflush (stdout);
355 sleep ((unsigned) splitsw);
358 (void) sprintf (partnum, "%d", partno);
359 status = sendaux2 (vec, vecp, tmpdrf, st);
360 (void) unlink (tmpdrf);
374 rename (drft, strcpy (buffer, m_backup (drft))) == NOTOK)
375 advise (buffer, "unable to rename %s to", drft);
384 static int sendaux (vec, vecp, drft, st)
386 static int sendaux2 (vec, vecp, drft, st)
391 register struct stat *st;
402 fd = pushsw ? tmp_fd () : NOTOK;
405 if (pushsw && unique) {
406 if (rename (drft, strcpy (file, m_scratch (drft, invo_name)))
408 adios (file, "unable to rename %s to", drft);
413 if ((fd2 = tmp_fd ()) != NOTOK) {
414 vec[vecp++] = "-idanno";
415 (void) sprintf (buf, "%d", fd2);
419 admonish (NULLCP, "unable to create file for annotation list");
420 if (distfile && distout (drft, distfile, backup) == NOTOK)
424 for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
427 case NOTOK: /* oops */
428 adios ("fork", "unable to");
430 case OK: /* send it */
432 (void) dup2 (fd, fileno (stdout));
433 (void) dup2 (fd, fileno (stderr));
436 execvp (postproc, vec);
437 fprintf (stderr, "unable to exec ");
441 default: /* wait for it */
442 if ((status = pidwait (child_id, NOTOK)) == 0) {
443 if (annotext && fd2 != NOTOK)
446 && rename (drft, strcpy (buf, m_backup (drft)))
448 advise (buf, "unable to rename %s to", drft);
456 advise (NULLCP, "message not delivered to anyone");
457 if (annotext && fd2 != NOTOK)
460 (void) unlink (drft);
461 if (rename (backup, drft) == NOTOK)
462 advise (drft, "unable to rename %s to", backup);
473 static alert (file, out)
482 for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
485 case NOTOK: /* oops */
486 advise ("fork", "unable to");
488 case OK: /* send it */
489 (void) signal (SIGHUP, SIG_IGN);
490 (void) signal (SIGINT, SIG_IGN);
491 (void) signal (SIGQUIT, SIG_IGN);
492 (void) signal (SIGTERM, SIG_IGN);
494 if ((in = open (file, 0)) == NOTOK)
495 admonish (file, "unable to re-open");
497 (void) lseek (out, (off_t)0, 2);
498 (void) strcpy (buf, "\nMessage not delivered to anyone.\n");
499 (void) write (out, buf, strlen (buf));
500 (void) strcpy (buf, "\n------- Unsent Draft\n\n");
501 (void) write (out, buf, strlen (buf));
502 cpydgst (in, out, file, "temporary file");
504 (void) strcpy (buf, "\n------- End of Unsent Draft\n");
505 (void) write (out, buf, strlen (buf));
506 if (rename (file, strcpy (buf, m_backup (file))) == NOTOK)
507 admonish (buf, "unable to rename %s to", file);
509 (void) lseek (out, (off_t)0, 0);
510 (void) dup2 (out, fileno (stdin));
512 (void) sprintf (buf, "send failed on %s",
513 forwsw ? "enclosed draft" : file);
515 execlp (mailproc, r1bindex (mailproc, '/'), getusr (),
516 "-subject", buf, NULLCP);
517 fprintf (stderr, "unable to exec ");
521 default: /* no waiting... */
528 static int tmp_fd () {
532 (void) strcpy (tmpfil, m_tmpfil (invo_name));
533 if ((fd = creat (tmpfil, 0600)) == NOTOK)
537 if ((fd = open (tmpfil, 2)) == NOTOK)
540 advise (NULLCP, "temporary file %s selected", tmpfil);
542 if (unlink (tmpfil) == NOTOK)
543 advise (tmpfil, "unable to remove");
552 register struct stat *st;
555 TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
556 static char *cwd = NULL;
560 (stat (altmsg, &st2) == NOTOK
561 || st -> st_mtime != st2.st_mtime
562 || st -> st_dev != st2.st_dev
563 || st -> st_ino != st2.st_ino)) {
565 admonish (NULLCP, "$mhaltmsg mismatch");
569 child_id = debugsw ? NOTOK : fork ();
571 case NOTOK: /* oops */
574 "unable to fork, so doing annotations by hand...");
576 cwd = getcpy (pwd ());
579 hstat = signal (SIGHUP, SIG_IGN);
580 istat = signal (SIGINT, SIG_IGN);
581 qstat = signal (SIGQUIT, SIG_IGN);
582 tstat = signal (SIGTERM, SIG_IGN);
588 (void) signal (SIGHUP, hstat);
589 (void) signal (SIGINT, istat);
590 (void) signal (SIGQUIT, qstat);
591 (void) signal (SIGTERM, tstat);
596 default: /* no waiting... */
618 if ((folder = getenv ("mhfolder")) == NULL || *folder == 0) {
620 admonish (NULLCP, "$mhfolder not set");
623 maildir = m_maildir (folder);
624 if (chdir (maildir) == NOTOK) {
626 admonish (maildir, "unable to change directory to");
629 if (!(mp = m_gmsg (folder))) {
631 admonish (NULLCP, "unable to read folder %s");
634 if (mp -> hghmsg == 0) {
636 admonish (NULLCP, "no messages in %s", folder);
640 if ((cp = getenv ("mhmessages")) == NULL || *cp == 0) {
642 admonish (NULLCP, "$mhmessages not set");
645 if (!debugsw /* MOBY HACK... */
647 && (fd3 = open ("/dev/null", 2)) != NOTOK
648 && (fd2 = dup (fileno (stderr))) != NOTOK) {
649 (void) dup2 (fd3, fileno (stderr));
654 for (ap = brkstring (cp = getcpy (cp), " ", NULLCP); *ap; ap++)
655 (void) m_convert (mp, *ap);
658 (void) dup2 (fd2, fileno (stderr));
659 if (mp -> numsel == 0) {
661 admonish (NULLCP, "no messages to annotate");
665 (void) lseek (fd, (off_t)0, 0);
666 if ((fp = fdopen (fd, "r")) == NULL) {
668 admonish (NULLCP, "unable to fdopen annotation list");
672 while (fgets (buffer, sizeof buffer, fp) != NULL)
673 cp = add (buffer, cp);
677 advise (NULLCP, "annotate%s with %s: \"%s\"",
678 inplace ? " inplace" : "", annotext, cp);
679 for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
680 if (mp -> msgstats[msgnum] & SELECTED) {
682 advise (NULLCP, "annotate message %d", msgnum);
683 (void) annotate (m_name (msgnum), annotext, cp, inplace, 1);
698 longjmp (env, status ? status : NOTOK);
708 -partno, -queued interface
713 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.12 1992/12/15 00:20:22 jromine Exp jromine $";
716 long lseek (), time ();
719 (void) lseek (out, 0L, 2);
722 (void) lseek (out, 0L, 0);
725 (void) lseek (fd, 0L, 0);
736 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.11 1992/12/03 17:42:42 jromine Exp jromine $";
741 vec[vecp++] = "-partno";
742 vec[vecp++] = partnum;
746 if (uleq (name, VRSN_FIELD) || uleq (name, "Message-ID")) {
755 @fixes for -split 0 (from mtr)
760 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.10 1992/11/24 18:10:13 jromine Exp jromine $";
772 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.9 1992/10/26 16:48:46 jromine Exp jromine $";
775 (void) fputs (dp, out);
789 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.8 1992/10/16 22:34:49 jromine Exp jromine $";
793 int sendaux (vec, vecp, drft, st)
804 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.7 1992/10/16 22:30:15 jromine Exp jromine $";
818 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.6 1992/10/16 21:37:40 jromine Exp jromine $";
821 if (uleq (name, VRSN_FIELD)) {
824 if (uprf (name, XXX_FIELD_PRF)) {
825 dp = add (concat (name, ": ", buffer, NULLCP), dp);
826 while (state == FLDPLUS) {
827 state = m_getfld (state, name, buffer, sizeof buffer,
829 dp = add (buffer, dp);
834 cp = add (concat (name, ": ", buffer, NULLCP), cp);
835 while (state == FLDPLUS) {
836 state = m_getfld (state, name, buffer, sizeof buffer,
838 cp = add (buffer, cp);
843 fprintf (out, "Content-Description: part %d of %d\n\n",
856 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.5 1992/01/31 22:27:17 jromine Exp jromine $";
876 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.4 1992/01/31 16:35:02 jromine Exp jromine $";
888 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.3 90/04/05 14:57:18 sources Exp $";
891 if ((folder = getenv ("mhfolder")) == NULL || *folder == NULL) {
894 if ((cp = getenv ("mhmessages")) == NULL || *cp == NULL) {
905 static char ident[] = "@@(#)$Id:$";
913 int sendaux (vec, vecp, drft, st)
917 if (annotext && fd2 != NOTOK)
920 if (rename (drft, strcpy (buf, m_backup (drft))) == NOTOK)
944 @changes for SUN40 shared libraries and NNTP under bbc
949 int (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
960 (void) annotate (m_name (msgnum), annotext, cp, inplace);