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

Telnet服务器

开发平台:

Unix_Linux

  1. #include "innbbsconf.h"
  2. #include "daemon.h"
  3. #include "innbbsd.h"
  4. #include <dirent.h>
  5. #include "bbslib.h"
  6. #include "inntobbs.h"
  7. #include "nntp.h"
  8. #ifdef GETRUSAGE
  9. #include <sys/time.h>
  10. #include <sys/resource.h>
  11. #endif
  12. #ifdef STDC
  13. #ifndef ARG
  14. #define ARG(x) (x)
  15. #else
  16. #define ARG(x) ()
  17. #endif
  18. #endif
  19. /*<  add <mid> <recno> ...
  20. >  200 OK
  21. <  quit
  22.  500 BYE
  23. >  300 DBZ Server ...
  24. <  query <mid>
  25. >  250 <recno> ...
  26. >  450 NOT FOUND!
  27. */
  28. static int CMDhelp ARG((ClientType *));
  29. static int CMDquit ARG((ClientType *));
  30. static int CMDihave ARG((ClientType *));
  31. static int CMDstat ARG((ClientType *));
  32. static int CMDaddhist ARG((ClientType *));
  33. static int CMDgrephist ARG((ClientType *));
  34. static int CMDmidcheck ARG((ClientType *));
  35. static int CMDshutdown ARG((ClientType *));
  36. static int CMDmode ARG((ClientType *));
  37. static int CMDreload ARG((ClientType *));
  38. static int CMDhismaint ARG((ClientType *));
  39. static int CMDverboselog ARG((ClientType *));
  40. static int CMDlistnodelist ARG((ClientType *));
  41. static int CMDlistnewsfeeds ARG((ClientType *));
  42. static int CMDpause ARG((ClientType *));
  43. static int CMDgo ARG((ClientType *));
  44. #ifdef GETRUSAGE
  45. static int CMDgetrusage ARG((ClientType *));
  46. static int CMDmallocmap ARG((ClientType *));
  47. #endif
  48. static daemoncmd_t cmds[] =
  49. /*  cmd-name, cmd-usage, min-argc, max-argc, errorcode, normalcode, cmd-func */
  50. {{"help", "help [cmd]", 1, 2, 99, 100, CMDhelp},
  51. {"quit", "quit", 1, 0, 99, 100, CMDquit},
  52. #ifndef DBZSERVER
  53. {"ihave", "ihave mid", 2, 2, 435, 335, CMDihave},
  54. #endif
  55. {"stat", "stat mid", 2, 2, 223, 430, CMDstat},
  56. {"addhist", "addhist <mid> <path>", 3, 3, NNTP_ADDHIST_BAD, NNTP_ADDHIST_OK, CMDaddhist},
  57. {"grephist", "grephist <mid>", 2, 2, NNTP_GREPHIST_BAD, NNTP_GREPHIST_OK, CMDgrephist},
  58. {"midcheck", "midcheck [on|off]", 1, 2, NNTP_MIDCHECK_BAD, NNTP_MIDCHECK_OK, CMDmidcheck},
  59. {"shutdown", "shutdown (local)", 1, 1, NNTP_SHUTDOWN_BAD, NNTP_SHUTDOWN_OK, CMDshutdown},
  60. {"mode", "mode (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDmode},
  61. {"listnodelist", "listnodelist (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDlistnodelist},
  62. {"listnewsfeeds", "listnewsfeeds (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDlistnewsfeeds},
  63. {"reload", "reload (local)", 1, 1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDreload},
  64. {"pause", "pause (local)", 1, 1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDpause},
  65. {"go", "go (local)", 1, 1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDgo},
  66. {"hismaint", "hismaint (local)", 1, 1, NNTP_RELOAD_BAD, NNTP_RELOAD_OK, CMDhismaint},
  67. {"verboselog", "verboselog [on|off](local)", 1, 2, NNTP_VERBOSELOG_BAD, NNTP_VERBOSELOG_OK, CMDverboselog},
  68. #ifdef GETRUSAGE
  69. {"getrusage", "getrusage (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDgetrusage},
  70. #endif
  71. #ifdef MALLOCMAP
  72. {"mallocmap", "mallocmap (local)", 1, 1, NNTP_MODE_BAD, NNTP_MODE_OK, CMDmallocmap},
  73. #endif
  74. {NULL, NULL, 0, 0, 99, 100, NULL}
  75. };
  76. installinnbbsd()
  77. {
  78. installdaemon(cmds, 100, NULL);
  79. }
  80. #ifdef OLDLIBINBBSINND
  81. testandmkdir(dir)
  82. char   *dir;
  83. {
  84. if (!isdir(dir)) {
  85. char    path[MAXPATHLEN + 12];
  86. sprintf(path, "mkdir -p %s", dir);
  87. system(path);
  88. }
  89. }
  90. static char splitbuf[2048];
  91. static char joinbuf[1024];
  92. #define MAXTOK 50
  93. static char *Splitptr[MAXTOK];
  94. char  **
  95. split(line, pat)
  96. char   *line, *pat;
  97. {
  98. char   *p;
  99. int     i;
  100. for (i = 0; i < MAXTOK; ++i)
  101. Splitptr[i] = NULL;
  102. strncpy(splitbuf, line, sizeof splitbuf - 1);
  103. /* printf("%d %dn",strlen(line),strlen(splitbuf)); */
  104. splitbuf[sizeof splitbuf - 1] = '';
  105. for (i = 0, p = splitbuf; *p && i < MAXTOK - 1;) {
  106. for (Splitptr[i++] = p; *p && !strchr(pat, *p); p++);
  107. if (*p == '')
  108. break;
  109. for (*p++ = ''; *p && strchr(pat, *p); p++);
  110. }
  111. return Splitptr;
  112. }
  113. char  **
  114. BNGsplit(line)
  115. char   *line;
  116. {
  117. char  **ptr = split(line, ",");
  118. newsfeeds_t *nf1, *nf2;
  119. char   *n11, *n12, *n21, *n22;
  120. int     i, j;
  121. for (i = 0; ptr[i] != NULL; i++) {
  122. nf1 = (newsfeeds_t *) search_group(ptr[i]);
  123. for (j = i + 1; ptr[j] != NULL; j++) {
  124. if (strcmp(ptr[i], ptr[j]) == 0) {
  125. *ptr[j] = '';
  126. continue;
  127. }
  128. nf2 = (newsfeeds_t *) search_group(ptr[j]);
  129. if (nf1 && nf2) {
  130. if (strcmp(nf1->board, nf2->board) == 0) {
  131. *ptr[j] = '';
  132. continue;
  133. }
  134. for (n11 = nf1->board, n12 = (char *) strchr(n11, ',');
  135. n11 && *n11; n12 = (char *) strchr(n11, ',')) {
  136. if (n12)
  137. *n12 = '';
  138. for (n21 = nf2->board, n22 = (char *) strchr(n21, ',');
  139. n21 && *n21; n22 = (char *) strchr(n21, ',')) {
  140. if (n22)
  141. *n22 = '';
  142. if (strcmp(n11, n21) == 0) {
  143. *n21 = 't';
  144. }
  145. if (n22) {
  146. *n22 = ',';
  147. n21 = n22 + 1;
  148. } else
  149. break;
  150. }
  151. if (n12) {
  152. *n12 = ',';
  153. n11 = n12 + 1;
  154. } else
  155. break;
  156. }
  157. }
  158. }
  159. }
  160. return ptr;
  161. }
  162. char  **
  163. ssplit(line, pat)
  164. char   *line, *pat;
  165. {
  166. char   *p;
  167. int     i;
  168. for (i = 0; i < MAXTOK; ++i)
  169. Splitptr[i] = NULL;
  170. strncpy(splitbuf, line, 1024);
  171. for (i = 0, p = splitbuf; *p && i < MAXTOK;) {
  172. for (Splitptr[i++] = p; *p && !strchr(pat, *p); p++);
  173. if (*p == '')
  174. break;
  175. *p = 0;
  176. p++;
  177. /*    for (*p=''; strchr(pat,*p);p++);*/
  178. }
  179. return Splitptr;
  180. }
  181. char   *
  182. join(lineptr, pat, num)
  183. char  **lineptr, *pat;
  184. int     num;
  185. {
  186. int     i;
  187. joinbuf[0] = '';
  188. if (lineptr[0] != NULL)
  189. strncpy(joinbuf, lineptr[0], 1024);
  190. else {
  191. joinbuf[0] = '';
  192. return joinbuf;
  193. }
  194. for (i = 1; i < num; i++) {
  195. strcat(joinbuf, pat);
  196. if (lineptr[i] != NULL)
  197. strcat(joinbuf, lineptr[i]);
  198. else
  199. break;
  200. }
  201. return joinbuf;
  202. }
  203. #endif
  204. static int 
  205. CMDtnrpd(client)
  206. ClientType *client;
  207. {
  208. argv_t *argv = &client->Argv;
  209. fprintf(argv->out, "%d %sn", argv->dc->usage);
  210. return 0;
  211. }
  212. islocalconnect(client)
  213. ClientType *client;
  214. {
  215. if (strcmp(client->username, "localuser") != 0 ||
  216. strcmp(client->hostname, "localhost") != 0)
  217. return 0;
  218. return 1;
  219. }
  220. static  shutdownflag = 0;
  221. INNBBSDhalt()
  222. {
  223. shutdownflag = 1;
  224. }
  225. int 
  226. INNBBSDshutdown()
  227. {
  228. return shutdownflag;
  229. }
  230. static int 
  231. CMDshutdown(client)
  232. ClientType *client;
  233. {
  234. argv_t *argv = &client->Argv;
  235. buffer_t *in = &client->in;
  236. daemoncmd_t *p = argv->dc;
  237. if (!islocalconnect(client)) {
  238. fprintf(argv->out, "%d shutdown access deniedrn", p->errorcode);
  239. fflush(argv->out);
  240. verboselog("Shutdown Put: %d shutdown access deniedn", p->errorcode);
  241. return 1;
  242. }
  243. shutdownflag = 1;
  244. fprintf(argv->out, "%d shutdown startingrn", p->normalcode);
  245. fflush(argv->out);
  246. verboselog("Shutdown Put: %d shutdown startingn", p->normalcode);
  247. return 1;
  248. }
  249. static int 
  250. CMDmode(client)
  251. ClientType *client;
  252. {
  253. /* char cwdpath[MAXPATHLEN+1]; */
  254. argv_t *argv = &client->Argv;
  255. extern ClientType INNBBSD_STAT;
  256. buffer_t *in = &client->in;
  257. daemoncmd_t *p = argv->dc;
  258. time_t  uptime, now;
  259. int     i, j;
  260. time_t  lasthist;
  261. ClientType *client1 = &INNBBSD_STAT;
  262. if (!islocalconnect(client)) {
  263. fprintf(argv->out, "%d mode access deniedrn", p->errorcode);
  264. fflush(argv->out);
  265. verboselog("Mode Put: %d mode access deniedn", p->errorcode);
  266. return 1;
  267. }
  268. fprintf(argv->out, "%d modern", p->normalcode);
  269. fflush(argv->out);
  270. verboselog("Mode Put: %d moden", p->normalcode);
  271. uptime = innbbsdstartup();
  272. time(&now);
  273. fprintf(argv->out, "up since %salive %.2f daysrn", ctime(&uptime), (double) (now - innbbsdstartup()) / 86400);
  274. fprintf(argv->out, "BBSHOME %srn", BBSHOME);
  275. fprintf(argv->out, "MYBBSID %srn", MYBBSID);
  276. fprintf(argv->out, "ECHOMAIL %srn", ECHOMAIL);
  277. fprintf(argv->out, "INNDHOME %srn", INNDHOME);
  278. fprintf(argv->out, "HISTORY %srn", HISTORY);
  279. fprintf(argv->out, "LOGFILE %srn", LOGFILE);
  280. fprintf(argv->out, "INNBBSCONF %srn", INNBBSCONF);
  281. fprintf(argv->out, "BBSFEEDS %srn", BBSFEEDS);
  282. fprintf(argv->out, "Verbose log: %srn", isverboselog() ? "ON" : "OFF");
  283. fprintf(argv->out, "History Expire Days %drn", Expiredays);
  284. fprintf(argv->out, "History Expire Time %d:%drn", His_Maint_Hour, His_Maint_Min);
  285. lasthist = gethisinfo();
  286. if (lasthist > 0) {
  287. time_t  keep = lasthist, keep1;
  288. time(&now);
  289. fprintf(argv->out, "Oldest history entry created: %s", (char *) ctime(&keep));
  290. keep = Expiredays * 86400 * 2 + lasthist;
  291. keep1 = keep - now;
  292. fprintf(argv->out, "Next time to maintain history: (%.2f days later) %s", (double) keep1 / 86400, (char *) ctime(&keep));
  293. }
  294. fprintf(argv->out, "PID is %drn", getpid());
  295. fprintf(argv->out, "LOCAL ONLY %drn", LOCALNODELIST);
  296. fprintf(argv->out, "NONE NEWSFEEDS %drn", NONENEWSFEEDS);
  297. fprintf(argv->out, "Max connections %drn", Maxclient);
  298. #ifdef DEBUGCWD
  299. getwd(cwdpath);
  300. fprintf(argv->out, "Working directory %srn", cwdpath);
  301. #endif
  302. if (Channel)
  303. for (i = 0, j = 0; i < Maxclient; ++i) {
  304. if (Channel[i].fd == -1)
  305. continue;
  306. if (Channel + i == client)
  307. continue;
  308. j++;
  309. fprintf(argv->out, " %d) in->used %d, in->left %d %s@%srn", i,
  310. Channel[i].in.used, Channel[i].in.left,
  311. Channel[i].username, Channel[i].hostname);
  312. }
  313. fprintf(argv->out, "Total connections %drn", j);
  314. fprintf(argv->out, "Total rec: %d dup: %d fail: %d size: %d, stat rec: %d fail: %dn", client1->ihavecount, client1->ihaveduplicate, client1->ihavefail, client1->ihavesize, client1->statcount, client1->statfail);
  315. fprintf(argv->out, ".rn");
  316. fflush(argv->out);
  317. return 1;
  318. }
  319. static int
  320. CMDlistnodelist(client)
  321. ClientType *client;
  322. {
  323. int     nlcount;
  324. argv_t *argv = &client->Argv;
  325. buffer_t *in = &client->in;
  326. daemoncmd_t *p = argv->dc;
  327. if (!islocalconnect(client)) {
  328. fprintf(argv->out, "%d listnodelist access deniedrn", p->errorcode);
  329. fflush(argv->out);
  330. verboselog("Mallocmap Put: %d listnodelist access deniedn", p->errorcode);
  331. return 1;
  332. }
  333. fprintf(argv->out, "%d listnodelistrn", p->normalcode);
  334. for (nlcount = 0; nlcount < NLCOUNT; nlcount++) {
  335. nodelist_t *nl = NODELIST + nlcount;
  336. fprintf(argv->out, "%2d %s /\/\ %srn", nlcount + 1, nl->node == NULL ? "" : nl->node, nl->exclusion == NULL ? "" : nl->exclusion);
  337. fprintf(argv->out, "   %s:%s:%srn", nl->host == NULL ? "" : nl->host, nl->protocol == NULL ? "" : nl->protocol, nl->comments == NULL ? "" : nl->comments);
  338. }
  339. fprintf(argv->out, ".rn");
  340. fflush(argv->out);
  341. verboselog("Listnodelist Put: %d listnodelist completen", p->normalcode);
  342. return 1;
  343. }
  344. static int
  345. CMDlistnewsfeeds(client)
  346. ClientType *client;
  347. {
  348. argv_t *argv = &client->Argv;
  349. buffer_t *in = &client->in;
  350. daemoncmd_t *p = argv->dc;
  351. int     nfcount;
  352. if (!islocalconnect(client)) {
  353. fprintf(argv->out, "%d listnewsfeeds access deniedrn", p->errorcode);
  354. fflush(argv->out);
  355. verboselog("Mallocmap Put: %d listnewsfeeds access deniedn", p->errorcode);
  356. return 1;
  357. }
  358. fprintf(argv->out, "%d listnewsfeedsrn", p->normalcode);
  359. for (nfcount = 0; nfcount < NFCOUNT; nfcount++) {
  360. newsfeeds_t *nf = NEWSFEEDS + nfcount;
  361. fprintf(argv->out, "%3d %s<=>%srn", nfcount + 1, nf->newsgroups, nf->board);
  362. fprintf(argv->out, "    %srn", nf->path == NULL ? "(Null)" : nf->path);
  363. }
  364. fprintf(argv->out, ".rn");
  365. fflush(argv->out);
  366. verboselog("Listnewsfeeds Put: %d listnewsfeeds completen", p->normalcode);
  367. return 1;
  368. }
  369. #ifdef MALLOCMAP
  370. static int 
  371. CMDmallocmap(client)
  372. ClientType *client;
  373. {
  374. argv_t *argv = &client->Argv;
  375. buffer_t *in = &client->in;
  376. daemoncmd_t *p = argv->dc;
  377. struct rusage ru;
  378. int     savefd;
  379. if (!islocalconnect(client)) {
  380. fprintf(argv->out, "%d mallocmap access deniedrn", p->errorcode);
  381. fflush(argv->out);
  382. verboselog("Mallocmap Put: %d mallocmap access deniedn", p->errorcode);
  383. return 1;
  384. }
  385. fprintf(argv->out, "%d mallocmaprn", p->normalcode);
  386. savefd = dup(1);
  387. dup2(client->fd, 1);
  388. mallocmap();
  389. dup2(savefd, 1);
  390. close(savefd);
  391. fprintf(argv->out, ".rn");
  392. fflush(argv->out);
  393. verboselog("Mallocmap Put: %d mallocmap completen", p->normalcode);
  394. return 1;
  395. }
  396. #endif
  397. #ifdef GETRUSAGE
  398. static int 
  399. CMDgetrusage(client)
  400. ClientType *client;
  401. {
  402. argv_t *argv = &client->Argv;
  403. buffer_t *in = &client->in;
  404. daemoncmd_t *p = argv->dc;
  405. struct rusage ru;
  406. if (!islocalconnect(client)) {
  407. fprintf(argv->out, "%d getrusage access deniedrn", p->errorcode);
  408. fflush(argv->out);
  409. verboselog("Getrusage Put: %d getrusage access deniedn", p->errorcode);
  410. return 1;
  411. }
  412. fprintf(argv->out, "%d getrusagern", p->normalcode);
  413. if (getrusage(RUSAGE_SELF, &ru) == 0) {
  414. fprintf(argv->out, "user time used: %.6frn", (double) ru.ru_utime.tv_sec + (double) ru.ru_utime.tv_usec / 1000000.0);
  415. fprintf(argv->out, "system time used: %.6frn", (double) ru.ru_stime.tv_sec + (double) ru.ru_stime.tv_usec / 1000000.0);
  416. fprintf(argv->out, "maximum resident set size: %lurn", ru.ru_maxrss * getpagesize());
  417. fprintf(argv->out, "integral resident set size: %lurn", ru.ru_idrss * getpagesize());
  418. fprintf(argv->out, "page faults not requiring physical I/O: %drn", ru.ru_minflt);
  419. fprintf(argv->out, "page faults requiring physical I/O: %drn", ru.ru_majflt);
  420. fprintf(argv->out, "swaps: %drn", ru.ru_nswap);
  421. fprintf(argv->out, "block input operations: %drn", ru.ru_inblock);
  422. fprintf(argv->out, "block output operations: %drn", ru.ru_oublock);
  423. fprintf(argv->out, "messages sent: %drn", ru.ru_msgsnd);
  424. fprintf(argv->out, "messages received: %drn", ru.ru_msgrcv);
  425. fprintf(argv->out, "signals received: %drn", ru.ru_nsignals);
  426. fprintf(argv->out, "voluntary context switches: %drn", ru.ru_nvcsw);
  427. fprintf(argv->out, "involuntary context switches: %drn", ru.ru_nivcsw);
  428. }
  429. fprintf(argv->out, ".rn");
  430. fflush(argv->out);
  431. verboselog("Getrusage Put: %d getrusage completen", p->normalcode);
  432. return 1;
  433. }
  434. #endif
  435. static int 
  436. CMDhismaint(client)
  437. ClientType *client;
  438. {
  439. argv_t *argv = &client->Argv;
  440. buffer_t *in = &client->in;
  441. daemoncmd_t *p = argv->dc;
  442. if (!islocalconnect(client)) {
  443. fprintf(argv->out, "%d hismaint access deniedrn", p->errorcode);
  444. fflush(argv->out);
  445. verboselog("Hismaint Put: %d hismaint access deniedn", p->errorcode);
  446. return 1;
  447. }
  448. verboselog("Hismaint Put: %d hismaint startn", p->normalcode);
  449. HISmaint();
  450. fprintf(argv->out, "%d hismaint completern", p->normalcode);
  451. fflush(argv->out);
  452. verboselog("Hismaint Put: %d hismaint completen", p->normalcode);
  453. return 1;
  454. }
  455. static int INNBBSDpause = 0;
  456. static int 
  457. CMDgo(client)
  458. ClientType *client;
  459. {
  460. argv_t *argv = &client->Argv;
  461. buffer_t *in = &client->in;
  462. daemoncmd_t *p = argv->dc;
  463. if (!islocalconnect(client)) {
  464. fprintf(argv->out, "%d go access deniedrn", p->errorcode);
  465. fflush(argv->out);
  466. verboselog("Pause Put: %d go access deniedn", p->errorcode);
  467. return 1;
  468. }
  469. INNBBSDpause = 0;
  470. fprintf(argv->out, "%d go completern", p->normalcode);
  471. fflush(argv->out);
  472. verboselog("Pause Put: %d go completen", p->normalcode);
  473. return 1;
  474. }
  475. int
  476. isPause()
  477. {
  478. return INNBBSDpause;
  479. }
  480. static int 
  481. CMDpause(client)
  482. ClientType *client;
  483. {
  484. argv_t *argv = &client->Argv;
  485. buffer_t *in = &client->in;
  486. daemoncmd_t *p = argv->dc;
  487. if (!islocalconnect(client)) {
  488. fprintf(argv->out, "%d pause access deniedrn", p->errorcode);
  489. fflush(argv->out);
  490. verboselog("Pause Put: %d pause access deniedn", p->errorcode);
  491. return 1;
  492. }
  493. INNBBSDpause = 1;
  494. fprintf(argv->out, "%d pause completern", p->normalcode);
  495. fflush(argv->out);
  496. verboselog("Pause Put: %d pause completen", p->normalcode);
  497. return 1;
  498. }
  499. static int 
  500. CMDreload(client)
  501. ClientType *client;
  502. {
  503. argv_t *argv = &client->Argv;
  504. buffer_t *in = &client->in;
  505. daemoncmd_t *p = argv->dc;
  506. if (!islocalconnect(client)) {
  507. fprintf(argv->out, "%d reload access deniedrn", p->errorcode);
  508. fflush(argv->out);
  509. verboselog("Reload Put: %d reload access deniedn", p->errorcode);
  510. return 1;
  511. }
  512. initial_bbs("feed");
  513. fprintf(argv->out, "%d reload completern", p->normalcode);
  514. fflush(argv->out);
  515. verboselog("Reload Put: %d reload completen", p->normalcode);
  516. return 1;
  517. }
  518. static int 
  519. CMDverboselog(client)
  520. ClientType *client;
  521. {
  522. argv_t *argv = &client->Argv;
  523. buffer_t *in = &client->in;
  524. daemoncmd_t *p = argv->dc;
  525. if (!islocalconnect(client)) {
  526. fprintf(argv->out, "%d verboselog access deniedrn", p->errorcode);
  527. fflush(argv->out);
  528. verboselog("Reload Put: %d verboselog access deniedn", p->errorcode);
  529. return 1;
  530. }
  531. if (client->mode == 0) {
  532. if (argv->argc > 1) {
  533. if (strcasecmp(argv->argv[1], "off") == 0) {
  534. setverboseoff();
  535. } else {
  536. setverboseon();
  537. }
  538. }
  539. }
  540. fprintf(argv->out, "%d verboselog %srn", p->normalcode,
  541. isverboselog() ? "ON" : "OFF");
  542. fflush(argv->out);
  543. verboselog("%d verboselog %srn", p->normalcode,
  544. isverboselog() ? "ON" : "OFF");
  545. }
  546. static int 
  547. CMDmidcheck(client)
  548. ClientType *client;
  549. {
  550. argv_t *argv = &client->Argv;
  551. buffer_t *in = &client->in;
  552. daemoncmd_t *p = argv->dc;
  553. if (client->mode == 0) {
  554. if (argv->argc > 1) {
  555. if (strcasecmp(argv->argv[1], "off") == 0) {
  556. client->midcheck = 0;
  557. } else {
  558. client->midcheck = 1;
  559. }
  560. }
  561. }
  562. fprintf(argv->out, "%d mid check %srn", p->normalcode,
  563. client->midcheck == 1 ? "ON" : "OFF");
  564. fflush(argv->out);
  565. verboselog("%d mid check %srn", p->normalcode,
  566. client->midcheck == 1 ? "ON" : "OFF");
  567. }
  568. static int 
  569. CMDgrephist(client)
  570. ClientType *client;
  571. {
  572. argv_t *argv = &client->Argv;
  573. buffer_t *in = &client->in;
  574. daemoncmd_t *p = argv->dc;
  575. if (client->mode == 0) {
  576. if (argv->argc > 1) {
  577. char   *ptr;
  578. ptr = (char *) DBfetch(argv->argv[1]);
  579. if (ptr != NULL) {
  580. fprintf(argv->out, "%d %s OKrn", p->normalcode, ptr);
  581. fflush(argv->out);
  582. verboselog("Addhist Put: %d %s OKn", p->normalcode, ptr);
  583. return 0;
  584. } else {
  585. fprintf(argv->out, "%d %s not foundrn", p->errorcode, argv->argv[1]);
  586. fflush(argv->out);
  587. verboselog("Addhist Put: %d %s not foundn", p->errorcode, argv->argv[1]);
  588. return 1;
  589. }
  590. }
  591. }
  592. fprintf(argv->out, "%d grephist errorrn", p->errorcode);
  593. fflush(argv->out);
  594. verboselog("Addhist Put: %d grephist errorn", p->errorcode);
  595. return 1;
  596. }
  597. static int 
  598. CMDaddhist(client)
  599. ClientType *client;
  600. {
  601. argv_t *argv = &client->Argv;
  602. buffer_t *in = &client->in;
  603. daemoncmd_t *p = argv->dc;
  604. /*
  605.  * if (strcmp(client->username,"localuser") != 0 ||
  606.  * strcmp(client->hostname,"localhost") != 0) { fprintf(argv->out,"%d
  607.  * add hist access deniedrn", p->errorcode); fflush(argv->out);
  608.  * verboselog("Addhist Put: %d add hist access deniedn",
  609.  * p->errorcode); return 1; }
  610.  */
  611. if (client->mode == 0) {
  612. if (argv->argc > 2) {
  613. char   *ptr;
  614. ptr = (char *) DBfetch(argv->argv[1]);
  615. if (ptr == NULL) {
  616. if (storeDB(argv->argv[1], argv->argv[2]) < 0) {
  617. fprintf(argv->out, "%d add hist store DB errorrn", p->errorcode);
  618. fflush(argv->out);
  619. verboselog("Addhist Put: %d add hist store DB errorn", p->errorcode);
  620. return 1;
  621. } else {
  622. fprintf(argv->out, "%d add hist OKrn", p->normalcode);
  623. fflush(argv->out);
  624. verboselog("Addhist Put: %d add hist OKn", p->normalcode);
  625. return 0;
  626. }
  627. } else {
  628. fprintf(argv->out, "%d add hist duplicate errorrn", p->errorcode);
  629. fflush(argv->out);
  630. verboselog("Addhist Put: %d add hist duplicate errorn", p->errorcode);
  631. return 1;
  632. }
  633. }
  634. }
  635. fprintf(argv->out, "%d add hist errorrn", p->errorcode);
  636. fflush(argv->out);
  637. verboselog("Addhist Put: %d add hist errorn", p->errorcode);
  638. return 1;
  639. }
  640. static int 
  641. CMDstat(client)
  642. ClientType *client;
  643. {
  644. argv_t *argv = &client->Argv;
  645. char   *ptr, *frontptr;
  646. buffer_t *in = &client->in;
  647. daemoncmd_t *p;
  648. if (client->mode == 0) {
  649. client->statcount++;
  650. if (argv->argc > 1) {
  651. if (argv->argv[1][0] != '<') {
  652. fprintf(argv->out, "430 No such articlern");
  653. fflush(argv->out);
  654. verboselog("Stat Put: 430 No such articlen");
  655. client->statfail++;
  656. return 0;
  657. }
  658. ptr = (char *) DBfetch(argv->argv[1]);
  659. if (ptr != NULL) {
  660. fprintf(argv->out, "223 0 status %srn", argv->argv[1]);
  661. fflush(argv->out);
  662. client->mode = 0;
  663. verboselog("Stat Put: 223 0 status %sn", argv->argv[1]);
  664. return 1;
  665. } else {
  666. fprintf(argv->out, "430 No such articlern");
  667. fflush(argv->out);
  668. verboselog("Stat Put: 430 No such articlen");
  669. client->mode = 0;
  670. client->statfail++;
  671. }
  672. }
  673. }
  674. }
  675. #ifndef DBZSERVER
  676. static int 
  677. CMDihave(client)
  678. ClientType *client;
  679. {
  680. argv_t *argv = &client->Argv;
  681. char   *ptr = NULL, *frontptr;
  682. buffer_t *in = &client->in;
  683. daemoncmd_t *p;
  684. if (client->mode == 0) {
  685. client->ihavecount++;
  686. if (argv->argc > 1) {
  687. if (argv->argv[1][0] != '<') {
  688. fprintf(argv->out, "435 Bad Message-IDrn");
  689. fflush(argv->out);
  690. verboselog("Ihave Put: 435 Bad Message-IDn");
  691. client->ihavefail++;
  692. return 0;
  693. }
  694. if (client->midcheck == 1)
  695. ptr = (char *) DBfetch(argv->argv[1]);
  696. if (ptr != NULL && client->midcheck == 1) {
  697. fprintf(argv->out, "435 Duplicatern");
  698. fflush(argv->out);
  699. client->mode = 0;
  700. verboselog("Ihave Put: 435 Duplicaten");
  701. client->ihaveduplicate++;
  702. client->ihavefail++;
  703. return 1;
  704. } else {
  705. fprintf(argv->out, "335rn");
  706. fflush(argv->out);
  707. client->mode = 1;
  708. verboselog("Ihave Put: 335n");
  709. }
  710. }
  711. } else {
  712. client->mode = 0;
  713. readlines(client);
  714. if (HEADER[SUBJECT_H] && HEADER[FROM_H] && HEADER[DATE_H] &&
  715. HEADER[MID_H] && HEADER[NEWSGROUPS_H]) {
  716. char   *path1, *path2;
  717. int     rel;
  718. rel = 0;
  719. path1 = (char *) mymalloc(strlen(HEADER[PATH_H]) + 3);
  720. path2 = (char *) mymalloc(strlen(MYBBSID) + 3);
  721. sprintf(path1, "!%s!", HEADER[PATH_H]);
  722. sprintf(path2, "!%s!", MYBBSID);
  723. if (HEADER[CONTROL_H]) {
  724. bbslog("Control: %sn", HEADER[CONTROL_H]);
  725. if (strncasecmp(HEADER[CONTROL_H], "cancel ", 7) == 0) {
  726. rel = cancel_article_front(HEADER[CONTROL_H] + 7);
  727. } else {
  728. rel = receive_control();
  729. }
  730. } else if ((char *) strstr(path1, path2) != NULL) {
  731. bbslog(":Warn: Loop back article: %s!%sn", MYBBSID, HEADER[PATH_H]);
  732. } else {
  733. rel = receive_article();
  734. }
  735. free(path1);
  736. free(path2);
  737. if (rel == -1) {
  738. fprintf(argv->out, "400 server side failedrn");
  739. fflush(argv->out);
  740. verboselog("Ihave Put: 400n");
  741. clearfdset(client->fd);
  742. fclose(client->Argv.in);
  743. fclose(client->Argv.out);
  744. close(client->fd);
  745. client->fd = -1;
  746. client->mode = 0;
  747. client->ihavefail++;
  748. return;
  749. } else {
  750. fprintf(argv->out, "235rn");
  751. verboselog("Ihave Put: 235n");
  752. }
  753. fflush(argv->out);
  754. } else if (!HEADER[PATH_H]) {
  755. fprintf(argv->out, "437 No Path in "ihave %s" headerrn", HEADER[MID_H]);
  756. fflush(argv->out);
  757. verboselog("Put: 437 No Path in "ihave %s" headern", HEADER[MID_H]);
  758. client->ihavefail++;
  759. } else {
  760. fprintf(argv->out, "437 No colon-space in "ihave %s" headerrn", HEADER[MID_H]);
  761. fflush(argv->out);
  762. verboselog("Ihave Put: 437 No colon-space in "ihave %s" headern", HEADER[MID_H]);
  763. client->ihavefail++;
  764. }
  765. #ifdef DEBUG
  766. printf("subject is %sn", HEADER[SUBJECT_H]);
  767. printf("from is %sn", HEADER[FROM_H]);
  768. printf("Date is %sn", HEADER[DATE_H]);
  769. printf("Newsgroups is %sn", HEADER[NEWSGROUPS_H]);
  770. printf("mid is %sn", HEADER[MID_H]);
  771. printf("path is %sn", HEADER[PATH_H]);
  772. #endif
  773. }
  774. fflush(argv->out);
  775. return 0;
  776. }
  777. #endif
  778. static int 
  779. CMDhelp(client)
  780. ClientType *client;
  781. {
  782. argv_t *argv = &client->Argv;
  783. daemoncmd_t *p;
  784. if (argv->argc >= 1) {
  785. fprintf(argv->out, "%d Available Commandsrn", argv->dc->normalcode);
  786. for (p = cmds; p->name != NULL; p++) {
  787. fprintf(argv->out, "  %srn", p->usage);
  788. }
  789. fprintf(argv->out, "Report problems to %srn", ADMINUSER);
  790. }
  791. fputs(".rn", argv->out);
  792. fflush(argv->out);
  793. client->mode = 0;
  794. return 0;
  795. }
  796. static int 
  797. CMDquit(client)
  798. ClientType *client;
  799. {
  800. argv_t *argv = &client->Argv;
  801. fprintf(argv->out, "205 quitrn");
  802. fflush(argv->out);
  803. verboselog("Quit Put: 205 quitn");
  804. clearfdset(client->fd);
  805. fclose(client->Argv.in);
  806. fclose(client->Argv.out);
  807. close(client->fd);
  808. client->fd = -1;
  809. client->mode = 0;
  810. channeldestroy(client);
  811. /* exit(0); */
  812. }