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

Telnet服务器

开发平台:

Unix_Linux

  1. #include "daemon.h"
  2. /*
  3. typedef struct daemoncmd {
  4. char *cmdname;
  5. char *usage;
  6. int argc;
  7. int (*main) ARG((FILE*,FILE*,int,char**,char*));
  8. } daemoncmd_t;
  9. */
  10. void deargify ARG((char ***));
  11. static daemoncmd_t *dcmdp = NULL;
  12. static char *startupmessage = NULL;
  13. static int startupcode = 100;
  14. static FILE *DIN, *DOUT, *DIO;
  15. typedef int (*F) ();
  16. void 
  17. installdaemon(cmds, code, startupmsg)
  18. daemoncmd_t *cmds;
  19. int     code;
  20. char   *startupmsg;
  21. {
  22. dcmdp = cmds;
  23. startupcode = code;
  24. startupmessage = startupmsg;
  25. }
  26. daemoncmd_t *
  27. searchcmd(cmd)
  28. char   *cmd;
  29. {
  30. daemoncmd_t *p;
  31. for (p = dcmdp; p->name != NULL; p++) {
  32. #ifdef DEBUGCMD
  33. printf("searching name %s for cmd %sn", p->name, cmd);
  34. #endif
  35. if (!strncasecmp(p->name, cmd, 1024))
  36. return p;
  37. }
  38. return NULL;
  39. }
  40. int 
  41. daemon(dfd)
  42. int     dfd;
  43. {
  44. static char BUF[1024];
  45. /* hash_init(); */
  46. if (dfd > 0) {
  47. DIO = fdopen(dfd, "rw");
  48. DIN = fdopen(dfd, "r");
  49. DOUT = fdopen(dfd, "w");
  50. if (DIO == NULL || DIN == NULL || DOUT == NULL) {
  51. perror("fdopen");
  52. return -1;
  53. }
  54. }
  55. if (startupmessage) {
  56. fprintf(DOUT, "%d %sn", startupcode, startupmessage);
  57. fflush(DOUT);
  58. }
  59. while (fgets(BUF, 1024, DIN) != NULL) {
  60. int     i;
  61. int     (*Main) ();
  62. daemoncmd_t *dp;
  63. argv_t  Argv;
  64. char   *p = (char *) strchr(BUF, 'r');
  65. if (p == NULL)
  66. p = (char *) strchr(BUF, 'n');
  67. if (p == NULL)
  68. continue;
  69. *p = '';
  70. if (p == BUF)
  71. continue;
  72. Argv.argc = 0, Argv.argv = NULL, Argv.inputline = BUF;
  73. Argv.in = DIN, Argv.out = DOUT;
  74. printf("command entered: %sn", BUF);
  75. #ifdef DEBUGSERVER
  76. fprintf(DOUT, "BUF in client %sn", BUF);
  77. fprintf(stdout, "BUF in server %sn", BUF);
  78. fflush(DOUT);
  79. #endif
  80. Argv.argc = argify(BUF, &Argv.argv);
  81. #ifdef DEBUGSERVER
  82. fprintf(stdout, "argc %d argv ", Argv.argc);
  83. for (i = 0; i < Argv.argc; ++i)
  84. fprintf(stdout, "%s ", Argv.argv[i]);
  85. fprintf(stdout, "n");
  86. #endif
  87. dp = searchcmd(Argv.argv[0]);
  88. Argv.dc = dp;
  89. if (dp) {
  90. #ifdef DEBUGSERVER
  91. printf("find cmd %s by %sn", dp->name, dp->usage);
  92. #endif
  93. if (Argv.argc < dp->argc) {
  94. fprintf(DOUT, "%d Usage: %sn", dp->errorcode, dp->usage);
  95. fflush(DOUT);
  96. goto cont;
  97. }
  98. if (dp->argno != 0 && Argv.argc > dp->argno) {
  99. fprintf(DOUT, "%d Usage: %sn", dp->errorcode, dp->usage);
  100. fflush(DOUT);
  101. goto cont;
  102. }
  103. Main = dp->main;
  104. if (Main) {
  105. fflush(stdout);
  106. (*Main) (&Argv);
  107. }
  108. } else {
  109. fprintf(DOUT, "99 command %s not availablen", Argv.argv[0]);
  110. fflush(DOUT);
  111. }
  112. cont:
  113. deargify(&Argv.argv);
  114. }
  115. /* hash_reclaim(); */
  116. }
  117. #define MAX_ARG 32
  118. #define MAX_ARG_SIZE 16384
  119. int 
  120. argify(line, argvp)
  121. char   *line, ***argvp;
  122. {
  123. static char *argvbuffer[MAX_ARG + 2];
  124. char  **argv = argvbuffer;
  125. int     i;
  126. static char argifybuffer[MAX_ARG_SIZE];
  127. char   *p;
  128. while (strchr("tnr ", *line))
  129. line++;
  130. i = strlen(line);
  131. /* p=(char*) mymalloc(i+1); */
  132. p = argifybuffer;
  133. strncpy(p, line, sizeof argifybuffer);
  134. for (*argvp = argv, i = 0; *p && i < MAX_ARG;) {
  135. for (*argv++ = p; *p && !strchr("trn ", *p); p++);
  136. if (*p == '')
  137. break;
  138. for (*p++ = ''; strchr("trn ", *p) && *p; p++);
  139. }
  140. *argv = NULL;
  141. return argv - *argvp;
  142. }
  143. void 
  144. deargify(argv)
  145. char ***argv;
  146. {
  147. return;
  148. /*
  149.  * if (*argv != NULL) { if (*argv[0] != NULL){ free(*argv[0]);
  150.  * argv[0] = NULL; } free(*argv); argv = NULL; }
  151.  */
  152. }
  153. int 
  154. daemonprintf(format)
  155. char   *format;
  156. {
  157. fprintf(DOUT, format);
  158. fflush(DOUT);
  159. }
  160. int 
  161. daemonputs(output)
  162. char   *output;
  163. {
  164. fputs(output, DOUT);
  165. fflush(DOUT);
  166. }