|
|
1.1 root 1: /* m_sync.c - synchronize message sequences */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #include <signal.h>
6:
7:
8: /* decision logic
9: 1. public and folder readonly: make it private
10: 2a. public: add it to the sequences file
11: 2b. private: add it to the profile
12: */
13:
14:
15: void m_sync (mp)
16: register struct msgs *mp;
17: {
18: int bits;
19: register int i;
20: register char *cp;
21: char flags,
22: attr[BUFSIZ],
23: seq[BUFSIZ];
24: register FILE *fp;
25: #ifdef BSD42
26: int oldsig;
27: #else not BSD42
28: int (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
29: #endif BSD42
30:
31: if (!(mp -> msgflags & SEQMOD))
32: return;
33: mp -> msgflags &= ~SEQMOD;
34:
35: m_getdefs ();
36: (void) sprintf (seq, "%s/%s", mp -> foldpath, mh_seq);
37: bits = FFATTRSLOT;
38: fp = NULL;
39:
40: flags = mp -> msgflags;
41: if (mh_seq == NULL || *mh_seq == NULL)
42: mp -> msgflags |= READONLY;
43:
44: for (i = 0; mp -> msgattrs[i]; i++) {
45: (void) sprintf (attr, "atr-%s-%s", mp -> msgattrs[i], mp -> foldpath);
46: if (mp -> msgflags & READONLY
47: || mp -> attrstats & (1 << (bits + i))) {
48: private: ;
49: if (cp = m_seq (mp, mp -> msgattrs[i]))
50: m_replace (attr, cp);
51: else
52: (void) m_delete (attr);
53: }
54: else {
55: (void) m_delete (attr);
56: if ((cp = m_seq (mp, mp -> msgattrs[i])) == NULL)
57: continue;
58: if (fp == NULL) {
59: if ((fp = fopen (seq, "w")) == NULL
60: && unlink (seq) != NOTOK
61: && (fp = fopen (seq, "w")) == NULL) {
62: admonish (attr, "unable to write");
63: goto private;
64: }
65: #ifdef BSD42
66: oldsig = sigblock (sigmask(SIGHUP) | sigmask(SIGINT) |
67: sigmask(SIGQUIT) | sigmask(SIGTERM));
68: #else not BSD42
69: hstat = signal (SIGHUP, SIG_IGN);
70: istat = signal (SIGINT, SIG_IGN);
71: qstat = signal (SIGQUIT, SIG_IGN);
72: tstat = signal (SIGTERM, SIG_IGN);
73: #endif BSD42
74: }
75: fprintf (fp, "%s: %s\n", mp -> msgattrs[i], cp);
76: }
77: }
78:
79: if (fp) {
80: (void) fclose (fp);
81: #ifdef BSD42
82: (void) sigsetmask (oldsig);
83: #else not BSD42
84: (void) signal (SIGHUP, hstat);
85: (void) signal (SIGINT, istat);
86: (void) signal (SIGQUIT, qstat);
87: (void) signal (SIGTERM, tstat);
88: #endif BSD42
89: }
90: else
91: if (!(mp -> msgflags & READONLY))
92: (void) unlink (seq);
93:
94: mp -> msgflags = flags;
95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.