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