httpdc.c
上传用户:lampled
上传日期:2007-01-07
资源大小:94k
文件大小:5k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /* Copyright (C) 1995, 1996 by Sven Berkvens (sven@stack.nl) */
  2. #include "config.h"
  3. #include <sys/types.h>
  4. #include <signal.h>
  5. #include <unistd.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #ifdef HAVE_ERR_H
  9. #include <err.h>
  10. #else /* Not HAVE_ERR_H */
  11. #include "err.h"
  12. #endif /* HAVE_ERR_H */
  13. #include <errno.h>
  14. #include "string.h"
  15. #include "getopt.h"
  16. #include "httpd.h"
  17. #include "path.h"
  18. typedef struct
  19. {
  20. const char *command;
  21. VOID (*func)
  22. #ifndef NONEWSTYLE
  23. (const char *);
  24. #else /* Not NONEWSTYLE */
  25. ();
  26. #endif /* NONEWSTYLE */
  27. const char *help;
  28. } command;
  29. static pid_t httpdpid;
  30. static char startparams[BUFSIZ];
  31. char rootdir[XS_PATH_MAX];
  32. #ifndef NOFORWARDS
  33. static VOID cmd_help PROTO((const char *));
  34. static VOID cmd_status PROTO((const char *));
  35. static VOID cmd_kill PROTO((const char *));
  36. static VOID cmd_reload PROTO((const char *));
  37. static VOID cmd_restart PROTO((const char *));
  38. static VOID control PROTO((const char *));
  39. #endif /* NOFORWARDS */
  40. static command commands[]=
  41. {
  42. { "?", cmd_help, "Display this help text", },
  43. { "help", cmd_help, "Display this help text" },
  44. { "status", cmd_status, "Display httpd status" },
  45. { "kill", cmd_kill, "Terminate the httpd" },
  46. { "reload", cmd_reload, "Reload all httpd databases" },
  47. { "restart", cmd_restart, "Restart httpd with previous command lines arguments" },
  48. { "quit", NULL, "Quit the control program" },
  49. { "exit", NULL, "Quit the control program" },
  50. { NULL, NULL, NULL }
  51. };
  52. static VOID
  53. cmd_help DECL1C(char *, args)
  54. {
  55. command *search;
  56. search = commands;
  57. while (search->command)
  58. {
  59. printf("%stt%sn", search->command, search->help);
  60. search++;
  61. }
  62. }
  63. static VOID
  64. cmd_status DECL1C(char *, args)
  65. {
  66. if (kill(httpdpid, 0))
  67. {
  68. if (errno == ESRCH)
  69. printf("Main HTTPD does not seem to be runningn");
  70. else
  71. warn("kill()");
  72. } else
  73. printf("Main HTTPD seems to be runningn");
  74. if (killpg(httpdpid, 0))
  75. {
  76. if (errno == ESRCH)
  77. printf("HTTPD process group does not seem to be runningn");
  78. else
  79. warn("killpg()");
  80. } else
  81. printf("HTTPD process group seems to be runningn");
  82. printf("Main HTTPD PID: %ldn", (long)httpdpid);
  83. printf("Last used command line: %sn", startparams);
  84. }
  85. static VOID
  86. cmd_kill DECL1C(char *, args)
  87. {
  88. if (kill(httpdpid, SIGTERM))
  89. warn("kill");
  90. else
  91. printf("Main HTTPD killed, children will die too.n");
  92. }
  93. static VOID
  94. cmd_restart DECL1C(char *, args)
  95. {
  96. int timeout;
  97. if (kill(httpdpid, SIGTERM))
  98. warn("kill");
  99. printf("Main HTTPD killed, children will die automatically.n");
  100. printf("Waiting for children to die... ");
  101. timeout = 30;
  102. while (!killpg(httpdpid, 0) && (timeout > 0))
  103. {
  104. printf("%cb", (char)*("/-\|" + (timeout & 3)));
  105. fflush(stdout); sleep(1); timeout--;
  106. }
  107. if (!killpg(httpdpid, 0))
  108. {
  109. fprintf(stderr, "The children would not die within 30 seconds!n");
  110. return;
  111. }
  112. printf("Children are dead!n");
  113. printf("Restarting httpd... "); fflush(stdout);
  114. system(startparams);
  115. printf("Done!n");
  116. printf("Executed: %sn", startparams);
  117. }
  118. static VOID
  119. cmd_reload DECL1C(char *, args)
  120. {
  121. if (kill(httpdpid, SIGHUP))
  122. warn("kill()");
  123. else
  124. printf("Databases reloaded...n");
  125. }
  126. static VOID
  127. control DECL1C(char *, args)
  128. {
  129. char buffer[BUFSIZ], *space;
  130. command *search;
  131. strcpy(buffer, args);
  132. space = buffer;
  133. while (*space && (*space != 9) && (*space != ' '))
  134. space++;
  135. if (*space)
  136. {
  137. *(space++) = 0;
  138. while ((*space == 9) || (*space == ' '))
  139. space++;
  140. }
  141. search = commands;
  142. while (search->command)
  143. {
  144. if (!strcasecmp(search->command, buffer))
  145. {
  146. if (search->func)
  147. search->func(space);
  148. else
  149. exit(0);
  150. return;
  151. }
  152. search++;
  153. }
  154. fprintf(stderr, "Command `%s' not foundn", buffer);
  155. }
  156. static VOID
  157. loadpidfile DECL0
  158. {
  159. char buffer[BUFSIZ], pidname[XS_PATH_MAX];
  160. FILE *pidfile;
  161. strcpy(pidname, calcpath(PID_PATH));
  162. if ((pidfile = fopen(pidname, "r")))
  163. {
  164. if (!fgets(buffer, BUFSIZ, pidfile))
  165. errx(1, "PID line in `%s' is corruptn", pidname);
  166. else
  167. {
  168. httpdpid = (pid_t)atol(buffer);
  169. if (!fgets(startparams, BUFSIZ, pidfile))
  170. errx(1, "Arguments line in `%s' is corruptn",
  171. pidname);
  172. }
  173. } else
  174. err(1, "fopen(%s)", pidname);
  175. }
  176. extern int
  177. main DECL2(int, argc, char **, argv)
  178. {
  179. char buffer[BUFSIZ];
  180. int option;
  181. strcpy(rootdir, HTTPD_ROOT);
  182. while ((option = getopt(argc, argv, "d:")) != EOF)
  183. {
  184. switch(option)
  185. {
  186. case 'd':
  187. strcpy(rootdir, optarg);
  188. break;
  189. default:
  190. err(1, "Usage: %s [-d rootdir]", argv[0]);
  191. }
  192. }
  193. if (argc != optind)
  194. {
  195. loadpidfile();
  196. control(argv[optind]);
  197. exit(0);
  198. }
  199. while (1)
  200. {
  201. printf("httpdc> "); fflush(stdout);
  202. if (!fgets(buffer, BUFSIZ, stdin))
  203. break;
  204. while (buffer[0] && (buffer[strlen(buffer) - 1] <= ' '))
  205. buffer[strlen(buffer) - 1] = 0;
  206. if (!buffer[0])
  207. continue;
  208. loadpidfile();
  209. control(buffer);
  210. }
  211. fprintf(stderr, "End of input receivedn");
  212. exit(0);
  213. }