|
|
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: static void ready_msg(); ! 15: ! 16: /* */ ! 17: ! 18: #define BADHDR "please re-edit %s to remove the ``%s'' header!" ! 19: #define BADTXT "please re-edit %s to consist of headers only!" ! 20: #define BADMSG "please re-edit %s to include a ``Resent-To:''!" ! 21: #define BADRFT "please re-edit %s and fix that header!" ! 22: ! 23: distout(drft, msgnam, backup) ! 24: register char *drft, *msgnam, *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 void ! 131: ready_msg(msgnam) ! 132: register char *msgnam; ! 133: { ! 134: int state, ! 135: out; ! 136: char name[NAMESZ], ! 137: buffer[BUFSIZ], ! 138: tmpfil[BUFSIZ]; ! 139: register FILE *ifp, ! 140: *ofp; ! 141: ! 142: if (hdrfd != NOTOK) ! 143: (void) close (hdrfd), hdrfd = NOTOK; ! 144: if (txtfd != NOTOK) ! 145: (void) close (txtfd), txtfd = NOTOK; ! 146: ! 147: if ((ifp = fopen (msgnam, "r")) == NULL) ! 148: adios (msgnam, "unable to open message"); ! 149: ! 150: (void) strcpy (tmpfil, m_tmpfil ("dist")); ! 151: if ((hdrfd = creat (tmpfil, 0600)) == NOTOK) ! 152: adios (tmpfil, "unable to create temporary file"); ! 153: (void) close (hdrfd); ! 154: if ((hdrfd = open (tmpfil, 2)) == NOTOK) ! 155: adios (tmpfil, "unable to re-open temporary file"); ! 156: if ((out = dup (hdrfd)) == NOTOK ! 157: || (ofp = fdopen (out, "w")) == NULL) ! 158: adios (NULLCP, "no file descriptors -- you lose big"); ! 159: (void) unlink (tmpfil); ! 160: ! 161: /* */ ! 162: ! 163: for (state = FLD;;) ! 164: switch (state = ! 165: m_getfld (state, name, buffer, sizeof buffer, ifp)) { ! 166: case FLD: ! 167: case FLDPLUS: ! 168: case FLDEOF: ! 169: if (uprf (name, "resent")) ! 170: fprintf (ofp, "Prev-"); ! 171: fprintf (ofp, "%s: %s", name, buffer); ! 172: while (state == FLDPLUS) { ! 173: state = m_getfld (state, name, ! 174: buffer, sizeof buffer, ifp); ! 175: fputs (buffer, ofp); ! 176: } ! 177: if (state == FLDEOF) ! 178: goto process; ! 179: break; ! 180: ! 181: case BODY: ! 182: case BODYEOF: ! 183: (void) fclose (ofp); ! 184: ! 185: (void) strcpy (tmpfil, m_tmpfil ("dist")); ! 186: if ((txtfd = creat (tmpfil, 0600)) == NOTOK) ! 187: adios (tmpfil, "unable to create temporary file"); ! 188: (void) close (txtfd); ! 189: if ((txtfd = open (tmpfil, 2)) == NOTOK) ! 190: adios (tmpfil, "unable to re-open temporary file"); ! 191: if ((out = dup (txtfd)) == NOTOK ! 192: || (ofp = fdopen (out, "w")) == NULL) ! 193: adios (NULLCP, "no file descriptors -- you lose big"); ! 194: (void) unlink (tmpfil); ! 195: fprintf (ofp, "\n%s", buffer); ! 196: while (state == BODY) { ! 197: state = m_getfld (state, name, ! 198: buffer, sizeof buffer, ifp); ! 199: fputs (buffer, ofp); ! 200: } ! 201: case FILEEOF: ! 202: goto process; ! 203: ! 204: case LENERR: ! 205: case FMTERR: ! 206: adios (NULLCP, "format error in message %s", msgnam); ! 207: ! 208: default: ! 209: adios (NULLCP, "getfld() returned %d", state); ! 210: } ! 211: process: ; ! 212: (void) fclose (ifp); ! 213: (void) fclose (ofp); ! 214: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.