|
|
1.1 ! root 1: # ! 2: ! 3: #include "rcv.h" ! 4: #include <stdio.h> ! 5: #include <sys/stat.h> ! 6: ! 7: /* ! 8: * Mail -- a mail program ! 9: * ! 10: * Perform message editing functions. ! 11: */ ! 12: ! 13: /* ! 14: * Edit a message list. ! 15: */ ! 16: ! 17: editor(msgvec) ! 18: int *msgvec; ! 19: { ! 20: char *edname; ! 21: ! 22: if ((edname = value("EDITOR")) == NOSTR) ! 23: edname = EDITOR; ! 24: return(edit1(msgvec, edname)); ! 25: } ! 26: ! 27: /* ! 28: * Invoke the visual editor on a message list. ! 29: */ ! 30: ! 31: visual(msgvec) ! 32: int *msgvec; ! 33: { ! 34: char *edname; ! 35: ! 36: if ((edname = value("VISUAL")) == NOSTR) ! 37: edname = VISUAL; ! 38: return(edit1(msgvec, edname)); ! 39: } ! 40: ! 41: /* ! 42: * Edit a message by writing the message into a funnily-named file ! 43: * (which should not exist) and forking an editor on it. ! 44: * We get the editor from the stuff above. ! 45: */ ! 46: ! 47: edit1(msgvec, ed) ! 48: int *msgvec; ! 49: char *ed; ! 50: { ! 51: register char *cp, *cp2; ! 52: register int c; ! 53: int *ip, pid, mesg, lines; ! 54: unsigned int ms; ! 55: int (*sigint)(), (*sigquit)(); ! 56: FILE *ibuf, *obuf; ! 57: char edname[15], nbuf[10]; ! 58: struct message *mp; ! 59: extern char tempEdit[]; ! 60: off_t fsize(), size; ! 61: struct stat statb; ! 62: long modtime; ! 63: ! 64: /* ! 65: * Set signals; locate editor. ! 66: */ ! 67: ! 68: sigint = signal(SIGINT, SIG_IGN); ! 69: sigquit = signal(SIGQUIT, SIG_IGN); ! 70: ! 71: /* ! 72: * Deal with each message to be edited . . . ! 73: */ ! 74: ! 75: for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) { ! 76: mesg = *ip; ! 77: mp = &message[mesg-1]; ! 78: mp->m_flag |= MODIFY; ! 79: ! 80: /* ! 81: * Make up a name for the edit file of the ! 82: * form "Message%d" and make sure it doesn't ! 83: * already exist. ! 84: */ ! 85: ! 86: cp = &nbuf[10]; ! 87: *--cp = 0; ! 88: while (mesg) { ! 89: *--cp = mesg % 10 + '0'; ! 90: mesg /= 10; ! 91: } ! 92: cp2 = copy("Message", edname); ! 93: while (*cp2++ = *cp++) ! 94: ; ! 95: if (!access(edname, 2)) { ! 96: printf("%s: file exists\n", edname); ! 97: goto out; ! 98: } ! 99: ! 100: /* ! 101: * Copy the message into the edit file. ! 102: */ ! 103: ! 104: close(creat(edname, 0600)); ! 105: if ((obuf = fopen(edname, "w")) == NULL) { ! 106: perror(edname); ! 107: goto out; ! 108: } ! 109: if (send(mp, obuf) < 0) { ! 110: perror(edname); ! 111: fclose(obuf); ! 112: remove(edname); ! 113: goto out; ! 114: } ! 115: fflush(obuf); ! 116: if (ferror(obuf)) { ! 117: remove(edname); ! 118: fclose(obuf); ! 119: goto out; ! 120: } ! 121: fclose(obuf); ! 122: ! 123: /* ! 124: * Fork/execl the editor on the edit file. ! 125: */ ! 126: ! 127: if (stat(edname, &statb) < 0) ! 128: modtime = 0; ! 129: modtime = statb.st_mtime; ! 130: pid = vfork(); ! 131: if (pid == -1) { ! 132: perror("fork"); ! 133: remove(edname); ! 134: goto out; ! 135: } ! 136: if (pid == 0) { ! 137: if (sigint != SIG_IGN) ! 138: signal(SIGINT, SIG_DFL); ! 139: if (sigquit != SIG_IGN) ! 140: signal(SIGQUIT, SIG_DFL); ! 141: execl(ed, ed, edname, 0); ! 142: perror(ed); ! 143: _exit(1); ! 144: } ! 145: while (wait(&mesg) != pid) ! 146: ; ! 147: ! 148: /* ! 149: * Now copy the message to the end of the ! 150: * temp file. ! 151: */ ! 152: ! 153: if (stat(edname, &statb) < 0) { ! 154: perror(edname); ! 155: goto out; ! 156: } ! 157: if (modtime == statb.st_mtime) { ! 158: remove(edname); ! 159: goto out; ! 160: } ! 161: if ((ibuf = fopen(edname, "r")) == NULL) { ! 162: perror(edname); ! 163: remove(edname); ! 164: goto out; ! 165: } ! 166: remove(edname); ! 167: fseek(otf, (long) 0, 2); ! 168: size = fsize(otf); ! 169: mp->m_block = blockof(size); ! 170: mp->m_offset = offsetof(size); ! 171: ms = 0; ! 172: lines = 0; ! 173: while ((c = getc(ibuf)) != EOF) { ! 174: if (c == '\n') ! 175: lines++; ! 176: putc(c, otf); ! 177: if (ferror(otf)) ! 178: break; ! 179: ms++; ! 180: } ! 181: mp->m_size = ms; ! 182: mp->m_lines = lines; ! 183: if (ferror(otf)) ! 184: perror("/tmp"); ! 185: fclose(ibuf); ! 186: } ! 187: ! 188: /* ! 189: * Restore signals and return. ! 190: */ ! 191: ! 192: out: ! 193: signal(SIGINT, sigint); ! 194: signal(SIGQUIT, sigquit); ! 195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.