int main(int argc, char *argv[]) { bool deamonMode = true; bool verboseMode = false; int httpdPort = 80; int ch; while ((ch = getopt(argc, argv, "fhvp:")) != -1) { switch (ch) { case 'v': { verboseMode = true; } break; case 'f': { deamonMode = false; } break; case 'p': { httpdPort = atoi(optarg); } break; case 'h': case '?': default: { usage(argv); exit(EXIT_SUCCESS); } } } argc -= optind; argv += optind; if (argc < 1) { usage((argv-optind)); return EXIT_FAILURE; } string roodDirectory = argv[0]; if (roodDirectory.at(roodDirectory.length()-1) == '/') { roodDirectory = roodDirectory.substr(0, roodDirectory.length()-1); } if (deamonMode) { int pid = fork(); if (pid < 0) exit(EXIT_FAILURE); if (0 < pid) exit(EXIT_SUCCESS); if (setsid() < 0) exit(EXIT_FAILURE); umask(0); close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); } FileServer fileServer; fileServer.setRootDirectory(roodDirectory); fileServer.setPort(httpdPort); if (fileServer.start() == false) { exit(EXIT_FAILURE); } sigset_t sigSet; if (sigfillset(&sigSet) != 0) exit(EXIT_FAILURE); bool isRunnging = true; while (isRunnging) { int sigNo; if (sigwait(&sigSet, &sigNo) != 0) break; switch (sigNo) { case SIGTERM: case SIGINT: case SIGKILL: { fileServer.stop(); isRunnging = false; } break; case SIGHUP: { if (fileServer.restart() == false) { exit(EXIT_FAILURE); } } break; } } return EXIT_SUCCESS; }