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

Telnet服务器

开发平台:

Unix_Linux

  1. #include "innbbsconf.h"
  2. #include "bbslib.h"
  3. extern char *optarg;
  4. extern int opterr, optind;
  5. usage(name)
  6. char   *name;
  7. {
  8. fprintf(stderr, "Usage: %s [-p path] commandsn", name);
  9. fprintf(stderr, " where available commands:n");
  10. fprintf(stderr, "  ctlinnbbsd reload   : reload datafiles for innbbsdn");
  11. fprintf(stderr, "  ctlinnbbsd shutdown : shutdown innbbsd gracefullyn");
  12. fprintf(stderr, "  ctlinnbbsd mode     : examine mode of innbbsdn");
  13. fprintf(stderr, "  ctlinnbbsd addhist <mid> path: add historyn");
  14. fprintf(stderr, "  ctlinnbbsd grephist <mid>: query historyn");
  15. fprintf(stderr, "  ctlinnbbsd verboselog on|off : verboselog on/offn");
  16. fprintf(stderr, "  ctlinnbbsd hismaint : maintain historyn");
  17. fprintf(stderr, "  ctlinnbbsd listnodelist  : list nodelist.bbsn");
  18. fprintf(stderr, "  ctlinnbbsd listnewsfeeds : list newsfeeds.bbsn");
  19. fprintf(stderr, "  ctlinnbbsd pause    : pause innbbsd servern");
  20. fprintf(stderr, "  ctlinnbbsd go       : resume innbbsd servern");
  21. #ifdef GETRUSAGE
  22. fprintf(stderr, "  ctlinnbbsd getrusage: get resource usagen");
  23. #endif
  24. #ifdef MALLOCMAP
  25. fprintf(stderr, "  ctlinnbbsd mallocmap: get malloc mapn");
  26. #endif
  27. }
  28. char   *DefaultPath = LOCALDAEMON;
  29. char    INNBBSbuffer[4096];
  30. FILE   *innbbsin, *innbbsout;
  31. int     innbbsfd;
  32. ctlinnbbsd(argc, argv)
  33. int     argc;
  34. char  **argv;
  35. {
  36. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  37. printf("%s", INNBBSbuffer);
  38. if (strcasecmp(argv[0], "shutdown") == 0 ||
  39. strcasecmp(argv[0], "reload") == 0 ||
  40. strcasecmp(argv[0], "hismaint") == 0 ||
  41. #ifdef GETRUSAGE
  42. strcasecmp(argv[0], "getrusage") == 0 ||
  43. #endif
  44. #ifdef MALLOCMAP
  45. strcasecmp(argv[0], "mallocmap") == 0 ||
  46. #endif
  47. strcasecmp(argv[0], "mode") == 0 ||
  48. strcasecmp(argv[0], "listnodelist") == 0 ||
  49. strcasecmp(argv[0], "listnewsfeeds") == 0 ||
  50. strcasecmp(argv[0], "pause") == 0 ||
  51. strcasecmp(argv[0], "go") == 0
  52. ) {
  53. fprintf(innbbsout, "%srn", argv[0]);
  54. fflush(innbbsout);
  55. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  56. printf("%s", INNBBSbuffer);
  57. if (strcasecmp(argv[0], "mode") == 0
  58. #ifdef GETRUSAGE
  59. ||
  60. strcasecmp(argv[0], "getrusage") == 0
  61. ||
  62. strcasecmp(argv[0], "mallocmap") == 0
  63. #endif
  64. ||
  65. strcasecmp(argv[0], "listnodelist") == 0
  66. ||
  67. strcasecmp(argv[0], "listnewsfeeds") == 0
  68. ) {
  69. while (fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin) != NULL) {
  70. if (strcmp(INNBBSbuffer, ".rn") == 0) {
  71. break;
  72. }
  73. printf("%s", INNBBSbuffer);
  74. }
  75. }
  76. } else if (strcasecmp(argv[0], "grephist") == 0 ||
  77. strcasecmp(argv[0], "verboselog") == 0) {
  78. if (argc < 2) {
  79. usage("ctlinnbbsd");
  80. } else {
  81. fprintf(innbbsout, "%s %srn", argv[0], argv[1]);
  82. fflush(innbbsout);
  83. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  84. printf("%sn", INNBBSbuffer);
  85. }
  86. } else if (strcasecmp(argv[0], "addhist") == 0) {
  87. if (argc < 3) {
  88. usage("ctlinnbbsd");
  89. } else {
  90. fprintf(innbbsout, "%s %s %srn", argv[0], argv[1], argv[2]);
  91. fflush(innbbsout);
  92. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  93. printf("%s", INNBBSbuffer);
  94. }
  95. } else {
  96. fprintf(stderr, "invalid command %sn", argv[0]);
  97. }
  98. if (strcasecmp(argv[0], "shutdown") != 0) {
  99. fprintf(innbbsout, "QUITrn");
  100. fflush(innbbsout);
  101. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  102. }
  103. }
  104. initsocket()
  105. {
  106. innbbsfd = unixclient(DefaultPath, "tcp");
  107. if (innbbsfd < 0) {
  108. fprintf(stderr, "Connect to %s error. You may not run innbbsdn", DefaultPath);
  109. exit(2);
  110. }
  111. if ((innbbsin = fdopen(innbbsfd, "r")) == NULL ||
  112. (innbbsout = fdopen(innbbsfd, "w")) == NULL) {
  113. fprintf(stderr, "fdopen errorn");
  114. exit(3);
  115. }
  116. }
  117. closesocket()
  118. {
  119. if (innbbsin != NULL)
  120. fclose(innbbsin);
  121. if (innbbsout != NULL)
  122. fclose(innbbsout);
  123. if (innbbsfd >= 0)
  124. close(innbbsfd);
  125. }
  126. main(argc, argv)
  127. int     argc;
  128. char  **argv;
  129. {
  130. int     c, errflag = 0;
  131. while ((c = getopt(argc, argv, "p:h?")) != -1)
  132. switch (c) {
  133. case 'p':
  134. DefaultPath = optarg;
  135. break;
  136. case 'h':
  137. case '?':
  138. default:
  139. errflag++;
  140. break;
  141. }
  142. if (errflag > 0) {
  143. usage(argv[0]);
  144. return (1);
  145. }
  146. if (argc - optind < 1) {
  147. usage(argv[0]);
  148. exit(1);
  149. }
  150. initial_bbs(NULL);
  151. initsocket();
  152. ctlinnbbsd(argc - optind, argv + optind);
  153. closesocket();
  154. }