|
|
1.1 root 1: /*
2: * sendnews - send news article by mail.
3: */
4:
5: static char *SccsId = "@(#)sendnews.c 2.6 5/4/83";
6:
7: #include <stdio.h>
8: #include <ctype.h>
9: #ifndef USG
10: struct utsname {
11: char Sysname[9];
12: char nodename[33];
13: char release[9];
14: char version[9];
15: };
16: #else
17: #include <sys/utsname.h>
18: #endif
19:
20: #define eq(a,b) (strcmp(a,b) == 0)
21: #define LNLEN 7 /* strlen("ucbvax!") */
22:
23: char *index();
24: char buffer[BUFSIZ];
25: int linecount, oflag = 0, aflag = 0, bflag = 0, toflag = 0;
26:
27: FILE *popen();
28: main(argc, argv)
29: char **argv;
30: {
31: FILE *out;
32: char sender[BUFSIZ],newsgroup[100];
33: char *punct;
34: char sysn[20];
35: int sysnl;
36: char *bnkludge;
37: struct utsname ubuf;
38:
39: while (**(++argv) == '-') {
40: if (*++*argv == 'o')
41: oflag++;
42: else if (**argv == 'a')
43: aflag++;
44: else if (**argv == 'b')
45: bflag++;
46: else if (**argv == 'n')
47: strcpy(newsgroup, *(++argv));
48: }
49: if (aflag && bflag) {
50: fprintf(stderr, "'-a' and '-b' options mutually exclusive.\n");
51: exit(1);
52: }
53:
54: #ifdef debug
55: printf("mail %s\n", *argv);
56: sprintf(buffer, "cat");
57: #else
58: sprintf(buffer, "mail %s", *argv);
59: #endif
60: out = popen(buffer, "w");
61: uname(&ubuf);
62: strcpy(sysn, ubuf.nodename);
63: strcat(sysn, "!");
64: sysnl = strlen(sysn);
65: bnkludge = "";
66: #ifdef BERKELEY
67: /*
68: * ucbvax isn't really on the arpanet, but is berknetted to
69: * it through ingres. Hence the following kludge.
70: */
71: bnkludge = "ARPAVAX.";
72: #define HOSTNAME "Berkeley"
73: #endif
74: #ifndef HOSTNAME
75: #define HOSTNAME "OuterSpace"
76: #endif
77:
78: /* Standard mail prelude to make the formatters happy */
79: fprintf(out, "To: %s\n", *argv);
80: fprintf(out, "Subject: network news article\n");
81: fprintf(out, "\n");
82:
83: while (fgets(buffer, sizeof buffer, stdin)) {
84: #ifdef notdef
85: if (fromline()) {
86: if (aflag) {
87: if (!strncmp(buffer, "From ", 5)) {
88: punct = &buffer[4];
89: while (isspace(*punct++))
90: ;
91: punct--;
92: }
93: else if (!strncmp(buffer, "From: ",6)) {
94: punct = &buffer[6];
95: while (isspace(*punct++))
96: ;
97: punct--;
98: }
99: else
100: punct = buffer;
101: if (strncmp(punct, sysn, sysnl))
102: printf("Bad from line: '%s'\n", buffer);
103: strcpy(sender, punct+sysnl);
104: sender[strlen(sender)-1] = 0;
105: sprintf(punct, "%s%s@%s\n",
106: bnkludge, sender, HOSTNAME);
107: } else if (bflag) {
108: punct = index(buffer, '!');
109: if (punct == NULL)
110: printf("Bad from line: '%s'\n", buffer);
111: else {
112: *punct = ':'; /* berknet mail delimeter */
113: if (!strncmp("From: ", buffer, 6))
114: punct = &buffer[6];
115: else if (!strncmp("From ",buffer,5))
116: punct = &buffer[5];
117: else
118: punct = buffer;
119: fiddle(punct);
120: }
121: }
122: }
123: #endif
124: if (*newsgroup && ngline()) {
125: if (oflag)
126: sprintf(buffer, "%s\n", newsgroup);
127: else
128: sprintf(buffer, "Newsgroups: %s\n", newsgroup);
129: }
130: putc('N', out);
131: fputs(buffer, out);
132: }
133: pclose(out);
134: exit(0);
135: }
136:
137: fromline() {
138: if (oflag)
139: return ++linecount == 3;
140: if (!linecount && (!strncmp("From: ", buffer, 6) || !strncmp("From ", buffer, 5)))
141: return ++linecount;
142: return 0;
143: }
144:
145: ngline() {
146: if (oflag)
147: return linecount == 2;
148: if (!toflag && (!strncmp("Newsgroups: ", buffer, 12) || !strncmp("To: ",buffer, 4)))
149: return ++toflag;
150: return 0;
151: }
152:
153: /*
154: * make sure the host name is a correct berknet address, since the
155: * internal names are not the berknet host names.
156: */
157: fiddle(buf)
158: char *buf;
159: {
160: char berkname[10];
161: char uucpname[100];
162: char *rest;
163:
164: strcpy(uucpname, buf);
165: rest = index(uucpname, ':');
166: *rest++ = 0;
167: #ifdef debug
168: printf("uucpname='%s', buf='%s', rest='%s',...", uucpname, buf, rest);
169: #endif
170: if (eq(uucpname, "ucbvax"))
171: strcpy(berkname, "CSVAX");
172: else if (eq(uucpname, "ucbcory"))
173: strcpy(berkname, "Cory");
174: else if (eq(uucpname, "ucbopt"))
175: strcpy(berkname, "ESVAX");
176: /*
177: * The uucp names from here down are guesswork.
178: * They may have to be changed later. But we can't
179: * allow names like a, b, etc to get outside the berknet.
180: */
181: else if (eq(uucpname, "ucbing70"))
182: strcpy(berkname, "Ing70");
183: else if (eq(uucpname, "ucbingvax"))
184: strcpy(berkname, "IngVAX");
185: else if (eq(uucpname, "ucbcfo_a"))
186: strcpy(berkname, "A");
187: else if (eq(uucpname, "ucbcfo_b"))
188: strcpy(berkname, "B");
189: else if (eq(uucpname, "ucbcfo_c"))
190: strcpy(berkname, "C");
191: else if (eq(uucpname, "ucbcfo_d"))
192: strcpy(berkname, "D");
193: else if (eq(uucpname, "ucbcfo_e"))
194: strcpy(berkname, "E");
195: else if (eq(uucpname, "ucbcfo_f"))
196: strcpy(berkname, "F");
197: else if (eq(uucpname, "ucbcfo_g"))
198: strcpy(berkname, "G");
199: else if (eq(uucpname, "ucbeecs40"))
200: strcpy(berkname, "EECS40");
201: else if (eq(uucpname, "ucbimage"))
202: strcpy(berkname, "Image");
203: else if (eq(uucpname, "ucbsrc"))
204: strcpy(berkname, "SRC");
205: else if (eq(uucpname, "ucbarpa"))
206: strcpy(berkname, "ARPAVAX");
207: else if (eq(uucpname, "ucbonyx"))
208: strcpy(berkname, "Onyx");
209: else if (eq(uucpname, "ucb"))
210: strcpy(berkname, "C70");
211: else if (eq(uucpname, "populi"))
212: strcpy(berkname, "G");
213: else if (eq(uucpname, "ucbcad"))
214: strcpy(berkname, "CAD");
215: else
216: strcpy(berkname, "UNKNOWN");
217: sprintf(buf, "%s:%s", berkname, rest);
218: #ifdef debug
219: printf("berkname='%s', buf='%s'\n", berkname, buf);
220: #endif
221: }
222:
223: /*
224: * Return the ptr in sp at which the character c appears;
225: * NULL if not found
226: */
227:
228: char *
229: index(sp, c)
230: register char *sp, c;
231: {
232: do {
233: if (*sp == c)
234: return(sp);
235: } while (*sp++);
236: return(NULL);
237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.