annotate sbr/m_sync.c @ 0:bce86c4163a3

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