Added all of the MH sources, including RCS files, in
[mmh] / docs / historical / mh-6.8.5 / uip / RCS / sendsbr.c,v
1 head    2.14;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 2.14
9 date    93.08.25.17.28.05;      author jromine; state Exp;
10 branches;
11 next    2.13;
12
13 2.13
14 date    93.08.20.15.54.44;      author jromine; state Exp;
15 branches;
16 next    2.12;
17
18 2.12
19 date    92.12.15.00.20.22;      author jromine; state Exp;
20 branches;
21 next    2.11;
22
23 2.11
24 date    92.12.03.17.42.42;      author jromine; state Exp;
25 branches;
26 next    2.10;
27
28 2.10
29 date    92.11.24.18.10.13;      author jromine; state Exp;
30 branches;
31 next    2.9;
32
33 2.9
34 date    92.10.26.16.48.46;      author jromine; state Exp;
35 branches;
36 next    2.8;
37
38 2.8
39 date    92.10.16.22.34.49;      author jromine; state Exp;
40 branches;
41 next    2.7;
42
43 2.7
44 date    92.10.16.22.30.15;      author jromine; state Exp;
45 branches;
46 next    2.6;
47
48 2.6
49 date    92.10.16.21.37.40;      author jromine; state Exp;
50 branches;
51 next    2.5;
52
53 2.5
54 date    92.01.31.22.27.17;      author jromine; state Exp;
55 branches;
56 next    2.4;
57
58 2.4
59 date    92.01.31.16.35.02;      author jromine; state Exp;
60 branches;
61 next    2.3;
62
63 2.3
64 date    90.04.05.14.57.18;      author sources; state Exp;
65 branches;
66 next    2.2;
67
68 2.2
69 date    90.02.06.13.30.51;      author sources; state Exp;
70 branches;
71 next    2.1;
72
73 2.1
74 date    90.02.05.14.26.30;      author sources; state Exp;
75 branches;
76 next    2.0;
77
78 2.0
79 date    89.11.17.15.58.11;      author sources; state Exp;
80 branches;
81 next    1.1;
82
83 1.1
84 date    89.11.17.15.44.55;      author sources; state Exp;
85 branches;
86 next    ;
87
88
89 desc
90 @@
91
92
93 2.14
94 log
95 @off_t fixes for BSD44
96 @
97 text
98 @/* sendsbr.c - routines to help WhatNow/Send along */
99 #ifndef lint
100 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.13 1993/08/20 15:54:44 jromine Exp jromine $";
101 #endif  /* lint */
102
103 #include "../h/mh.h"
104 #include <setjmp.h>
105 #include <stdio.h>
106 #include <signal.h>
107 #include <sys/types.h>
108 #include <sys/stat.h>
109
110 static          alert(), anno(), annoaux();
111 static int      tmp_fd();
112 static int      sendaux();
113 #ifdef  MIME
114 static int      sendaux2();
115 #endif
116
117 /* \f */
118
119 int     debugsw = 0;            /* global */
120 int     forwsw = 1;
121 int     inplace = 0;
122 int     mime = 0;
123 int     pushsw = 0;
124 int     splitsw = -1;
125 int     unique = 0;
126 int     verbsw = 0;
127
128 char   *altmsg = NULL;          /*  .. */
129 char   *annotext = NULL;
130 char   *distfile = NULL;
131
132
133 static int armed = 0;
134 static jmp_buf env;
135
136
137 char   *getusr ();
138 off_t   lseek ();
139 long    time ();
140
141 /* \f */
142
143 int     sendsbr (vec, vecp, drft, st)
144 char  **vec,
145        *drft;
146 int     vecp;
147 struct stat *st;
148 {
149     int     status;
150
151     armed++;
152     switch (setjmp (env)) {
153         case OK: 
154             status = sendaux (vec, vecp, drft, st) ? NOTOK : OK;
155             break;
156
157         default: 
158             status = DONE;
159             break;
160     }
161     armed = 0;
162     if (distfile)
163         (void) unlink (distfile);
164
165     return status;
166 }
167
168 /* \f */
169
170 #ifdef  MIME
171 #include "../h/mhn.h"
172
173 static int  sendaux (vec, vecp, drft, st)
174 register char **vec,
175                *drft;
176 int     vecp;
177 register struct stat *st;
178 {
179     int     compnum,
180             nparts,
181             partno,
182             state,
183             status;
184     long    clock,
185             pos,
186             start;
187     char   *cp,
188            *dp,
189             buffer[BUFSIZ],
190             msgid[BUFSIZ],
191             name[NAMESZ],
192             partnum[BUFSIZ];
193     struct stat sts;
194     FILE   *in;
195
196     if (splitsw < 0
197             || distfile
198             || stat (drft, &sts) == NOTOK
199             || sts.st_size < CPERMSG) {
200 one_shot: ;
201         splitsw = -1;
202         return sendaux2 (vec, vecp, drft, st);
203     }
204
205     if ((in = fopen (drft, "r")) == NULL)
206         adios (drft, "unable to open for reading");
207
208     cp = dp = NULL;
209     start = 0L;
210     for (compnum = 1, state = FLD;;) {
211         switch (state = m_getfld (state, name, buffer, sizeof buffer, in)) {
212             case FLD:
213             case FLDPLUS:
214             case FLDEOF:
215                 compnum++;
216
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,
222                                           in);
223                 }
224                 else
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,
229                                               sizeof buffer, in);
230                             dp = add (buffer, dp);
231                         }
232                     }
233                     else {
234                         cp = add (concat (name, ":", buffer, NULLCP), cp);
235                         while (state == FLDPLUS) {
236                             state = m_getfld (state, name, buffer,
237                                               sizeof buffer, in);
238                             cp = add (buffer, cp);
239                         }
240                     }
241                 if (state != FLDEOF) {
242                     start = ftell (in) + 1;
243                     continue;
244                 }
245                 /* else fall... */
246            case BODY:
247            case BODYEOF:
248            case FILEEOF:
249                 break;
250
251            case LENERR:
252            case FMTERR:
253                 adios (NULLCP, "message format error in component #%d",
254                        compnum);
255
256            default:
257                 adios (NULLCP, "getfld () returned %d", state);
258         }
259
260         break;
261     }
262     if (cp == NULL)
263         adios (NULLCP, "headers missing from draft");
264
265     nparts = 1, pos = start;
266     while (fgets (buffer, sizeof buffer - 1, in)) {
267         register long   len;
268
269         if ((pos += (len = strlen (buffer))) > CPERMSG)
270             nparts++, pos = len;
271     }
272     if (nparts == 1) {
273         free (cp);
274         if (dp)
275             free (dp);
276
277         (void) fclose (in);
278
279         goto one_shot;
280     }
281
282     if (!pushsw) {
283         printf ("Sending as %d Partial Messages\n", nparts);
284         (void) fflush (stdout);
285     }
286     status = OK;
287
288     vec[vecp++] = "-partno";
289     vec[vecp++] = partnum;
290     if (splitsw == 0)
291         vec[vecp++] = "-queued";
292
293     (void) time (&clock);
294     (void) sprintf (msgid, "<%d.%ld@@%s>", getpid (), clock, LocalName ());
295
296     (void) fseek (in, start, 0);
297     for (partno = 1; partno <= nparts; partno++) {
298         char    tmpdrf[BUFSIZ];
299         FILE   *out;
300
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);
305
306         (void) fputs (cp, out);
307         fprintf (out, "%s: %s\n", VRSN_FIELD, VRSN_VALUE);
308         fprintf (out,
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,
312                  nparts);
313
314         if (partno == 1) {
315             if (dp)
316                 (void) fputs (dp, out);
317             fprintf (out, "Message-ID: %s\n", msgid);
318             fprintf (out, "\n");
319         }
320
321         pos = 0;
322         for (;;) {
323             register long    len;
324
325             if (!fgets (buffer, sizeof buffer - 1, in)) {
326                 if (partno == nparts)
327                     break;
328                 adios (NULLCP, "premature eof");
329             }
330             
331             if ((pos += (len = strlen (buffer))) > CPERMSG) {
332                 (void) fseek (in, -len, 1);
333                 break;
334             }
335
336             (void) fputs (buffer, out);
337         }
338
339         if (fflush (out))
340             adios (tmpdrf, "error writing to");
341
342         (void) fclose (out);
343
344         if (!pushsw && verbsw) {
345             printf ("\n");
346             (void) fflush (stdout);
347         }
348         if (splitsw > 0 && 1 < partno && partno < nparts) {
349             if (!pushsw) {
350                 printf ("pausing %d seconds before sending part %d...\n",
351                         splitsw, partno);
352                 (void) fflush (stdout);
353             }
354
355             sleep ((unsigned) splitsw);
356         }
357
358         (void) sprintf (partnum, "%d", partno);
359         status = sendaux2 (vec, vecp, tmpdrf, st);
360         (void) unlink (tmpdrf);
361         if (status != OK)
362             break;
363
364         annotext = NULL;
365     }
366
367     free (cp);
368     if (dp)
369         free (dp);
370
371     (void) fclose (in);
372
373     if (status == OK &&
374             rename (drft, strcpy (buffer, m_backup (drft))) == NOTOK)
375         advise (buffer, "unable to rename %s to", drft);
376
377     return status;
378 }
379 #endif
380
381 /* \f */
382
383 #ifndef MIME
384 static int  sendaux (vec, vecp, drft, st)
385 #else   /* MIME */
386 static int  sendaux2 (vec, vecp, drft, st)
387 #endif  /* MIME */
388 register char **vec,
389                *drft;
390 int     vecp;
391 register struct stat *st;
392 {
393     int     child_id,
394             i,
395             status,
396             fd,
397             fd2;
398     char    backup[BUFSIZ],
399             buf[BUFSIZ],
400             file[BUFSIZ];
401
402     fd = pushsw ? tmp_fd () : NOTOK;
403     fd2 = NOTOK;
404
405     if (pushsw && unique) {
406         if (rename (drft, strcpy (file, m_scratch (drft, invo_name)))
407                 == NOTOK)
408             adios (file, "unable to rename %s to", drft);
409         drft = file;
410     }
411     vec[vecp++] = drft;
412     if (annotext)
413         if ((fd2 = tmp_fd ()) != NOTOK) {
414             vec[vecp++] = "-idanno";
415             (void) sprintf (buf, "%d", fd2);
416             vec[vecp++] = buf;
417         }
418         else
419             admonish (NULLCP, "unable to create file for annotation list");
420     if (distfile && distout (drft, distfile, backup) == NOTOK)
421         done (1);
422     vec[vecp] = NULL;
423
424     for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
425         sleep (5);
426     switch (child_id) {
427         case NOTOK:             /* oops */
428             adios ("fork", "unable to");
429
430         case OK:                /* send it */
431             if (fd != NOTOK) {
432                 (void) dup2 (fd, fileno (stdout));
433                 (void) dup2 (fd, fileno (stderr));
434                 (void) close (fd);
435             }
436             execvp (postproc, vec);
437             fprintf (stderr, "unable to exec ");
438             perror (postproc);
439             _exit (-1);
440
441         default:                /* wait for it */
442             if ((status = pidwait (child_id, NOTOK)) == 0) {
443                 if (annotext && fd2 != NOTOK)
444                     anno (fd2, st);
445                 if (splitsw < 0
446                         && rename (drft, strcpy (buf, m_backup (drft)))
447                                 == NOTOK)
448                     advise (buf, "unable to rename %s to", drft);
449             }
450             else {
451                 if (fd != NOTOK) {
452                     alert (drft, fd);
453                     (void) close (fd);
454                 }
455                 else
456                     advise (NULLCP, "message not delivered to anyone");
457                 if (annotext && fd2 != NOTOK)
458                     (void) close (fd2);
459                 if (distfile) {
460                     (void) unlink (drft);
461                     if (rename (backup, drft) == NOTOK)
462                         advise (drft, "unable to rename %s to", backup);
463                 }
464             }
465             break;
466     }
467
468     return status;
469 }
470
471 /* \f */
472
473 static  alert (file, out)
474 register char   *file;
475 int     out;
476 {
477     int     child_id,
478             i,
479             in;
480     char    buf[BUFSIZ];
481
482     for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
483         sleep (5);
484     switch (child_id) {
485         case NOTOK:             /* oops */
486             advise ("fork", "unable to");
487
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);
493             if (forwsw)
494                 if ((in = open (file, 0)) == NOTOK)
495                     admonish (file, "unable to re-open");
496                 else {
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");
503                     (void) close (in);
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);
508                 }
509             (void) lseek (out, (off_t)0, 0);
510             (void) dup2 (out, fileno (stdin));
511             (void) close (out);
512             (void) sprintf (buf, "send failed on %s",
513                         forwsw ? "enclosed draft" : file);
514
515             execlp (mailproc, r1bindex (mailproc, '/'), getusr (),
516                     "-subject", buf, NULLCP);
517             fprintf (stderr, "unable to exec ");
518             perror (mailproc);
519             _exit (-1);
520
521         default:                /* no waiting... */
522             break;
523     }
524 }
525
526 /* \f */
527
528 static int  tmp_fd () {
529     int     fd;
530     char    tmpfil[BUFSIZ];
531
532     (void) strcpy (tmpfil, m_tmpfil (invo_name));
533     if ((fd = creat (tmpfil, 0600)) == NOTOK)
534         return NOTOK;
535     (void) close (fd);
536
537     if ((fd = open (tmpfil, 2)) == NOTOK)
538         return NOTOK;
539     if (debugsw)
540         advise (NULLCP, "temporary file %s selected", tmpfil);
541     else
542         if (unlink (tmpfil) == NOTOK)
543             advise (tmpfil, "unable to remove");
544
545     return fd;
546 }
547
548 /* \f */
549
550 static anno (fd, st)
551 int     fd;
552 register struct stat *st;
553 {
554     int     child_id;
555     TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
556     static char *cwd = NULL;
557     struct stat st2;
558
559     if (altmsg &&
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)) {
564         if (debugsw)
565             admonish (NULLCP, "$mhaltmsg mismatch");
566         return;
567     }
568
569     child_id = debugsw ? NOTOK : fork ();
570     switch (child_id) {
571         case NOTOK:             /* oops */
572             if (!debugsw)
573                 advise (NULLCP,
574                             "unable to fork, so doing annotations by hand...");
575             if (cwd == NULL)
576                 cwd = getcpy (pwd ());
577
578         case OK: 
579             hstat = signal (SIGHUP, SIG_IGN);
580             istat = signal (SIGINT, SIG_IGN);
581             qstat = signal (SIGQUIT, SIG_IGN);
582             tstat = signal (SIGTERM, SIG_IGN);
583
584             annoaux (fd);
585             if (child_id == OK)
586                 _exit (0);
587
588             (void) signal (SIGHUP, hstat);
589             (void) signal (SIGINT, istat);
590             (void) signal (SIGQUIT, qstat);
591             (void) signal (SIGTERM, tstat);
592
593             (void) chdir (cwd);
594             break;
595
596         default:                /* no waiting... */
597             (void) close (fd);
598             break;
599     }
600 }
601
602 /* \f */
603
604 static  annoaux (fd)
605 int     fd;
606 {
607     int     fd2,
608             fd3,
609             msgnum;
610     char   *cp,
611            *folder,
612            *maildir,
613             buffer[BUFSIZ],
614           **ap;
615     FILE   *fp;
616     struct msgs *mp;
617
618     if ((folder = getenv ("mhfolder")) == NULL || *folder == 0) {
619         if (debugsw)
620             admonish (NULLCP, "$mhfolder not set");
621         return;
622     }
623     maildir = m_maildir (folder);
624     if (chdir (maildir) == NOTOK) {
625         if (debugsw)
626             admonish (maildir, "unable to change directory to");
627         return;
628     }
629     if (!(mp = m_gmsg (folder))) {
630         if (debugsw)
631             admonish (NULLCP, "unable to read folder %s");
632         return;
633     }
634     if (mp -> hghmsg == 0) {
635         if (debugsw)
636             admonish (NULLCP, "no messages in %s", folder);
637         goto oops;
638     }
639
640     if ((cp = getenv ("mhmessages")) == NULL || *cp == 0) {
641         if (debugsw)
642             admonish (NULLCP, "$mhmessages not set");
643         goto oops;
644     }
645     if (!debugsw                        /* MOBY HACK... */
646             && pushsw
647             && (fd3 = open ("/dev/null", 2)) != NOTOK
648             && (fd2 = dup (fileno (stderr))) != NOTOK) {
649         (void) dup2 (fd3, fileno (stderr));
650         (void) close (fd3);
651     }
652     else
653         fd2 = NOTOK;
654     for (ap = brkstring (cp = getcpy (cp), " ", NULLCP); *ap; ap++)
655         (void) m_convert (mp, *ap);
656     free (cp);
657     if (fd2 != NOTOK)
658         (void) dup2 (fd2, fileno (stderr));
659     if (mp -> numsel == 0) {
660         if (debugsw)
661             admonish (NULLCP, "no messages to annotate");
662         goto oops;
663     }
664
665     (void) lseek (fd, (off_t)0, 0);
666     if ((fp = fdopen (fd, "r")) == NULL) {
667         if (debugsw)
668             admonish (NULLCP, "unable to fdopen annotation list");
669         goto oops;
670     }
671     cp = NULL;
672     while (fgets (buffer, sizeof buffer, fp) != NULL)
673         cp = add (buffer, cp);
674     (void) fclose (fp);
675
676     if (debugsw)
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) {
681             if (debugsw)
682                 advise (NULLCP, "annotate message %d", msgnum);
683             (void) annotate (m_name (msgnum), annotext, cp, inplace, 1);
684         }
685
686     free (cp);
687
688 oops: ;
689     m_fmsg (mp);
690 }
691
692 /* \f */
693
694 void done (status)
695 int     status;
696 {
697     if (armed)
698         longjmp (env, status ? status : NOTOK);
699
700     exit (status);
701 }
702 @
703
704
705 2.13
706 log
707 @fixes from mtr:
708 -partno, -queued interface
709 @
710 text
711 @d3 1
712 a3 1
713 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.12 1992/12/15 00:20:22 jromine Exp jromine $";
714 d41 2
715 a42 1
716 long    lseek (), time ();
717 d400 1
718 a400 1
719                     (void) lseek (out, 0L, 2);
720 d412 1
721 a412 1
722             (void) lseek (out, 0L, 0);
723 d568 1
724 a568 1
725     (void) lseek (fd, 0L, 0);
726 @
727
728
729 2.12
730 log
731 @endif sugar
732 @
733 text
734 @d3 1
735 a3 1
736 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.11 1992/12/03 17:42:42 jromine Exp jromine $";
737 d102 1
738 a105 1
739     status = OK;
740 a106 3
741     vec[vecp++] = "-partno";
742     vec[vecp++] = partnum;
743
744 d119 3
745 a121 1
746                 if (uleq (name, VRSN_FIELD) || uleq (name, "Message-ID")) {
747 d164 2
748 d174 10
749 d188 6
750 @
751
752
753 2.11
754 log
755 @fixes for -split 0 (from mtr)
756 @
757 text
758 @d3 2
759 a4 2
760 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.10 1992/11/24 18:10:13 jromine Exp jromine $";
761 #endif  lint
762 @
763
764
765 2.10
766 log
767 @add decl
768 @
769 text
770 @d3 1
771 a3 1
772 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.9 1992/10/26 16:48:46 jromine Exp jromine $";
773 d200 2
774 a201 1
775             (void) fputs (dp, out);
776 d253 2
777 a254 1
778     free (dp);
779 @
780
781
782 2.9
783 log
784 @fix from MTR
785 @
786 text
787 @d3 1
788 a3 1
789 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.8 1992/10/16 22:34:49 jromine Exp jromine $";
790 d15 5
791 d267 1
792 a267 1
793 int     sendaux (vec, vecp, drft, st)
794 @
795
796
797 2.8
798 log
799 @MIME changes
800 @
801 text
802 @d3 1
803 a3 1
804 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.7 1992/10/16 22:30:15 jromine Exp jromine $";
805 d335 1
806 a335 1
807                 if (fd2 != NOTOK)
808 @
809
810
811 2.7
812 log
813 @#ifdef MIME fixups
814 @
815 text
816 @d3 1
817 a3 1
818 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.6 1992/10/16 21:37:40 jromine Exp jromine $";
819 d117 1
820 a117 1
821                 if (uleq (name, VRSN_FIELD)) {
822 d123 7
823 a129 6
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,
828                                           in);
829                         dp = add (buffer, dp);
830 d131 7
831 a137 7
832                 }
833                 else {
834                     cp = add (concat (name, ": ", buffer, NULLCP), cp);
835                     while (state == FLDPLUS) {
836                         state = m_getfld (state, name, buffer, sizeof buffer,
837                                           in);
838                         cp = add (buffer, cp);
839 a138 1
840                 }
841 d191 2
842 a192 2
843         fprintf (out, "Content-Description: part %d of %d\n\n",
844                  partno, nparts);
845 d196 1
846 @
847
848
849 2.6
850 log
851 @MIME changes
852 @
853 text
854 @d3 1
855 a3 1
856 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.5 1992/01/31 22:27:17 jromine Exp jromine $";
857 d67 1
858 a69 1
859
860 d256 1
861 d260 3
862 d264 1
863 d320 1
864 a320 1
865                 if (fd2 != NOTOK)
866 @
867
868
869 2.5
870 log
871 @kerberos
872 @
873 text
874 @d3 1
875 a3 1
876 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.4 1992/01/31 16:35:02 jromine Exp jromine $";
877 d20 1
878 @
879
880
881 2.4
882 log
883 @Multimedia MH
884 @
885 text
886 @d3 1
887 a3 1
888 static char ident[] = "@@(#)$Id: sendsbr.c,v 2.3 90/04/05 14:57:18 sources Exp $";
889 d489 1
890 a489 1
891     if ((folder = getenv ("mhfolder")) == NULL || *folder == NULL) {
892 d511 1
893 a511 1
894     if ((cp = getenv ("mhmessages")) == NULL || *cp == NULL) {
895 @
896
897
898 2.3
899 log
900 @add ID
901 @
902 text
903 @d3 1
904 a3 1
905 static char ident[] = "@@(#)$Id:$";
906 d21 1
907 d23 1
908 d35 1
909 a35 1
910 long    lseek ();
911 d66 4
912 a69 1
913 int     sendaux (vec, vecp, drft, st)
914 d75 189
915 d314 1
916 a314 1
917                 if (annotext && fd2 != NOTOK)
918 d316 3
919 a318 1
920                 if (rename (drft, strcpy (buf, m_backup (drft))) == NOTOK)
921 @
922
923
924 2.2
925 log
926 @ANSI Compilance
927 @
928 text
929 @d2 3
930 @
931
932
933 2.1
934 log
935 @TYPESIG
936 @
937 text
938 @d10 2
939 @
940
941
942 2.0
943 log
944 @changes for SUN40 shared libraries and NNTP under bbc
945 @
946 text
947 @d225 1
948 a225 1
949     int     (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
950 @
951
952
953 1.1
954 log
955 @Initial revision
956 @
957 text
958 @d353 1
959 a353 1
960             (void) annotate (m_name (msgnum), annotext, cp, inplace);
961 @