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