]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/sbr/m_sync.c
Always check that mktemp()/mktemp2() succeeds before trying to
[nmh] / docs / historical / mh-6.8.5 / sbr / m_sync.c
1 /* m_sync.c - synchronize message sequences */
2 #ifndef lint
3 static char ident[] = "@(#)$Id: m_sync.c,v 1.8 1992/12/15 00:20:22 jromine Exp $";
4 #endif /* lint */
5
6 #include "../h/mh.h"
7 #include <stdio.h>
8 #include <signal.h>
9 #ifndef sigmask
10 #define sigmask(s) (1 << ((s) - 1))
11 #endif /* not sigmask */
12
13
14 /* decision logic
15 1. public and folder readonly: make it private
16 2a. public: add it to the sequences file
17 2b. private: add it to the profile
18 */
19
20
21 void m_sync (mp)
22 register struct msgs *mp;
23 {
24 int bits;
25 register int i;
26 register char *cp;
27 char flags,
28 attr[BUFSIZ],
29 seq[BUFSIZ * 2];
30 register FILE *fp;
31 #ifndef BSD42
32 TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
33 #else /* BSD42 */
34 int smask;
35 #endif /* BSD42 */
36
37 if (!(mp -> msgflags & SEQMOD))
38 return;
39 mp -> msgflags &= ~SEQMOD;
40
41 m_getdefs ();
42 (void) sprintf (seq, "%s/%s", mp -> foldpath, mh_seq);
43 bits = FFATTRSLOT;
44 fp = NULL;
45
46 flags = mp -> msgflags;
47 if (mh_seq == NULL || *mh_seq == 0)
48 mp -> msgflags |= READONLY;
49
50 for (i = 0; mp -> msgattrs[i]; i++) {
51 (void) sprintf (attr, "atr-%s-%s", mp -> msgattrs[i], mp -> foldpath);
52 if (mp -> msgflags & READONLY
53 || mp -> attrstats & (1 << (bits + i))) {
54 priv: ;
55 if (cp = m_seq (mp, mp -> msgattrs[i]))
56 m_replace (attr, cp);
57 else
58 (void) m_delete (attr);
59 }
60 else {
61 (void) m_delete (attr);
62 if ((cp = m_seq (mp, mp -> msgattrs[i])) == NULL)
63 continue;
64 if (fp == NULL) {
65 if ((fp = fopen (seq, "w")) == NULL
66 && (unlink (seq) == NOTOK ||
67 (fp = fopen (seq, "w")) == NULL)) {
68 admonish (attr, "unable to write");
69 goto priv;
70 }
71 #ifndef BSD42
72 hstat = signal (SIGHUP, SIG_IGN);
73 istat = signal (SIGINT, SIG_IGN);
74 qstat = signal (SIGQUIT, SIG_IGN);
75 tstat = signal (SIGTERM, SIG_IGN);
76 #else /* BSD42 */
77 smask = sigblock (sigmask (SIGHUP) | sigmask (SIGINT)
78 | sigmask (SIGQUIT) | sigmask (SIGTERM));
79 #endif /* BSD42 */
80 }
81 fprintf (fp, "%s: %s\n", mp -> msgattrs[i], cp);
82 }
83 }
84
85 if (fp) {
86 (void) fclose (fp);
87 #ifndef BSD42
88 (void) signal (SIGHUP, hstat);
89 (void) signal (SIGINT, istat);
90 (void) signal (SIGQUIT, qstat);
91 (void) signal (SIGTERM, tstat);
92 #else /* BSD42 */
93 (void) sigsetmask (smask);
94 #endif /* BSD42 */
95 }
96 else
97 if (!(mp -> msgflags & READONLY))
98 (void) unlink (seq);
99
100 mp -> msgflags = flags;
101 }