void parse_parameters(int argc, char **argv) { int c; while ((c = getopt (argc, argv, "Dep:b:s:d:o:l:B:u:w:")) != -1) switch (c) { case 'D': DAEMON = 1; break; case 'e': snprintf(symbols, sizeof symbols, "%s", "abcdefghijklmnopqrstuvwxyz0123456789-+_=.ABCDEFGHIJKLMNOPQRSTUVWXYZ"); break; case 'd': snprintf(DOMAIN, sizeof DOMAIN, "%s%s%s", "http://", optarg, "/"); break; case 'p': PORT = atoi(optarg); break; case 'B': BUFSIZE = atoi(optarg); break; case 'b': BANFILE = optarg; load_list(BANFILE, 0); break; case 's': SLUG_SIZE = atoi(optarg); break; case 'o': BASEDIR = optarg; break; case 'l': LOG = optarg; break; case 'u': set_uid_gid(optarg); break; case 'w': WHITEFILE = optarg; load_list(WHITEFILE, 1); break; default: printf("usage: fiche [-pbsdolBuw].\n"); printf(" [-d domain] [-p port] [-s slug_size]\n"); printf(" [-o output directory] [-B buffer_size] [-u user name]\n"); printf(" [-l log file] [-b banlist] [-w whitelist]\n"); exit(1); } }
void process_commandline(int argc, char **argv, SMSD_Parameters * params) { int opt; #ifdef HAVE_GETOPT_LONG struct option long_options[] = { {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {"config", 1, 0, 'c'}, {"daemon", 0, 0, 'd'}, {"pid", 1, 0, 'p'}, {"install-service", 0, 0, 'i'}, {"uninstall-service", 0, 0, 'u'}, {"start-service", 0, 0, 's'}, {"stop-service", 0, 0, 'k'}, {"run-as-service", 0, 0, 'S'}, {"user", 1, 0, 'U'}, {"group", 1, 0, 'G'}, {"service-name", 1, 0, 'n'}, {"suicide", 1, 0, 'X'}, {"max-failures", 1, 0, 'f'}, {"use-log", 0, 0, 'l'}, {"no-use-log", 0, 0, 'L'}, {"install-event-log", 0, 0, 'e'}, {"uninstall-event-log", 0, 0, 'E'}, {0, 0, 0, 0} }; int option_index; while ((opt = getopt_long(argc, argv, "hvdc:p:iusSkU:G:n:X:f:lLeE", long_options, &option_index)) != -1) { #elif defined(HAVE_GETOPT) while ((opt = getopt(argc, argv, "hvdc:p:iusSkU:G:n:X:f:lLeE")) != -1) { #else /* Poor mans getopt replacement */ int i; #define optarg argv[++i] for (i = 1; i < argc; i++) { if (strlen(argv[i]) != 2 || argv[i][0] != '-') { wrong_params(); } opt = argv[i][1]; #endif switch (opt) { case 'c': params->config_file = optarg; break; #ifdef HAVE_PIDFILE case 'p': params->pid_file = optarg; break; #endif #ifdef HAVE_UID case 'U': if (!fill_uid(params, optarg)) { fprintf(stderr, "Wrong user name/ID!\n"); exit(1); } break; case 'G': if (!fill_gid(params, optarg)) { fprintf(stderr, "Wrong group name/ID!\n"); exit(1); } break; #endif case 'f': params->max_failures = atoi(optarg); break; #ifdef HAVE_ALARM case 'X': alarm(atoi(optarg)); break; #endif #ifdef HAVE_DAEMON case 'd': params->daemonize = TRUE; break; #endif #ifdef HAVE_WINDOWS_EVENT_LOG case 'e': params->install_evlog = TRUE; break; case 'E': params->uninstall_evlog = TRUE; break; #endif #ifdef HAVE_WINDOWS_SERVICE case 'i': params->install_service = TRUE; break; case 'u': params->uninstall_service = TRUE; break; case 's': params->start_service = TRUE; break; case 'k': params->stop_service = TRUE; break; case 'S': params->run_service = TRUE; break; case 'n': strncpy(smsd_service_name, optarg, SERVICE_NAME_LENGTH); smsd_service_name[SERVICE_NAME_LENGTH - 1] = 0; break; #endif case 'v': version(); break; case 'l': params->use_log = TRUE; break; case 'L': params->use_log = FALSE; break; case '?': wrong_params(); case 'h': help(); exit(0); default: wrong_params(); break; } } #if defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG) if (optind < argc) { wrong_params(); } #endif } void configure_daemon(SMSD_Parameters * params) { signal(SIGINT, smsd_interrupt); signal(SIGTERM, smsd_interrupt); #ifdef HAVE_SIGHUP signal(SIGHUP, smsd_reconfigure); #endif #ifdef HAVE_ALARM signal(SIGALRM, smsd_interrupt); #endif #if defined(HAVE_SIGUSR1) && defined(HAVE_SIGUSR2) signal(SIGUSR1, smsd_standby); signal(SIGUSR2, smsd_resume); #endif #ifdef HAVE_DAEMON /* Daemonize has to be before writing PID as it changes it */ if (params->daemonize) { if (daemon(1, 0) != 0) { fprintf(stderr, "daemonizing failed! (%s)\n", strerror(errno)); exit(1); } } #endif #ifdef HAVE_PIDFILE /* Writing PID file has to happen before dropping privileges */ if (params->pid_file != NULL && strlen(params->pid_file) > 0) { check_pid(params->pid_file); write_pid(params->pid_file); } #endif #ifdef HAVE_UID if (params->gid != -1 || params->uid != -1) { if (!set_uid_gid(params)) { fprintf(stderr, "changing uid/gid failed! (%s)\n", strerror(errno)); exit(1); } } #endif #ifdef HAVE_WINDOWS_SERVICE if (params->run_service) { if (!start_smsd_service_dispatcher()) { printf("Error starting %s service\n", smsd_service_name); service_print_error("Error running service"); exit(1); } SMSD_FreeConfig(config); exit(0); } #endif } int main(int argc, char **argv) { GSM_Error error; const char program_name[] = "gammu-smsd"; SMSD_Parameters params = { NULL, NULL, -1, -1, NULL, NULL, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, 0 }; /* * We don't need gettext, but need to set locales so that * charset conversion works. */ GSM_InitLocales(NULL); process_commandline(argc, argv, ¶ms); #ifdef HAVE_WINDOWS_SERVICE if (params.stop_service) { if (stop_smsd_service()) { printf("Service %s stopped sucessfully\n", smsd_service_name); exit(0); } else { printf("Error stopping %s service\n", smsd_service_name); service_print_error("Error stopping service"); exit(1); } } if (params.uninstall_service) { if (uninstall_smsd_service()) { printf("Service %s uninstalled sucessfully\n", smsd_service_name); exit(0); } else { printf("Error uninstalling %s service\n", smsd_service_name); service_print_error("Error uninstalling service"); exit(1); } } #endif #ifdef HAVE_WINDOWS_EVENT_LOG if (params.install_evlog) { if (eventlog_register()) { printf("Installed event log description\n"); exit(0); } else { printf("Failed to install event log description!\n"); exit(1); } } if (params.uninstall_evlog) { if (eventlog_deregister()) { printf("Uninstalled event log description\n"); exit(0); } else { printf("Failed to uninstall event log description!\n"); exit(1); } } #endif if (params.config_file == NULL) { #ifdef HAVE_DEFAULT_CONFIG params.config_file = default_config; #else fprintf(stderr, "No config file specified!\n"); help(); exit(1); #endif } #ifdef HAVE_WINDOWS_SERVICE if (params.install_service) { if (install_smsd_service(¶ms)) { printf("Service %s installed sucessfully\n", smsd_service_name); exit(0); } else { printf("Error installing %s service\n", smsd_service_name); service_print_error("Error installing service"); exit(1); } } if (params.start_service) { if (start_smsd_service()) { printf("Service %s started sucessfully\n", smsd_service_name); exit(0); } else { printf("Error starting %s service\n", smsd_service_name); service_print_error("Error starting service"); exit(1); } } #endif read_config: config = SMSD_NewConfig(program_name); assert(config != NULL); error = SMSD_ReadConfig(params.config_file, config, params.use_log); if (error != ERR_NONE) { printf("Failed to read config: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 2; } if (!reconfigure) configure_daemon(¶ms); reconfigure = FALSE; standby = FALSE; error = SMSD_MainLoop(config, FALSE, params.max_failures); if (error != ERR_NONE) { printf("Failed to run SMSD: %s\n", GSM_ErrorString(error)); SMSD_FreeConfig(config); return 2; } SMSD_FreeConfig(config); /* * Wait while we should be suspended. * Later we fall back to reconfigure bellow. */ while (standby) { sleep(1); } if (reconfigure) { goto read_config; } return 0; }