|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)inews.c 1.4 (Berkeley) 3/20/86"; ! 3: #endif ! 4: ! 5: /* ! 6: * Itty-bitty inews for talking to remote server. ! 7: * Simply accept input on stdin (or via a named file) and dump this ! 8: * to the server; add a From: and Path: line if missing in the original. ! 9: * ! 10: * Steven Grady ([email protected]) ! 11: */ ! 12: ! 13: #include <stdio.h> ! 14: #include <pwd.h> ! 15: #include <ctype.h> ! 16: #include <strings.h> ! 17: #include "../common/conf.h" ! 18: #include "../common/response_codes.h" ! 19: ! 20: extern FILE *ser_wr_fp; ! 21: ! 22: main(argc, argv) ! 23: int argc; ! 24: char *argv[]; ! 25: { ! 26: char line[256], s[256]; ! 27: int seen_fromline, in_header; ! 28: ! 29: ++argv; ! 30: while (argc > 1) ! 31: if (*argv[0] == '-') { ! 32: ++argv; ! 33: --argc; ! 34: } else ! 35: break; ! 36: ! 37: if (argc > 1) { ! 38: if (freopen(*argv, "r", stdin) == NULL) { ! 39: perror(*argv); ! 40: exit(1); ! 41: } ! 42: } ! 43: ! 44: if (server_init(SERVER_HOST) < 0) ! 45: exit(1); /* Connect to the server */ ! 46: ! 47: put_server("POST"); ! 48: (void) get_server(line, sizeof(line)); ! 49: if (*line != CHAR_CONT) { ! 50: if (atoi(line) == ERR_NOPOST) { ! 51: fprintf(stderr, ! 52: "Sorry, you can't post from this machine.\n"); ! 53: exit(1); ! 54: } else { ! 55: fprintf(stderr, "Remote error: %s\n", line); ! 56: exit(1); ! 57: } ! 58: } ! 59: ! 60: in_header = 1; ! 61: while (gets(s) != NULL) { ! 62: if (s[0] == '.') /* Single . is eof, so put in extra one */ ! 63: (void) fputc('.', ser_wr_fp); ! 64: if (in_header && strneql(s, "From:", sizeof("From:")-1)) ! 65: seen_fromline = 1; ! 66: if (in_header && s[0] == '\0') { ! 67: in_header = 0; ! 68: if (!seen_fromline) ! 69: gen_frompath(); ! 70: } ! 71: fprintf(ser_wr_fp, "%s\r\n", s); ! 72: } ! 73: ! 74: append_signature(); ! 75: ! 76: fprintf(ser_wr_fp, ".\r\n"); ! 77: (void) fflush(ser_wr_fp); ! 78: (void) get_server(line, sizeof(line)); ! 79: if (*line != CHAR_OK) { ! 80: if (atoi(line) == ERR_POSTFAIL) { ! 81: fprintf(stderr, ! 82: "Article not accepted by server; not posted.\n"); ! 83: exit(1); ! 84: } else { ! 85: fprintf(stderr, "Remote error: %s\n", line); ! 86: exit(1); ! 87: } ! 88: } ! 89: ! 90: /* ! 91: * Close server sends the server a ! 92: * "quit" command for us, which is why we don't send it. ! 93: */ ! 94: ! 95: close_server(); ! 96: } ! 97: ! 98: /* ! 99: * append_signature -- append the person's .signature file if ! 100: * they have one. ! 101: */ ! 102: ! 103: append_signature() ! 104: { ! 105: char line[256], sigfile[256]; ! 106: char *cp; ! 107: struct passwd *passwd; ! 108: FILE *fp; ! 109: char *index(); ! 110: ! 111: passwd = getpwuid(getuid()); ! 112: if (passwd == NULL) ! 113: return; ! 114: ! 115: (void) strcpy(sigfile, passwd->pw_dir); ! 116: (void) strcat(sigfile, "/"); ! 117: (void) strcat(sigfile, ".signature"); ! 118: ! 119: fp = fopen(sigfile, "r"); ! 120: if (fp != NULL) ! 121: while (fgets(line, sizeof(line), fp)) { ! 122: if (cp = index(line, '\n')) ! 123: *cp = '\0'; ! 124: fprintf(ser_wr_fp, "%s\r\n", line); ! 125: } ! 126: } ! 127: ! 128: /* ! 129: * gen_frompath -- generate From: and Path: lines, in the form ! 130: * ! 131: * From: [email protected] (full_name) ! 132: * Path: host!user ! 133: * ! 134: * This routine should only be called if the message doesn't have ! 135: * a From: line in it. ! 136: */ ! 137: ! 138: gen_frompath() ! 139: { ! 140: char host_name[256]; ! 141: char *full_name; ! 142: char *cp; ! 143: struct passwd *passwd; ! 144: char *index(), *getenv(); ! 145: ! 146: passwd = getpwuid(getuid()); ! 147: ! 148: full_name = getenv("NAME"); ! 149: if (full_name == NULL) { ! 150: full_name = passwd->pw_gecos; ! 151: if ((cp = index(full_name, ','))) ! 152: *cp = '\0'; ! 153: } ! 154: ! 155: (void) gethostname(host_name, sizeof (host_name)); ! 156: ! 157: #ifdef DOMAIN ! 158: fprintf(ser_wr_fp, "From: %s@%s.%s (", ! 159: passwd->pw_name, ! 160: host_name, ! 161: DOMAIN); ! 162: #else ! 163: fprintf(ser_wr_fp, "From: %s@%s (", ! 164: passwd->pw_name, ! 165: host_name); ! 166: #endif ! 167: ! 168: for (cp = full_name; *cp != '\0'; ++cp) ! 169: if (*cp != '&') ! 170: putc(*cp, ser_wr_fp); ! 171: else { /* Stupid & hack. God damn it. */ ! 172: putc(toupper(passwd->pw_name[0]), ser_wr_fp); ! 173: fprintf(ser_wr_fp, passwd->pw_name+1); ! 174: } ! 175: ! 176: fprintf(ser_wr_fp, ")\r\n"); ! 177: ! 178: fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name, passwd->pw_name); ! 179: } ! 180: ! 181: ! 182: /* ! 183: * strneql -- determine if two strings are equal in the first n ! 184: * characters, ignoring case. ! 185: * ! 186: * Parameters: "a" and "b" are the pointers ! 187: * to characters to be compared. ! 188: * "n" is the number of characters to compare. ! 189: * ! 190: * Returns: 1 if the strings are equal, 0 otherwise. ! 191: * ! 192: * Side effects: None. ! 193: */ ! 194: ! 195: strneql(a, b, n) ! 196: register char *a, *b; ! 197: int n; ! 198: { ! 199: char lower(); ! 200: ! 201: while (n && lower(*a) == lower(*b)) { ! 202: if (*a == '\0') ! 203: return (1); ! 204: a++; ! 205: b++; ! 206: n--; ! 207: } ! 208: if (n) ! 209: return (0); ! 210: else ! 211: return (1); ! 212: } ! 213: ! 214: /* ! 215: * lower -- convert a character to lower case, if it's ! 216: * upper case. ! 217: * ! 218: * Parameters: "c" is the character to be ! 219: * converted. ! 220: * ! 221: * Returns: "c" if the character is not ! 222: * upper case, otherwise the lower ! 223: * case eqivalent of "c". ! 224: * ! 225: * Side effects: None. ! 226: */ ! 227: ! 228: char lower(c) ! 229: register char c; ! 230: { ! 231: if (isascii(c) && isupper(c)) ! 232: c = c - 'A' + 'a'; ! 233: return(c); ! 234: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.