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

Telnet服务器

开发平台:

Unix_Linux

  1. #if defined( LINUX )
  2. #include "innbbsconf.h"
  3. #include "bbslib.h"
  4. #include <varargs.h>
  5. #else
  6. #include <varargs.h>
  7. #include "innbbsconf.h"
  8. #include "bbslib.h"
  9. #endif
  10. char    INNBBSCONF[MAXPATHLEN];
  11. char    INNDHOME[MAXPATHLEN];
  12. char    HISTORY[MAXPATHLEN];
  13. char    LOGFILE[MAXPATHLEN];
  14. char    MYBBSID[MAXPATHLEN];
  15. char    ECHOMAIL[MAXPATHLEN];
  16. char    BBSFEEDS[MAXPATHLEN];
  17. char    LOCALDAEMON[MAXPATHLEN];
  18. char    FILTERCTL[MAXPATHLEN];
  19. int     His_Maint_Min = HIS_MAINT_MIN;
  20. int     His_Maint_Hour = HIS_MAINT_HOUR;
  21. int     Expiredays = EXPIREDAYS;
  22. nodelist_t *NODELIST = NULL, **NODELIST_BYNODE = NULL;
  23. newsfeeds_t *NEWSFEEDS = NULL, **NEWSFEEDS_BYBOARD = NULL;
  24. #if  defined(FILTER) && defined(WITH_ECHOMAIL)
  25. filter_t *FILTERLIST = NULL;
  26. static char *FILTER_BUF;
  27. int     FILTERCOUNT;
  28. #endif
  29. static char *NODELIST_BUF, *NEWSFEEDS_BUF;
  30. int     NFCOUNT, NLCOUNT;
  31. int     LOCALNODELIST = 0, NONENEWSFEEDS = 0;
  32. #ifndef _PATH_BBSHOME
  33. #define _PATH_BBSHOME "/u/staff/bbsroot/csie_util/bntpd/home"
  34. #endif
  35. char    BBSHOME[] = _PATH_BBSHOME;
  36. static FILE *bbslogfp;
  37. static int
  38.         verboseFlag = 0;
  39. static char *
  40.         verboseFilename = NULL;
  41. static char verbosename[MAXPATHLEN];
  42. verboseon(filename)
  43. char   *filename;
  44. {
  45. verboseFlag = 1;
  46. if (filename != NULL) {
  47. if (strchr(filename, '/') == NULL) {
  48. sprintf(verbosename, "%s/innd/%s", BBSHOME, filename);
  49. filename = verbosename;
  50. }
  51. }
  52. verboseFilename = filename;
  53. }
  54. verboseoff()
  55. {
  56. verboseFlag = 0;
  57. }
  58. setverboseon()
  59. {
  60. verboseFlag = 1;
  61. }
  62. isverboselog()
  63. {
  64. return verboseFlag;
  65. }
  66. setverboseoff()
  67. {
  68. verboseoff();
  69. if (bbslogfp != NULL) {
  70. fclose(bbslogfp);
  71. bbslogfp = NULL;
  72. }
  73. }
  74. verboselog(va_alist)
  75. va_dcl
  76. {
  77. va_list ap;
  78. register char *fmt;
  79. char    datebuf[40];
  80. time_t  now;
  81. if (verboseFlag == 0)
  82. return;
  83. va_start(ap);
  84. time(&now);
  85. strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now));
  86. if (bbslogfp == NULL) {
  87. if (verboseFilename != NULL)
  88. bbslogfp = fopen(verboseFilename, "a");
  89. else
  90. bbslogfp = fdopen(1, "a");
  91. }
  92. if (bbslogfp == NULL) {
  93. va_end(ap);
  94. return;
  95. }
  96. fmt = va_arg(ap, char *);
  97. fprintf(bbslogfp, "%s[%d] ", datebuf, getpid());
  98. vfprintf(bbslogfp, fmt, ap);
  99. fflush(bbslogfp);
  100. va_end(ap);
  101. }
  102. #ifdef PalmBBS
  103. xbbslog(va_alist)
  104. #else
  105. bbslog(va_alist)
  106. #endif
  107. va_dcl
  108. {
  109. va_list ap;
  110. register char *fmt;
  111. char    datebuf[40];
  112. time_t  now;
  113. va_start(ap);
  114. time(&now);
  115. strftime(datebuf, sizeof(datebuf), "%b %d %X ", localtime(&now));
  116. if (bbslogfp == NULL) {
  117. bbslogfp = fopen(LOGFILE, "a");
  118. }
  119. if (bbslogfp == NULL) {
  120. va_end(ap);
  121. return;
  122. }
  123. fmt = va_arg(ap, char *);
  124. fprintf(bbslogfp, "%s[%d] ", datebuf, getpid());
  125. vfprintf(bbslogfp, fmt, ap);
  126. fflush(bbslogfp);
  127. va_end(ap);
  128. }
  129. initial_bbs(outgoing)
  130. char   *outgoing;
  131. {
  132. FILE   *FN;
  133. struct stat st;
  134. int     fd, i;
  135. char   *bbsnameptr = NULL;
  136. /* reopen bbslog */
  137. if (bbslogfp != NULL) {
  138. fclose(bbslogfp);
  139. bbslogfp = NULL;
  140. }
  141. #ifdef WITH_ECHOMAIL
  142. init_echomailfp();
  143. init_bbsfeedsfp();
  144. #endif
  145. LOCALNODELIST = 0, NONENEWSFEEDS = 0;
  146. sprintf(INNDHOME, "%s/innd", BBSHOME);
  147. sprintf(HISTORY, "%s/history", INNDHOME);
  148. sprintf(LOGFILE, "%s/bbslog", INNDHOME);
  149. sprintf(ECHOMAIL, "%s/echomail.log", BBSHOME);
  150. sprintf(LOCALDAEMON, "%s/.innbbsd", INNDHOME);
  151. sprintf(INNBBSCONF, "%s/innbbs.conf", INNDHOME);
  152. sprintf(BBSFEEDS, "%s/bbsfeeds.log", INNDHOME);
  153. #if  defined(FILTER) && defined(WITH_ECHOMAIL)
  154. sprintf(FILTERCTL, "%s/filter.ctl", INNDHOME);
  155. #endif
  156. if (isfile(INNBBSCONF)) {
  157. FILE   *conf;
  158. char    buffer[MAXPATHLEN];
  159. conf = fopen(INNBBSCONF, "r");
  160. if (conf != NULL) {
  161. while (fgets(buffer, sizeof buffer, conf) != NULL) {
  162. char   *ptr, *front = NULL, *value = NULL,
  163.        *value2 = NULL, *value3 = NULL;
  164. if (buffer[0] == '#' || buffer[0] == 'n')
  165. continue;
  166. for (front = buffer; *front && isspace(*front); front++);
  167. for (ptr = front; *ptr && !isspace(*ptr); ptr++);
  168. if (*ptr == '')
  169. continue;
  170. *ptr++ = '';
  171. for (; *ptr && isspace(*ptr); ptr++);
  172. if (*ptr == '')
  173. continue;
  174. value = ptr++;
  175. for (; *ptr && !isspace(*ptr); ptr++);
  176. if (*ptr) {
  177. *ptr++ = '';
  178. for (; *ptr && isspace(*ptr); ptr++);
  179. value2 = ptr++;
  180. for (; *ptr && !isspace(*ptr); ptr++);
  181. if (*ptr) {
  182. *ptr++ = '';
  183. for (; *ptr && isspace(*ptr); ptr++);
  184. value3 = ptr++;
  185. for (; *ptr && !isspace(*ptr); ptr++);
  186. if (*ptr) {
  187. *ptr++ = '';
  188. }
  189. }
  190. }
  191. if (strcasecmp(front, "expiredays") == 0) {
  192. Expiredays = atoi(value);
  193. if (Expiredays < 0) {
  194. Expiredays = EXPIREDAYS;
  195. }
  196. } else if (strcasecmp(front, "expiretime") == 0) {
  197. ptr = strchr(value, ':');
  198. if (ptr == NULL) {
  199. fprintf(stderr, "Syntax error in innbbs.confn");
  200. } else {
  201. *ptr++ = '';
  202. His_Maint_Hour = atoi(value);
  203. His_Maint_Min = atoi(ptr);
  204. if (His_Maint_Hour < 0)
  205. His_Maint_Hour = HIS_MAINT_HOUR;
  206. if (His_Maint_Min < 0)
  207. His_Maint_Min = HIS_MAINT_MIN;
  208. }
  209. } else if (strcasecmp(front, "newsfeeds") == 0) {
  210. if (strcmp(value, "none") == 0)
  211. NONENEWSFEEDS = 1;
  212. } else if (strcasecmp(front, "nodelist") == 0) {
  213. if (strcmp(value, "local") == 0)
  214. LOCALNODELIST = 1;
  215. } /* else if (
  216.  * strcasecmp(front,"newsfeeds") ==
  217.  * 0) { printf("newsfeeds %sn",
  218.  * value); } else if (
  219.  * strcasecmp(front,"nodelist") == 0)
  220.  * { printf("nodelist %sn", value);
  221.  * } else if (
  222.  * strcasecmp(front,"bbsname") == 0)
  223.  * { printf("bbsname %sn", value); } */
  224. }
  225. fclose(conf);
  226. }
  227. }
  228. #ifdef WITH_ECHOMAIL
  229. bbsnameptr = (char *) fileglue("%s/bbsname.bbs", INNDHOME);
  230. if ((FN = fopen(bbsnameptr, "r")) == NULL) {
  231. fprintf(stderr, "can't open file %sn", bbsnameptr);
  232. return 0;
  233. }
  234. while (fscanf(FN, "%s", MYBBSID) != EOF);
  235. fclose(FN);
  236. if (!isdir(fileglue("%s/out.going", BBSHOME))) {
  237. mkdir((char *) fileglue("%s/out.going", BBSHOME), 0750);
  238. }
  239. if (NONENEWSFEEDS == 0) {
  240. #if  defined(FILTER) && defined(WITH_ECHOMAIL)
  241. readfilterfile(INNDHOME);
  242. #endif
  243. readnffile(INNDHOME);
  244. }
  245. if (LOCALNODELIST == 0) {
  246. if (readnlfile(INNDHOME, outgoing) != 0)
  247. return 0;
  248. }
  249. #endif
  250. return 1;
  251. }
  252. static int
  253. nf_byboardcmp(a, b)
  254. newsfeeds_t **a, **b;
  255. {
  256. /*
  257.    if (!a || !*a || !(*a)->board) return -1;
  258.    if (!b || !*b || !(*b)->board) return 1;
  259. */
  260. return strcasecmp((*a)->board, (*b)->board);
  261. }
  262. static int
  263. nfcmp(a, b)
  264. newsfeeds_t *a, *b;
  265. {
  266. /*
  267.    if (!a || !a->newsgroups) return -1;
  268.    if (!b || !b->newsgroups) return 1;
  269. */
  270. return strcasecmp(a->newsgroups, b->newsgroups);
  271. }
  272. static int
  273. nlcmp(a, b)
  274. nodelist_t *a, *b;
  275. {
  276. /*
  277.    if (!a || !a->host) return -1;
  278.    if (!b || !b->host) return 1;
  279. */
  280. return strcasecmp(a->host, b->host);
  281. }
  282. static int
  283. nl_bynodecmp(a, b)
  284. nodelist_t **a, **b;
  285. {
  286. /*
  287.    if (!a || !*a || !(*a)->node) return -1;
  288.    if (!b || !*b || !(*b)->node) return 1;
  289. */
  290. return strcasecmp((*a)->node, (*b)->node);
  291. }
  292. /* read in newsfeeds.bbs and nodelist.bbs */
  293. readnlfile(inndhome, outgoing)
  294. char   *inndhome;
  295. char   *outgoing;
  296. {
  297. FILE   *fp;
  298. char    buff[1024];
  299. struct stat st;
  300. int     i, count, j;
  301. char   *ptr, *nodelistptr;
  302. static  lastcount = 0;
  303. sprintf(buff, "%s/nodelist.bbs", inndhome);
  304. fp = fopen(buff, "r");
  305. if (fp == NULL) {
  306. fprintf(stderr, "open fail %s", buff);
  307. return -1;
  308. }
  309. if (fstat(fileno(fp), &st) != 0) {
  310. fprintf(stderr, "stat fail %s", buff);
  311. return -1;
  312. }
  313. if (NODELIST_BUF == NULL) {
  314. NODELIST_BUF = (char *) mymalloc(st.st_size + 1);
  315. } else {
  316. NODELIST_BUF = (char *) myrealloc(NODELIST_BUF, st.st_size + 1);
  317. }
  318. i = 0, count = 0;
  319. *NODELIST_BUF = '';
  320. while (fgets(buff, sizeof buff, fp) != NULL) {
  321. if (buff[0] == '#')
  322. continue;
  323. if (buff[0] == 'n')
  324. continue;
  325. strcpy(NODELIST_BUF + i, buff);
  326. i += strlen(buff);
  327. count++;
  328. }
  329. fclose(fp);
  330. if (NODELIST == NULL) {
  331. NODELIST = (nodelist_t *) mymalloc(sizeof(nodelist_t) * (count + 1));
  332. NODELIST_BYNODE = (nodelist_t **) mymalloc(sizeof(nodelist_t *) * (count + 1));
  333. } else {
  334. NODELIST = (nodelist_t *) myrealloc(NODELIST, sizeof(nodelist_t) * (count + 1));
  335. NODELIST_BYNODE = (nodelist_t **) myrealloc(NODELIST_BYNODE, sizeof(nodelist_t *) * (count + 1));
  336. }
  337. for (i = lastcount; i < count; i++) {
  338. NODELIST[i].feedfp = NULL;
  339. }
  340. lastcount = count;
  341. NLCOUNT = 0;
  342. for (ptr = NODELIST_BUF; (nodelistptr = (char *) strchr(ptr, 'n')) != NULL; ptr = nodelistptr + 1, NLCOUNT++) {
  343. char   *nptr, *bptr, *pptr, *tptr;
  344. *nodelistptr = '';
  345. NODELIST[NLCOUNT].host = "";
  346. NODELIST[NLCOUNT].exclusion = "";
  347. NODELIST[NLCOUNT].node = "";
  348. NODELIST[NLCOUNT].protocol = "IHAVE(119)";
  349. NODELIST[NLCOUNT].comments = "";
  350. NODELIST_BYNODE[NLCOUNT] = NODELIST + NLCOUNT;
  351. for (nptr = ptr; *nptr && isspace(*nptr);)
  352. nptr++;
  353. if (*nptr == '') {
  354. bbslog("nodelist.bbs %d entry read errorn", NLCOUNT);
  355. return -1;
  356. }
  357. /* NODELIST[NLCOUNT].id = nptr; */
  358. NODELIST[NLCOUNT].node = nptr;
  359. for (nptr++; *nptr && !isspace(*nptr);)
  360. nptr++;
  361. if (*nptr == '') {
  362. bbslog("nodelist.bbs node %d entry read errorn", NLCOUNT);
  363. return -1;
  364. }
  365. *nptr = '';
  366. if ((tptr = strchr(NODELIST[NLCOUNT].node, '/'))) {
  367. *tptr = '';
  368. NODELIST[NLCOUNT].exclusion = tptr + 1;
  369. } else {
  370. NODELIST[NLCOUNT].exclusion = "";
  371. }
  372. for (nptr++; *nptr && isspace(*nptr);)
  373. nptr++;
  374. if (*nptr == '')
  375. continue;
  376. if (*nptr == '+' || *nptr == '-') {
  377. NODELIST[NLCOUNT].feedtype = *nptr;
  378. if (NODELIST[NLCOUNT].feedfp != NULL) {
  379. fclose(NODELIST[NLCOUNT].feedfp);
  380. }
  381. if (NODELIST[NLCOUNT].feedtype == '+')
  382. if (outgoing != NULL) {
  383. NODELIST[NLCOUNT].feedfp = fopen((char *) fileglue("%s/out.going/%s.%s", BBSHOME, NODELIST[NLCOUNT].node, outgoing), "a");
  384. }
  385. nptr++;
  386. } else {
  387. NODELIST[NLCOUNT].feedtype = ' ';
  388. }
  389. NODELIST[NLCOUNT].host = nptr;
  390. for (nptr++; *nptr && !isspace(*nptr);)
  391. nptr++;
  392. if (*nptr == '') {
  393. continue;
  394. }
  395. *nptr = '';
  396. for (nptr++; *nptr && isspace(*nptr);)
  397. nptr++;
  398. if (*nptr == '')
  399. continue;
  400. NODELIST[NLCOUNT].protocol = nptr;
  401. for (nptr++; *nptr && !isspace(*nptr);)
  402. nptr++;
  403. if (*nptr == '')
  404. continue;
  405. *nptr = '';
  406. for (nptr++; *nptr && strchr(" trn", *nptr);)
  407. nptr++;
  408. if (*nptr == '')
  409. continue;
  410. NODELIST[NLCOUNT].comments = nptr;
  411. }
  412. qsort(NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp);
  413. qsort(NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t *), nl_bynodecmp);
  414. return 0;
  415. }
  416. #if  defined(FILTER) && defined(WITH_ECHOMAIL)
  417. readfilterfile(inndhome)
  418. char   *inndhome;
  419. {
  420. FILE   *fp;
  421. char    buff[1024];
  422. struct stat st;
  423. int     i, count;
  424. char   *ptr, *filterptr;
  425. sprintf(buff, "%s/filter.ctl", inndhome);
  426. fp = fopen(buff, "r");
  427. if (fp == NULL) {
  428. fprintf(stderr, "open fail %s", buff);
  429. return -1;
  430. }
  431. if (fstat(fileno(fp), &st) != 0) {
  432. fprintf(stderr, "stat fail %s", buff);
  433. return -1;
  434. }
  435. if (FILTER_BUF == NULL) {
  436. FILTER_BUF = (char *) mymalloc(st.st_size + 1);
  437. } else {
  438. FILTER_BUF = (char *) myrealloc(FILTER_BUF, st.st_size + 1);
  439. }
  440. *FILTER_BUF = '';
  441. i = 0, count = 0;
  442. while (fgets(buff, sizeof buff, fp) != NULL) {
  443. if (buff[0] == '#')
  444. continue;
  445. if (buff[0] == 'n')
  446. continue;
  447. strcpy(FILTER_BUF + i, buff);
  448. i += strlen(buff);
  449. count++;
  450. }
  451. fclose(fp);
  452. if (FILTERLIST == NULL) {
  453. FILTERLIST = (filter_t *) mymalloc(sizeof(filter_t) * (count + 1));
  454. } else {
  455. FILTERLIST = (filter_t *) myrealloc(FILTERLIST, sizeof(filter_t) * (count + 1));
  456. }
  457. FILTERCOUNT = 0;
  458. for (ptr = FILTER_BUF; (filterptr = (char *) strchr(ptr, 'n')) != NULL; ptr = filterptr + 1, FILTERCOUNT++) {
  459. char   *nptr, *bptr, *pptr;
  460. *filterptr = '';
  461. FILTERLIST[FILTERCOUNT].group = "";
  462. FILTERLIST[FILTERCOUNT].rcmdfilter = "";
  463. FILTERLIST[FILTERCOUNT].scmdfilter = "";
  464. for (nptr = ptr; *nptr && isspace(*nptr);)
  465. nptr++;
  466. if (*nptr == '')
  467. continue;
  468. FILTERLIST[FILTERCOUNT].group = nptr;
  469. nptr = strchr(nptr + 1, ':');
  470. if (*nptr == '')
  471. continue;
  472. *nptr = '';
  473. for (nptr = nptr + 1; *nptr && isspace(*nptr);)
  474. nptr++;
  475. FILTERLIST[FILTERCOUNT].rcmdfilter = nptr;
  476. nptr = strchr(nptr, ':');
  477. if (*nptr == '')
  478. continue;
  479. *nptr = '';
  480. for (nptr = nptr + 1; *nptr && isspace(*nptr);)
  481. nptr++;
  482. FILTERLIST[FILTERCOUNT].scmdfilter = nptr;
  483. }
  484. }
  485. filter_t *
  486. search_filter(group)
  487. char   *group;
  488. {
  489. int     i;
  490. for (i = 0; i < FILTERCOUNT; ++i) {
  491. if (filtermatch(0, group, FILTERLIST[i].group))
  492. return FILTERLIST + i;
  493. }
  494. return NULL;
  495. }
  496. #endif
  497. readnffile(inndhome)
  498. char   *inndhome;
  499. {
  500. FILE   *fp;
  501. char    buff[1024];
  502. struct stat st;
  503. int     i, count;
  504. char   *ptr, *newsfeedsptr;
  505. sprintf(buff, "%s/newsfeeds.bbs", inndhome);
  506. fp = fopen(buff, "r");
  507. if (fp == NULL) {
  508. fprintf(stderr, "open fail %s", buff);
  509. return -1;
  510. }
  511. if (fstat(fileno(fp), &st) != 0) {
  512. fprintf(stderr, "stat fail %s", buff);
  513. return -1;
  514. }
  515. if (NEWSFEEDS_BUF == NULL) {
  516. NEWSFEEDS_BUF = (char *) mymalloc(st.st_size + 1);
  517. } else {
  518. NEWSFEEDS_BUF = (char *) myrealloc(NEWSFEEDS_BUF, st.st_size + 1);
  519. }
  520. *NEWSFEEDS_BUF = '';
  521. i = 0, count = 0;
  522. while (fgets(buff, sizeof buff, fp) != NULL) {
  523. if (buff[0] == '#')
  524. continue;
  525. if (buff[0] == 'n')
  526. continue;
  527. strcpy(NEWSFEEDS_BUF + i, buff);
  528. i += strlen(buff);
  529. count++;
  530. }
  531. fclose(fp);
  532. if (NEWSFEEDS == NULL) {
  533. NEWSFEEDS = (newsfeeds_t *) mymalloc(sizeof(newsfeeds_t) * (count + 1));
  534. NEWSFEEDS_BYBOARD = (newsfeeds_t **) mymalloc(sizeof(newsfeeds_t *) * (count + 1));
  535. } else {
  536. NEWSFEEDS = (newsfeeds_t *) myrealloc(NEWSFEEDS, sizeof(newsfeeds_t) * (count + 1));
  537. NEWSFEEDS_BYBOARD = (newsfeeds_t **) myrealloc(NEWSFEEDS_BYBOARD, sizeof(newsfeeds_t *) * (count + 1));
  538. }
  539. NFCOUNT = 0;
  540. for (ptr = NEWSFEEDS_BUF; (newsfeedsptr = (char *) strchr(ptr, 'n')) != NULL; ptr = newsfeedsptr + 1, NFCOUNT++) {
  541. char   *nptr, *bptr, *pptr;
  542. *newsfeedsptr = '';
  543. NEWSFEEDS[NFCOUNT].newsgroups = "";
  544. NEWSFEEDS[NFCOUNT].board = "";
  545. NEWSFEEDS[NFCOUNT].path = NULL;
  546. NEWSFEEDS_BYBOARD[NFCOUNT] = NEWSFEEDS + NFCOUNT;
  547. for (nptr = ptr; *nptr && isspace(*nptr);)
  548. nptr++;
  549. if (*nptr == '')
  550. continue;
  551. NEWSFEEDS[NFCOUNT].newsgroups = nptr;
  552. for (nptr++; *nptr && !isspace(*nptr);)
  553. nptr++;
  554. if (*nptr == '')
  555. continue;
  556. *nptr = '';
  557. for (nptr++; *nptr && isspace(*nptr);)
  558. nptr++;
  559. if (*nptr == '')
  560. continue;
  561. NEWSFEEDS[NFCOUNT].board = nptr;
  562. for (nptr++; *nptr && !isspace(*nptr);)
  563. nptr++;
  564. if (*nptr == '')
  565. continue;
  566. *nptr = '';
  567. for (nptr++; *nptr && isspace(*nptr);)
  568. nptr++;
  569. if (*nptr == '')
  570. continue;
  571. NEWSFEEDS[NFCOUNT].path = nptr;
  572. for (nptr++; *nptr && !strchr("rn", *nptr);)
  573. nptr++;
  574. /* if (*nptr == '') continue; */
  575. *nptr = '';
  576. }
  577. #if  defined(FILTER) && defined(WITH_ECHOMAIL)
  578. for (i = 0; i < NFCOUNT; i++) {
  579. newsfeeds_t *nfptr;
  580. filter_t *fptr;
  581. char   *ngptr, *ptr;
  582. int     found;
  583. nfptr = NEWSFEEDS + i;
  584. for (found = 0, ngptr = nfptr->newsgroups, ptr = strchr(ngptr, ',');
  585. ngptr && *ngptr && !found; ptr = strchr(ngptr, ',')) {
  586. if (ptr)
  587. *ptr = '';
  588. fptr = (filter_t *) search_filter(ngptr);
  589. if (fptr) {
  590. nfptr->rcmdfilter = fptr->rcmdfilter;
  591. nfptr->scmdfilter = fptr->scmdfilter;
  592. nfptr->rfilter = (FuncPtr) search_filtercmd(fptr->rcmdfilter);
  593. nfptr->sfilter = (FuncPtr) search_filtercmd(fptr->scmdfilter);
  594. found = 1;
  595. } else {
  596. nfptr->rcmdfilter = nfptr->scmdfilter = NULL;
  597. nfptr->rfilter = nfptr->sfilter = NULL;
  598. }
  599. if (ptr) {
  600. *ptr = ',';
  601. ngptr = ptr + 1;
  602. } else {
  603. break;
  604. }
  605. }
  606. }
  607. #endif
  608. qsort(NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp);
  609. qsort(NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t *), nf_byboardcmp);
  610. }
  611. newsfeeds_t *
  612. search_board(board)
  613. char   *board;
  614. {
  615. newsfeeds_t nft, *nftptr, **find;
  616. if (NONENEWSFEEDS)
  617. return NULL;
  618. nft.board = board;
  619. nftptr = &nft;
  620. find = (newsfeeds_t **) bsearch((char *) &nftptr, NEWSFEEDS_BYBOARD, NFCOUNT, sizeof(newsfeeds_t *), nf_byboardcmp);
  621. if (find != NULL)
  622. return *find;
  623. return NULL;
  624. }
  625. nodelist_t *
  626. search_nodelist_bynode(node)
  627. char   *node;
  628. {
  629. nodelist_t nlt, *nltptr, **find;
  630. if (LOCALNODELIST)
  631. return NULL;
  632. nlt.node = node;
  633. nltptr = &nlt;
  634. find = (nodelist_t **) bsearch((char *) &nltptr, NODELIST_BYNODE, NLCOUNT, sizeof(nodelist_t *), nl_bynodecmp);
  635. if (find != NULL)
  636. return *find;
  637. return NULL;
  638. }
  639. nodelist_t *
  640. search_nodelist(site, identuser)
  641. char   *site;
  642. char   *identuser;
  643. {
  644. nodelist_t nlt, *find;
  645. char    buffer[1024];
  646. if (LOCALNODELIST)
  647. return NULL;
  648. nlt.host = site;
  649. find = (nodelist_t *) bsearch((char *) &nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp);
  650. if (find == NULL && identuser != NULL) {
  651. sprintf(buffer, "%s@%s", identuser, site);
  652. nlt.host = buffer;
  653. find = (nodelist_t *) bsearch((char *) &nlt, NODELIST, NLCOUNT, sizeof(nodelist_t), nlcmp);
  654. }
  655. return find;
  656. }
  657. newsfeeds_t *
  658. search_group(newsgroup)
  659. char   *newsgroup;
  660. {
  661. newsfeeds_t nft, *find;
  662. if (NONENEWSFEEDS)
  663. return NULL;
  664. nft.newsgroups = newsgroup;
  665. find = (newsfeeds_t *) bsearch((char *) &nft, NEWSFEEDS, NFCOUNT, sizeof(newsfeeds_t), nfcmp);
  666. return find;
  667. }
  668. char   *
  669. ascii_date(now)
  670. time_t  now;
  671. {
  672. static char datebuf[40];
  673. /*
  674.  * time_t now; time(&now);
  675.  */
  676. strftime(datebuf, sizeof(datebuf), "%d %b %Y %X GMT", gmtime(&now));
  677. return datebuf;
  678. }
  679. char   *
  680. restrdup(ptr, string)
  681. char   *ptr;
  682. char   *string;
  683. {
  684. int     len;
  685. if (string == NULL) {
  686. if (ptr != NULL)
  687. *ptr = '';
  688. return ptr;
  689. }
  690. len = strlen(string) + 1;
  691. if (ptr != NULL) {
  692. ptr = (char *) myrealloc(ptr, len);
  693. } else
  694. ptr = (char *) mymalloc(len);
  695. strcpy(ptr, string);
  696. return ptr;
  697. }
  698. void   *
  699. mymalloc(size)
  700. int     size;
  701. {
  702. char   *ptr = (char *) malloc(size);
  703. if (ptr == NULL) {
  704. fprintf(stderr, "cant allocate memoryn");
  705. syslog(LOG_ERR, "cant allocate memory %m");
  706. exit(1);
  707. }
  708. return ptr;
  709. }
  710. void   *
  711. myrealloc(optr, size)
  712. void   *optr;
  713. int     size;
  714. {
  715. char   *ptr = (char *) realloc(optr, size);
  716. if (ptr == NULL) {
  717. fprintf(stderr, "cant allocate memoryn");
  718. syslog(LOG_ERR, "cant allocate memory %m");
  719. exit(1);
  720. }
  721. return ptr;
  722. }
  723. testandmkdir(dir)
  724. char   *dir;
  725. {
  726. if (!isdir(dir)) {
  727. char    path[MAXPATHLEN + 12];
  728. sprintf(path, "mkdir -p %s", dir);
  729. system(path);
  730. }
  731. }
  732. static char splitbuf[2048];
  733. static char joinbuf[1024];
  734. #define MAXTOK 50
  735. static char *Splitptr[MAXTOK];
  736. char  **
  737. split(line, pat)
  738. char   *line, *pat;
  739. {
  740. char   *p;
  741. int     i;
  742. for (i = 0; i < MAXTOK; ++i)
  743. Splitptr[i] = NULL;
  744. strncpy(splitbuf, line, sizeof splitbuf - 1);
  745. /* printf("%d %dn",strlen(line),strlen(splitbuf)); */
  746. splitbuf[sizeof splitbuf - 1] = '';
  747. for (i = 0, p = splitbuf; *p && i < MAXTOK - 1;) {
  748. for (Splitptr[i++] = p; *p && !strchr(pat, *p); p++);
  749. if (*p == '')
  750. break;
  751. for (*p++ = ''; *p && strchr(pat, *p); p++);
  752. }
  753. return Splitptr;
  754. }
  755. char  **
  756. BNGsplit(line)
  757. char   *line;
  758. {
  759. char  **ptr = split(line, ",");
  760. newsfeeds_t *nf1, *nf2;
  761. char   *n11, *n12, *n21, *n22;
  762. int     i, j;
  763. for (i = 0; ptr[i] != NULL; i++) {
  764. nf1 = (newsfeeds_t *) search_group(ptr[i]);
  765. for (j = i + 1; ptr[j] != NULL; j++) {
  766. if (strcmp(ptr[i], ptr[j]) == 0) {
  767. *ptr[j] = '';
  768. continue;
  769. }
  770. nf2 = (newsfeeds_t *) search_group(ptr[j]);
  771. if (nf1 && nf2) {
  772. if (strcmp(nf1->board, nf2->board) == 0) {
  773. *ptr[j] = '';
  774. continue;
  775. }
  776. for (n11 = nf1->board, n12 = (char *) strchr(n11, ',');
  777. n11 && *n11; n12 = (char *) strchr(n11, ',')) {
  778. if (n12)
  779. *n12 = '';
  780. for (n21 = nf2->board, n22 = (char *) strchr(n21, ',');
  781. n21 && *n21; n22 = (char *) strchr(n21, ',')) {
  782. if (n22)
  783. *n22 = '';
  784. if (strcmp(n11, n21) == 0) {
  785. *n21 = 't';
  786. }
  787. if (n22) {
  788. *n22 = ',';
  789. n21 = n22 + 1;
  790. } else
  791. break;
  792. }
  793. if (n12) {
  794. *n12 = ',';
  795. n11 = n12 + 1;
  796. } else
  797. break;
  798. }
  799. }
  800. }
  801. }
  802. return ptr;
  803. }
  804. char  **
  805. ssplit(line, pat)
  806. char   *line, *pat;
  807. {
  808. char   *p;
  809. int     i;
  810. for (i = 0; i < MAXTOK; ++i)
  811. Splitptr[i] = NULL;
  812. strncpy(splitbuf, line, 1024);
  813. for (i = 0, p = splitbuf; *p && i < MAXTOK;) {
  814. for (Splitptr[i++] = p; *p && !strchr(pat, *p); p++);
  815. if (*p == '')
  816. break;
  817. *p = 0;
  818. p++;
  819. /*    for (*p=''; strchr(pat,*p);p++);*/
  820. }
  821. return Splitptr;
  822. }
  823. char   *
  824. join(lineptr, pat, num)
  825. char  **lineptr, *pat;
  826. int     num;
  827. {
  828. int     i;
  829. joinbuf[0] = '';
  830. if (lineptr[0] != NULL)
  831. strncpy(joinbuf, lineptr[0], 1024);
  832. else {
  833. joinbuf[0] = '';
  834. return joinbuf;
  835. }
  836. for (i = 1; i < num; i++) {
  837. strcat(joinbuf, pat);
  838. if (lineptr[i] != NULL)
  839. strcat(joinbuf, lineptr[i]);
  840. else
  841. break;
  842. }
  843. return joinbuf;
  844. }
  845. char   *
  846. parselocaltime(date_buf)
  847. char   *date_buf;
  848. {
  849. static char buffer[40];
  850. char    week[30], mon[30], day[30], time[30], year[30];
  851. /* add null to prevent from long string */
  852. if (strlen(date_buf) > 30)
  853. date_buf[30] = '';
  854. sscanf(date_buf, "%s %s %s %s %s", week, mon, day, time, year);
  855. sprintf(buffer, "%.4s %.4s %.4s %.10s", day, mon, year, time);
  856. return buffer;
  857. }
  858. #ifdef BBSLIB
  859. main()
  860. {
  861. initial_bbs("feed");
  862. printf("%sn", ascii_date());
  863. }
  864. #endif