inntobbs.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:11k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include "innbbsconf.h"
  3. #include "daemon.h"
  4. #include "bbslib.h"
  5. #include <time.h>
  6. #define INNTOBBS
  7. #include "inntobbs.h"
  8. #include "lang.h"
  9. typedef struct Header {
  10. char   *name;
  11. int     id;
  12. }       header_t;
  13. /*enum HeaderValue {
  14. SUBJECT_H, FROM_H, DATE_H, MID_H, NEWSGROUPS_H,
  15. NNTPPOSTINGHOST_H, NNTPHOST_H, CONTROL_H, PATH_H,
  16. ORGANIZATION_H, LASTHEADER,
  17. };
  18. */
  19. /*char *strchr ARG((char*,int));
  20. char *strrchr ARG((char*,int));
  21. char *strstr ARG((char*,char*));
  22. */
  23. header_t headertable[] = {
  24. "Subject", SUBJECT_H,
  25. "From", FROM_H,
  26. "Date", DATE_H,
  27. "Message-ID", MID_H,
  28. "Newsgroups", NEWSGROUPS_H,
  29. "NNTP-Posting-Host", NNTPPOSTINGHOST_H,
  30. "NNTP-Host", NNTPHOST_H,
  31. "Control", CONTROL_H,
  32. "Path", PATH_H,
  33. "Organization", ORGANIZATION_H,
  34. "X-Auth-From", X_Auth_From_H,
  35. "Approved", APPROVED_H,
  36. "Distribution", DISTRIBUTION_H,
  37. "Keywords", KEYWORDS_H,
  38. "Summary", SUMMARY_H,
  39. "References", REFERENCES_H,
  40. };
  41. char   *HEADER[LASTHEADER];
  42. char   *BODY;
  43. char   *FROM, *SUBJECT, *SITE, *DATE, *POSTHOST, *NNTPHOST, *PATH, *GROUPS,
  44.        *MSGID, *CONTROL;
  45. #ifdef PalmBBS
  46. char  **XHEADER;
  47. char   *XPATH;
  48. #endif
  49. int
  50. isexcluded(path1, nl)
  51. char   *path1;
  52. nodelist_t *nl;
  53. {
  54. char    path2[1024];
  55. /* path2 = (char*)mymalloc(strlen(nl->node) + 3); */
  56. sprintf(path2, "!%.*s!", sizeof path2 - 3, nl->node);
  57. if (strstr(path1, path2) != NULL)
  58. return 1;
  59. if (nl->exclusion && *nl->exclusion) {
  60. char   *exclude, *ptr;
  61. for (exclude = nl->exclusion, ptr = strchr(exclude, ',');
  62. exclude && *exclude; ptr = strchr(exclude, ',')) {
  63. if (ptr)
  64. *ptr = '';
  65. sprintf(path2, "!%.*s!", sizeof path2 - 3, exclude);
  66. if (strstr(path1, path2) != NULL)
  67. return 1;
  68. if (ptr) {
  69. *ptr = ',';
  70. exclude = ptr + 1;
  71. } else {
  72. break;
  73. }
  74. }
  75. }
  76. return 0;
  77. }
  78. feedfplog(nf, filepath, type)
  79. newsfeeds_t *nf;
  80. char   *filepath;
  81. int     type;
  82. {
  83. char   *path1, *path2, *hostptr;
  84. nodelist_t *nl;
  85. if (nf == NULL)
  86. return;
  87. if (nf->path != NULL) {
  88. char   *ptr1, *ptr2;
  89. char    savech;
  90. path1 = (char *) mymalloc(strlen(HEADER[PATH_H]) + 3);
  91. sprintf(path1, "!%s!", HEADER[PATH_H]);
  92. for (ptr1 = nf->path; ptr1 && *ptr1;) {
  93. for (; *ptr1 && isspace(*ptr1); ptr1++);
  94. if (!*ptr1)
  95. break;
  96. for (ptr2 = ptr1; *ptr2 && !isspace(*ptr2); ptr2++);
  97. savech = *ptr2;
  98. *ptr2 = '';
  99. /*
  100.  * bbslog("search node %sn",ptr1);
  101.  */
  102. nl = (nodelist_t *) search_nodelist_bynode(ptr1);
  103. /*
  104.  * bbslog("search node node %s, host %s fp
  105.  * %dn",nl->node, nl->host, nl->feedfp);
  106.  */
  107. *ptr2 = savech;
  108. ptr1 = ptr2++;
  109. if (nl == NULL)
  110. continue;
  111. if (nl->feedfp == NULL)
  112. continue;
  113. if (isexcluded(path1, nl))
  114. continue;
  115. /*
  116.  * path2 = (char*)mymalloc(strlen(nl->node) + 3);
  117.  * sprintf(path2, "!%s!",nl->node); free(path2);
  118.  */
  119. /*
  120.  * bbslog("path1 %s path2 %sn",path1, path2);
  121.  */
  122. /* if (strstr(path1, path2) != NULL) return; */
  123. /* to conform to the bntplink batch file */
  124. {
  125. char   *slash = strrchr(filepath, '/');
  126. if (slash != NULL)
  127. *slash = 't';
  128. fprintf(nl->feedfp, "%st%stt%st%st%ct%st%s!%sn",
  129. filepath == NULL ? "" : filepath,
  130. GROUPS, FROM, SUBJECT, type, MSGID, MYBBSID, HEADER[PATH_H]);
  131. if (slash != NULL)
  132. *slash = '/';
  133. }
  134. fflush(nl->feedfp);
  135. if (savech == '')
  136. break;
  137. }
  138. free(path1);
  139. }
  140. }
  141. static FILE *bbsfeedsfp = NULL;
  142. static  bbsfeedson = -1;
  143. init_bbsfeedsfp()
  144. {
  145. if (bbsfeedsfp != NULL) {
  146. fclose(bbsfeedsfp);
  147. bbsfeedsfp = NULL;
  148. }
  149. bbsfeedson = -1;
  150. }
  151. bbsfeedslog(filepath, type)
  152. char   *filepath;
  153. int     type;
  154. {
  155. char    datebuf[40];
  156. time_t  now;
  157. if (bbsfeedson == 0)
  158. return;
  159. if (bbsfeedson == -1) {
  160. if (!isfile(BBSFEEDS)) {
  161. bbsfeedson = 0;
  162. return;
  163. }
  164. bbsfeedson = 1;
  165. }
  166. if (bbsfeedsfp == NULL) {
  167. bbsfeedsfp = fopen(BBSFEEDS, "a");
  168. }
  169. time(&now);
  170. strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now));
  171. if (bbsfeedsfp != NULL) {
  172. fprintf(bbsfeedsfp, "%s %c %s %s %s %s!%s %sn", datebuf, type,
  173. REMOTEHOSTNAME, GROUPS, MSGID, MYBBSID, HEADER[PATH_H], filepath == NULL ? "" : filepath);
  174. fflush(bbsfeedsfp);
  175. }
  176. }
  177. static FILE *echomailfp = NULL;
  178. static  echomaillogon = -1;
  179. init_echomailfp()
  180. {
  181. if (echomailfp != NULL) {
  182. fclose(echomailfp);
  183. echomailfp = NULL;
  184. }
  185. echomaillogon = -1;
  186. }
  187. echomaillog()
  188. {
  189. if (echomaillogon == 0)
  190. return;
  191. if (echomaillogon == -1) {
  192. if (!isfile(ECHOMAIL)) {
  193. echomaillogon = 0;
  194. return;
  195. }
  196. echomaillogon = 1;
  197. }
  198. if (echomailfp == NULL) {
  199. echomailfp = fopen(ECHOMAIL, "a");
  200. }
  201. if (echomailfp != NULL) {
  202. fprintf(echomailfp, "n");
  203. fprintf(echomailfp, "%s%s, %s%sn", FromTxt, FROM, BoardTxt, GROUPS);
  204. fprintf(echomailfp, "%s%sn", SubjectTxt, SUBJECT);
  205. fprintf(echomailfp, "%s%s (%s)n", OrganizationTxt, SITE, DATE);
  206. fprintf(echomailfp, "%s%s (%s)n", PathTxt, PATH, REMOTEHOSTNAME);
  207. fflush(echomailfp);
  208. }
  209. }
  210. #ifdef FILTER
  211. char   *
  212. cmdfilter(indata, filterbuffer, cmd)
  213. char   *indata, **filterbuffer;
  214. FuncPtr cmd;
  215. {
  216. char   *outdata;
  217. int     len = strlen(indata);
  218. if (*filterbuffer != NULL)
  219. *filterbuffer = (char *) myrealloc(*filterbuffer, len + 4096);
  220. else
  221. *filterbuffer = (char *) mymalloc(len + 4096);
  222. if (filterbuffer == NULL)
  223. return NULL;
  224. bcopy(indata, *filterbuffer, len);
  225. (*cmd) (*filterbuffer, &len, 0);
  226. (*filterbuffer)[len] = '';
  227. return *filterbuffer;
  228. }
  229. char   *
  230. externfilter(indata, filterbuffer, cmd)
  231. char   *indata, **filterbuffer, *cmd;
  232. {
  233. char   *outdata;
  234. FILE   *fp;
  235. int     fd;
  236. char   *tmpfile;
  237. int     len = strlen(indata);
  238. int     size;
  239. struct stat st;
  240. fp = (FILE *) popen((char *) fileglue("%s > /tmp/.innbbsdfilter%d%d", cmd, getpid(), getuid()), "w");
  241. if (fp == NULL) {
  242. bbslog("Err: can't popen %sn", cmd);
  243. return NULL;
  244. }
  245. if (fwrite(indata, 1, len, fp) != len) {
  246. bbslog("Err: fwrite to %s failed, len %dn", cmd, len);
  247. return NULL;
  248. }
  249. pclose(fp);
  250. tmpfile = (char *) fileglue("/tmp/.innbbsdfilter%d%d", getpid(), getuid());
  251. if (stat(tmpfile, &st) != 0)
  252. return NULL;
  253. if (*filterbuffer != NULL)
  254. *filterbuffer = myrealloc(*filterbuffer, st.st_size + 1);
  255. else
  256. *filterbuffer = mymalloc(st.st_size + 1);
  257. (*filterbuffer)[st.st_size] = '';
  258. if (*filterbuffer == NULL)
  259. return NULL;
  260. fd = open(tmpfile, O_RDONLY);
  261. if (fd < 0)
  262. return NULL;
  263. read(fd, *filterbuffer, st.st_size);
  264. close(fd);
  265. unlink(tmpfile);
  266. return *filterbuffer;
  267. }
  268. char   *
  269. filterdata(arp, direction, indata, filterdata)
  270. newsfeeds_t *arp;
  271. int     direction;
  272. char   *indata, **filterdata;
  273. {
  274. char   *outdata;
  275. FuncPtr fptr = NULL;
  276. char   *cmdptr = NULL;
  277. if (direction) {
  278. fptr = arp->sfilter;
  279. cmdptr = arp->scmdfilter;
  280. } else {
  281. fptr = arp->rfilter;
  282. cmdptr = arp->rcmdfilter;
  283. }
  284. if (fptr)
  285. outdata = cmdfilter(indata, filterdata, fptr);
  286. else if (cmdptr)
  287. outdata = externfilter(indata, filterdata, cmdptr);
  288. else
  289. outdata = NULL;
  290. return outdata;
  291. }
  292. char   *
  293. processfilter(indata, filterbuffer, direction)
  294. char   *indata, **filterbuffer;
  295. int     direction;
  296. {
  297. char   *front = indata, *ptr, *hptr;
  298. int     i;
  299. char   *outdata = indata;
  300. int     filterflag = 0;
  301. for (ptr = (char *) strchr(indata, 'n'); ptr != NULL && *ptr != ''; front = ptr + 1, ptr = (char *) strchr(front, 'n')) {
  302. *ptr = '';
  303. if (front[0] == 'r' || front[1] == 'n') {
  304. *ptr = 'n';
  305. break;
  306. }
  307. hptr = (char *) strchr(front, ':');
  308. if (hptr != NULL && hptr[1] == ' ') {
  309. *hptr = '';
  310. if (strcmp(front, "Newsgroups") == 0) {
  311. char   *ngp, *ongp;
  312. newsfeeds_t *arp;
  313. char   *tp;
  314. if ((tp = (char *) strchr(hptr + 2, 'r')) != NULL)
  315. *tp = '';
  316. for (ngp = hptr + 2, ongp = strchr(ngp, ',');
  317. ngp && *ngp; ongp = strchr(ngp, ',')) {
  318. if (ongp)
  319. *ongp = '';
  320. arp = search_group(ngp);
  321. if (arp) {
  322. if (ongp)
  323. *ongp = ',';
  324. if (tp != NULL)
  325. *tp = 'r';
  326. if (hptr)
  327. *hptr = ':';
  328. if (ptr)
  329. *ptr = 'n';
  330. outdata = filterdata(arp, direction, indata, filterbuffer);
  331. if (outdata)
  332. filterflag = 1;
  333. if (ongp)
  334. *ongp = '';
  335. if (tp != NULL)
  336. tp = '';
  337. if (hptr)
  338. *hptr = '';
  339. if (ptr)
  340. *ptr = '';
  341. }
  342. if (ongp) {
  343. *ongp = ',';
  344. ngp = ongp + 1;
  345. } else {
  346. break;
  347. }
  348. if (filterflag)
  349. break;
  350. }
  351. if (tp != NULL)
  352. *tp = 'r';
  353. filterflag = 1;
  354. }
  355. *hptr = ':';
  356. }
  357. *ptr = 'n';
  358. if (filterflag)
  359. break;
  360. }
  361. if (outdata)
  362. return outdata;
  363. else
  364. return indata;
  365. }
  366. #endif
  367. int 
  368. headercmp(a, b)
  369. header_t *a, *b;
  370. {
  371. return strcasecmp(a->name, b->name);
  372. }
  373. int 
  374. readlines(client)
  375. ClientType *client;
  376. {
  377. int     fd = client->fd;
  378. char   *buffer = client->buffer;
  379. buffer_t *in = &client->in;
  380. char   *indata = in->data;
  381. char   *front = in->data, *ptr, *hptr;
  382. int     i;
  383. for (i = 0; i < LASTHEADER; i++)
  384. HEADER[i] = NULL;
  385. #ifdef FILTER
  386. indata = processfilter(in->data, &client->filter_buffer, 0);
  387. #endif
  388. if (indata != NULL) {
  389. front = indata;
  390. } else {
  391. front = indata = in->data;
  392. }
  393. for (ptr = (char *) strchr(indata, 'n'); ptr != NULL && *ptr != ''; front = ptr + 1, ptr = (char *) strchr(front, 'n')) {
  394. *ptr = '';
  395. if (front[0] == 'r' || front[1] == 'n') {
  396. BODY = front + 2;
  397. break;
  398. }
  399. hptr = (char *) strchr(front, ':');
  400. if (hptr != NULL && hptr[1] == ' ') {
  401. int     value;
  402. *hptr = '';
  403. value = headervalue(front);
  404. if (value != -1) {
  405. char   *tp;
  406. HEADER[value] = hptr + 2;
  407. if ((tp = (char *) strchr(HEADER[value], 'r')) != NULL)
  408. *tp = '';
  409. }
  410. *hptr = ':';
  411. }
  412. /**ptr = 'n';*/
  413. }
  414. NNTPHOST = HEADER[NNTPHOST_H];
  415. PATH = HEADER[PATH_H];
  416. FROM = HEADER[FROM_H];
  417. GROUPS = HEADER[NEWSGROUPS_H];
  418. SUBJECT = HEADER[SUBJECT_H];
  419. DATE = HEADER[DATE_H];
  420. SITE = HEADER[ORGANIZATION_H];
  421. MSGID = HEADER[MID_H];
  422. CONTROL = HEADER[CONTROL_H];
  423. POSTHOST = HEADER[NNTPPOSTINGHOST_H];
  424. if (POSTHOST == NULL) {
  425. if (HEADER[X_Auth_From_H] != NULL) {
  426. POSTHOST = HEADER[X_Auth_From_H];
  427. HEADER[NNTPPOSTINGHOST_H] = POSTHOST;
  428. }
  429. }
  430. #ifdef PalmBBS
  431. XPATH = PATH;
  432. XHEADER = HEADER;
  433. #endif
  434. }
  435. int 
  436. headervalue(inputheader)
  437. char   *inputheader;
  438. {
  439. header_t key, *findkey;
  440. static int hasinit = 0;
  441. if (hasinit == 0) {
  442. article_init();
  443. hasinit = 1;
  444. }
  445. key.name = inputheader;
  446. findkey = (header_t *) bsearch(
  447. (char *) &key, (char *) headertable,
  448. sizeof(headertable) / sizeof(header_t), sizeof(key),
  449. headercmp);
  450. if (findkey != NULL)
  451. return findkey->id;
  452. return -1;
  453. }
  454. article_init()
  455. {
  456. int     i;
  457. static int article_inited = 0;
  458. if (article_inited)
  459. return;
  460. article_inited = 1;
  461. qsort(headertable, sizeof(headertable) / sizeof(header_t), sizeof(header_t),
  462. headercmp);
  463. for (i = 0; i < LASTHEADER; i++)
  464. HEADER[i] = NULL;
  465. }
  466. #ifdef INNTOBBS_MAIN
  467. main()
  468. {
  469. int     i, j, k, l, m, n, o, p, q;
  470. article_init();
  471. i = headervalue("Subject");
  472. j = headervalue("From");
  473. k = headervalue("Date");
  474. l = headervalue("NNTP-Posting-Host");
  475. m = headervalue("Newsgroups");
  476. n = headervalue("Message-ID");
  477. }
  478. #endif