|
|
1.1 ! root 1: /* distsbr.c - routines to do additional "dist-style" processing */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <ctype.h> ! 5: #include <stdio.h> ! 6: ! 7: ! 8: static int hdrfd = NOTOK; ! 9: static int txtfd = NOTOK; ! 10: ! 11: ! 12: long lseek (); ! 13: ! 14: /* */ ! 15: ! 16: #define BADHDR "please re-edit %s to remove the ``%s'' header!" ! 17: #define BADTXT "please re-edit %s to consist of headers only!" ! 18: #define BADMSG "please re-edit %s to include a ``Resent-To:''!" ! 19: #define BADRFT "please re-edit %s and fix that header!" ! 20: ! 21: int distout (drft, msgnam, backup) ! 22: register char *drft, ! 23: *msgnam, ! 24: *backup; ! 25: { ! 26: int state; ! 27: register char *dp, ! 28: *resent; ! 29: char name[NAMESZ], ! 30: buffer[BUFSIZ]; ! 31: register FILE *ifp, ! 32: *ofp; ! 33: ! 34: if (rename (drft, strcpy (backup, m_backup (drft))) == NOTOK) ! 35: adios (backup, "unable to rename %s to",drft); ! 36: if ((ifp = fopen (backup, "r")) == NULL) ! 37: adios (backup, "unable to read"); ! 38: ! 39: if ((ofp = fopen (drft, "w")) == NULL) ! 40: adios (drft, "unable to create temporary file"); ! 41: (void) chmod (drft, m_gmprot ()); ! 42: ! 43: ready_msg (msgnam); ! 44: (void) lseek (hdrfd, 0L, 0); /* msgnam not accurate */ ! 45: cpydata (hdrfd, fileno (ofp), msgnam, drft); ! 46: ! 47: /* */ ! 48: ! 49: for (state = FLD, resent = NULL;;) ! 50: switch (state = ! 51: m_getfld (state, name, buffer, sizeof buffer, ifp)) { ! 52: case FLD: ! 53: case FLDPLUS: ! 54: case FLDEOF: ! 55: if (uprf (name, "distribute-")) ! 56: (void) sprintf (name, "%s%s", "Resent", &name[10]); ! 57: if (uprf (name, "distribution-")) ! 58: (void) sprintf (name, "%s%s", "Resent", &name[12]); ! 59: if (!uprf (name, "resent")) { ! 60: advise (NULLCP, BADHDR, "draft", name); ! 61: goto leave_bad; ! 62: } ! 63: if (state == FLD) ! 64: resent = add (":", add (name, resent)); ! 65: resent = add (buffer, resent); ! 66: fprintf (ofp, "%s: %s", name, buffer); ! 67: while (state == FLDPLUS) { ! 68: state = m_getfld (state, name, ! 69: buffer, sizeof buffer, ifp); ! 70: resent = add (buffer, resent); ! 71: fputs (buffer, ofp); ! 72: } ! 73: if (state == FLDEOF) ! 74: goto process; ! 75: break; ! 76: ! 77: case BODY: ! 78: case BODYEOF: ! 79: for (dp = buffer; *dp; dp++) ! 80: if (!isspace (*dp)) { ! 81: advise (NULLCP, BADTXT, "draft"); ! 82: goto leave_bad; ! 83: } ! 84: ! 85: case FILEEOF: ! 86: goto process; ! 87: ! 88: case LENERR: ! 89: case FMTERR: ! 90: advise (NULLCP, BADRFT, "draft"); ! 91: leave_bad: ; ! 92: (void) fclose (ifp); ! 93: (void) fclose (ofp); ! 94: (void) unlink (drft); ! 95: if (rename (backup, drft) == NOTOK) ! 96: adios (drft, "unable to rename %s to", backup); ! 97: return NOTOK; ! 98: ! 99: default: ! 100: adios (NULLCP, "getfld() returned %d", state); ! 101: } ! 102: process: ; ! 103: (void) fclose (ifp); ! 104: (void) fflush (ofp); ! 105: ! 106: /* */ ! 107: ! 108: if (!resent) { ! 109: advise (NULLCP, BADMSG, "draft"); ! 110: (void) fclose (ofp); ! 111: (void) unlink (drft); ! 112: if (rename (backup, drft) == NOTOK) ! 113: adios (drft, "unable to rename %s to", backup); ! 114: return NOTOK; ! 115: } ! 116: free (resent); ! 117: ! 118: if (txtfd != NOTOK) { ! 119: (void) lseek (txtfd, 0L, 0); /* msgnam not accurate */ ! 120: cpydata (txtfd, fileno (ofp), msgnam, drft); ! 121: } ! 122: ! 123: (void) fclose (ofp); ! 124: ! 125: return OK; ! 126: } ! 127: ! 128: /* */ ! 129: ! 130: static ready_msg (msgnam) ! 131: register char *msgnam; ! 132: { ! 133: int state, ! 134: out; ! 135: char name[NAMESZ], ! 136: buffer[BUFSIZ], ! 137: tmpfil[BUFSIZ]; ! 138: register FILE *ifp, ! 139: *ofp; ! 140: ! 141: if (hdrfd != NOTOK) ! 142: (void) close (hdrfd), hdrfd = NOTOK; ! 143: if (txtfd != NOTOK) ! 144: (void) close (txtfd), txtfd = NOTOK; ! 145: ! 146: if ((ifp = fopen (msgnam, "r")) == NULL) ! 147: adios (msgnam, "unable to open message"); ! 148: ! 149: (void) strcpy (tmpfil, m_tmpfil ("dist")); ! 150: if ((hdrfd = creat (tmpfil, 0600)) == NOTOK) ! 151: adios (tmpfil, "unable to create temporary file"); ! 152: (void) close (hdrfd); ! 153: if ((hdrfd = open (tmpfil, 2)) == NOTOK) ! 154: adios (tmpfil, "unable to re-open temporary file"); ! 155: if ((out = dup (hdrfd)) == NOTOK ! 156: || (ofp = fdopen (out, "w")) == NULL) ! 157: adios (NULLCP, "no file descriptors -- you lose big"); ! 158: (void) unlink (tmpfil); ! 159: ! 160: /* */ ! 161: ! 162: for (state = FLD;;) ! 163: switch (state = ! 164: m_getfld (state, name, buffer, sizeof buffer, ifp)) { ! 165: case FLD: ! 166: case FLDPLUS: ! 167: case FLDEOF: ! 168: if (uprf (name, "resent")) ! 169: fprintf (ofp, "Prev-"); ! 170: fprintf (ofp, "%s: %s", name, buffer); ! 171: while (state == FLDPLUS) { ! 172: state = m_getfld (state, name, ! 173: buffer, sizeof buffer, ifp); ! 174: fputs (buffer, ofp); ! 175: } ! 176: if (state == FLDEOF) ! 177: goto process; ! 178: break; ! 179: ! 180: case BODY: ! 181: case BODYEOF: ! 182: (void) fclose (ofp); ! 183: ! 184: (void) strcpy (tmpfil, m_tmpfil ("dist")); ! 185: if ((txtfd = creat (tmpfil, 0600)) == NOTOK) ! 186: adios (tmpfil, "unable to create temporary file"); ! 187: (void) close (txtfd); ! 188: if ((txtfd = open (tmpfil, 2)) == NOTOK) ! 189: adios (tmpfil, "unable to re-open temporary file"); ! 190: if ((out = dup (txtfd)) == NOTOK ! 191: || (ofp = fdopen (out, "w")) == NULL) ! 192: adios (NULLCP, "no file descriptors -- you lose big"); ! 193: (void) unlink (tmpfil); ! 194: fprintf (ofp, "\n%s", buffer); ! 195: while (state == BODY) { ! 196: state = m_getfld (state, name, ! 197: buffer, sizeof buffer, ifp); ! 198: fputs (buffer, ofp); ! 199: } ! 200: case FILEEOF: ! 201: goto process; ! 202: ! 203: case LENERR: ! 204: case FMTERR: ! 205: adios (NULLCP, "format error in message %s", msgnam); ! 206: ! 207: default: ! 208: adios (NULLCP, "getfld() returned %d", state); ! 209: } ! 210: process: ; ! 211: (void) fclose (ifp); ! 212: (void) fclose (ofp); ! 213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.