standalone.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (c) 2004-2005 Sergey Lyubka <valenok@gmail.com>
  3. * All rights reserved
  4. *
  5. * "THE BEER-WARE LICENSE" (Revision 42):
  6. * Sergey Lyubka wrote this file. As long as you retain this notice you
  7. * can do whatever you want with this stuff. If we meet some day, and you think
  8. * this stuff is worth it, you can buy me a beer in return.
  9. */
  10. #include "defs.h"
  11. static int exit_flag; /* Program termination flag */
  12. static void
  13. signal_handler(int sig_num)
  14. {
  15. switch (sig_num) {
  16. #ifndef _WIN32
  17. case SIGCHLD:
  18. while (waitpid(-1, &sig_num, WNOHANG) > 0) ;
  19. break;
  20. #endif /* !_WIN32 */
  21. default:
  22. exit_flag = sig_num;
  23. break;
  24. }
  25. }
  26. int
  27. main(int argc, char *argv[])
  28. {
  29. struct shttpd_ctx *ctx;
  30. #if !defined(NO_AUTH)
  31. if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'A') {
  32. if (argc != 6)
  33. _shttpd_usage(argv[0]);
  34. exit(_shttpd_edit_passwords(argv[2],argv[3],argv[4],argv[5]));
  35. }
  36. #endif /* NO_AUTH */
  37. if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")))
  38. _shttpd_usage(argv[0]);
  39. #if defined(_WIN32)
  40. try_to_run_as_nt_service();
  41. #endif /* _WIN32 */
  42. #ifndef _WIN32
  43. (void) signal(SIGCHLD, signal_handler);
  44. (void) signal(SIGPIPE, SIG_IGN);
  45. #endif /* _WIN32 */
  46. (void) signal(SIGTERM, signal_handler);
  47. (void) signal(SIGINT, signal_handler);
  48. if ((ctx = shttpd_init(argc, argv)) == NULL)
  49. _shttpd_elog(E_FATAL, NULL, "%s",
  50. "Cannot initialize SHTTPD context");
  51. _shttpd_elog(E_LOG, NULL, "shttpd %s started on port(s) %s, serving %s",
  52. VERSION, ctx->options[OPT_PORTS], ctx->options[OPT_ROOT]);
  53. while (exit_flag == 0)
  54. shttpd_poll(ctx, 10 * 1000);
  55. _shttpd_elog(E_LOG, NULL, "Exit on signal %d", exit_flag);
  56. shttpd_fini(ctx);
  57. return (EXIT_SUCCESS);
  58. }