diff sbr/m_sync.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children 441a2190cfae
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbr/m_sync.c	Mon Apr 18 23:46:02 2005 +0900
@@ -0,0 +1,102 @@
+/* m_sync.c - synchronize message sequences */
+#ifndef	lint
+static char ident[] = "@(#)$Id$";
+#endif	/* lint */
+
+#include "../h/mh.h"
+#include <stdio.h>
+#include <signal.h>
+#ifndef	sigmask
+#define	sigmask(s)	(1 << ((s) - 1))
+#endif	/* not sigmask */
+
+
+/* decision logic
+    1.  public and folder readonly: make it private
+    2a. public: add it to the sequences file
+    2b. private: add it to the profile
+ */
+
+
+void m_sync (mp)
+register struct msgs *mp;
+{
+    int     bits;
+    register int    i;
+    register char  *cp;
+    char    flags,
+	    attr[BUFSIZ],
+	    seq[BUFSIZ * 2];
+    register FILE  *fp;
+#ifndef	BSD42
+    TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
+#else	/* BSD42 */
+    int	    smask;
+#endif	/* BSD42 */
+
+    if (!(mp -> msgflags & SEQMOD))
+	return;
+    mp -> msgflags &= ~SEQMOD;
+
+    m_getdefs ();
+/*     (void) sprintf (seq, "%s/%s", mp -> foldpath, mh_seq); */
+     (void) sprintf (seq, "%s/%s", mp -> foldpath, mh_seq? mh_seq: "");
+    bits = FFATTRSLOT;
+    fp = NULL;
+
+    flags = mp -> msgflags;
+    if (mh_seq == NULL || *mh_seq == 0)
+	mp -> msgflags |= READONLY;
+
+    for (i = 0; mp -> msgattrs[i]; i++) {
+	(void) sprintf (attr, "atr-%s-%s", mp -> msgattrs[i], mp -> foldpath);
+	if (mp -> msgflags & READONLY
+		|| mp -> attrstats & (1 << (bits + i))) {
+    priv: ;
+	    if (cp = m_seq (mp, mp -> msgattrs[i]))
+		m_replace (attr, cp);
+	    else
+		(void) m_delete (attr);
+	}
+	else {
+	    (void) m_delete (attr);
+	    if ((cp = m_seq (mp, mp -> msgattrs[i])) == NULL)
+		continue;
+	    if (fp == NULL) {
+		if ((fp = fopen (seq, "w")) == NULL
+			&& (unlink (seq) == NOTOK ||
+			    (fp = fopen (seq, "w")) == NULL)) {
+		    admonish (attr, "unable to write");
+		    goto priv;
+		}
+#ifndef	BSD42
+		hstat = signal (SIGHUP, SIG_IGN);
+		istat = signal (SIGINT, SIG_IGN);
+		qstat = signal (SIGQUIT, SIG_IGN);
+		tstat = signal (SIGTERM, SIG_IGN);
+#else	/* BSD42 */
+		smask = sigblock (sigmask (SIGHUP) | sigmask (SIGINT)
+				    | sigmask (SIGQUIT) | sigmask (SIGTERM));
+#endif	/* BSD42 */
+	    }
+	    fprintf (fp, "%s: %s\n", mp -> msgattrs[i], cp);
+	}
+    }
+
+    if (fp) {
+	(void) fclose (fp);
+#ifndef	BSD42
+	(void) signal (SIGHUP, hstat);
+	(void) signal (SIGINT, istat);
+	(void) signal (SIGQUIT, qstat);
+	(void) signal (SIGTERM, tstat);
+#else	/* BSD42 */
+	(void) sigsetmask (smask);
+#endif	/* BSD42 */
+    }
+    else
+	if (!(mp -> msgflags & READONLY))
+	    (void) unlink (seq);
+
+    mp -> msgflags = flags;
+}