Updated docs/README-ATTACHMENTS, mainly to reflect that no setup is
[mmh] / 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 }