|
|
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.