int main(int argc, char **argv) { char *config_path[4] = {NULL, NULL, NULL, NULL}; int num_config = 2, ch; /* syslog as early as possible */ HGD_INIT_SYSLOG(); #ifdef HAVE_LIBCONFIG config_path[0] = NULL; xasprintf(&config_path[1], "%s", HGD_GLOBAL_CFG_DIR HGD_SERV_CFG); config_path[2] = hgd_get_XDG_userprefs_location(hgdc); #endif hgd_register_sig_handlers(); state_path = xstrdup(HGD_DFL_DIR); DPRINTF(HGD_D_DEBUG, "Parsing options:1"); while ((ch = getopt(argc, argv, "c:d:hvx:" "c:x:")) != -1) { switch (ch) { case 'c': if (num_config < 3) { num_config++; DPRINTF(HGD_D_DEBUG, "added config %d %s", num_config, optarg); config_path[num_config] = optarg; } else { DPRINTF(HGD_D_WARN, "Too many config files specified"); hgd_exit_nicely(); } break; case 'x': hgd_debug = atoi(optarg); if (hgd_debug > 3) hgd_debug = 3; DPRINTF(HGD_D_DEBUG, "set debug level to %d", hgd_debug); break; default: break; /* next getopt will catch errors */ }; } hgd_read_config(config_path + num_config); while(num_config > 0) { if (config_path[num_config] != NULL) { free (config_path[num_config]); config_path[num_config] = NULL; } num_config--; } RESET_GETOPT(); DPRINTF(HGD_D_DEBUG, "Parsing options:2"); while ((ch = getopt(argc, argv, "c:d:hvx:" "c:x:")) != -1) { switch (ch) { case 'c': break; /* already handled */ case 'd': free(state_path); state_path = xstrdup(optarg); DPRINTF(HGD_D_DEBUG, "set hgd dir to '%s'", state_path); break; case 'v': hgd_print_version(); exit_ok = 1; hgd_exit_nicely(); break; case 'x': DPRINTF(HGD_D_DEBUG, "set debug to %d", atoi(optarg)); hgd_debug = atoi(optarg); if (hgd_debug > 3) hgd_debug = 3; break; /* already set but over-rideable */ case 'h': default: hgd_usage(); exit_ok = 1; hgd_exit_nicely(); break; }; } argc -= optind; argv += optind; xasprintf(&db_path, "%s/%s", state_path, HGD_DB_NAME); xasprintf(&filestore_path, "%s/%s", state_path, HGD_FILESTORE_NAME); umask(~S_IRWXU); hgd_mk_state_dir(); if (hgd_parse_command(argc, argv) == -1) hgd_exit_nicely(); exit_ok = 1; hgd_exit_nicely(); _exit (EXIT_SUCCESS); /* NOREACH */ }
int main(int argc, char **argv) { char *xdg_config_home; char *config_path[4] = {NULL, NULL, NULL, NULL}; int num_config = 2, ch; /* as early as possible */ HGD_INIT_SYSLOG_DAEMON(); config_path[0] = NULL; xasprintf(&config_path[1], "%s", HGD_GLOBAL_CFG_DIR HGD_SERV_CFG ); xdg_config_home = getenv("XDG_CONFIG_HOME"); if (xdg_config_home == NULL) { xasprintf(&config_path[2], "%s%s", getenv("HOME"), HGD_USR_CFG_DIR HGD_SERV_CFG ); } else { xasprintf(&config_path[2], "%s%s", xdg_config_home , "/hgd" HGD_SERV_CFG); } /* if killed, die nicely */ hgd_register_sig_handlers(); state_path = xstrdup(HGD_DFL_DIR); ssl_key_path = xstrdup(HGD_DFL_KEY_FILE); ssl_cert_path = xstrdup(HGD_DFL_CERT_FILE); DPRINTF(HGD_D_DEBUG, "Parsing options:1"); while ((ch = getopt(argc, argv, "Bc:Dd:EefF:hk:n:p:s:S:vx:y:")) != -1) { switch (ch) { case 'c': if (num_config < 3) { num_config++; DPRINTF(HGD_D_DEBUG, "added config %d %s", num_config, optarg); config_path[num_config] = optarg; } else { DPRINTF(HGD_D_WARN, "Too many config files specified"); hgd_exit_nicely(); } break; case 'x': hgd_debug = atoi(optarg); if (hgd_debug > 3) hgd_debug = 3; DPRINTF(HGD_D_DEBUG, "set debug to %d", hgd_debug); break; default: break; /* next getopt will catch errors */ } } RESET_GETOPT(); /* cache HUP info */ if (hgd_cache_exec_context(argv) != HGD_OK) hgd_exit_nicely(); hgd_read_config(config_path + num_config); DPRINTF(HGD_D_DEBUG, "Parsing options:2"); while ((ch = getopt(argc, argv, "Bc:Dd:EefF:hk:n:p:s:S:vx:y:")) != -1) { switch (ch) { case 'B': background = 0; DPRINTF(HGD_D_DEBUG, "Not \"backgrounding\" daemon."); break; case 'c': break; /* already handled */ case 'D': DPRINTF(HGD_D_DEBUG, "No client DNS lookups"); lookup_client_dns = 0; break; case 'd': free(state_path); state_path = xstrdup(optarg); DPRINTF(HGD_D_DEBUG, "Set hgd dir to '%s'", state_path); break; case 'e': crypto_pref = HGD_CRYPTO_PREF_ALWAYS; DPRINTF(HGD_D_DEBUG, "Server will insist on crypto"); break; case 'E': crypto_pref = HGD_CRYPTO_PREF_NEVER; DPRINTF(HGD_D_WARN, "Encryption disabled manually"); break; case 'f': single_client = 1; DPRINTF(HGD_D_DEBUG, "Single client debug mode on"); break; case 'F': flood_limit = atoi(optarg); DPRINTF(HGD_D_DEBUG, "Set flood limit to %d", flood_limit); break; case 'k': free(ssl_key_path); ssl_key_path = optarg; DPRINTF(HGD_D_DEBUG, "set ssl private key path to '%s'", ssl_key_path); break; case 'n': req_votes = atoi(optarg); DPRINTF(HGD_D_DEBUG, "Set required-votes to %d", req_votes); break; case 'p': port = atoi(optarg); DPRINTF(HGD_D_DEBUG, "Set port to %d", port); break; case 's': /* XXX overflow? */ max_upload_size = atoi(optarg) * HGD_MB; DPRINTF(HGD_D_DEBUG, "Set max upload size to %d", (int) max_upload_size); break; case 'S': free(ssl_cert_path); ssl_cert_path = optarg; DPRINTF(HGD_D_DEBUG, "set ssl cert path to '%s'", ssl_cert_path); break; case 'v': hgd_print_version(); exit_ok = 1; hgd_exit_nicely(); break; case 'x': DPRINTF(HGD_D_DEBUG, "set debug to %d", atoi(optarg)); hgd_debug = atoi(optarg); if (hgd_debug > 3) hgd_debug = 3; break; /* already set but over-rideable */ case 'y': free(vote_sound); vote_sound = optarg; DPRINTF(HGD_D_DEBUG, "set voteoff sound %s", vote_sound); break; case 'h': default: hgd_usage(); exit_ok = 1; hgd_exit_nicely(); break; }; } argc -= optind; argv += optind; /* set up paths */ xasprintf(&db_path, "%s/%s", state_path, HGD_DB_NAME); xasprintf(&filestore_path, "%s/%s", state_path, HGD_FILESTORE_NAME); umask(~S_IRWXU); hgd_mk_state_dir(); db = hgd_open_db(db_path, 0); if (db == NULL) hgd_exit_nicely(); sqlite3_close(db); /* re-opened later */ db = NULL; /* unless the user actively disables SSL, we try to be capable */ if (crypto_pref != HGD_CRYPTO_PREF_NEVER) { if (hgd_setup_ssl_ctx(&method, &ctx, 1, ssl_cert_path, ssl_key_path) == 0) { DPRINTF(HGD_D_INFO, "Server is SSL capable"); ssl_capable = 1; } else { DPRINTF(HGD_D_WARN, "Server is SSL incapable"); } } else { DPRINTF(HGD_D_INFO, "Server was forced SSL incapable"); } /* if -e, but something screwed up in the above, bail */ if ((crypto_pref == HGD_CRYPTO_PREF_ALWAYS) && (ssl_capable != 1)) { DPRINTF(HGD_D_ERROR, "Crypto was forced on, but server is incapable"); hgd_exit_nicely(); } /* alright, everything looks good, lets be a daemon and background */ if (background) hgd_daemonise(); hgd_listen_loop(); exit_ok = 1; hgd_exit_nicely(); return (EXIT_SUCCESS); /* NOREACH */ }
int main(int argc, char **argv) { char *config_path[4] = {NULL, NULL, NULL, NULL}; int num_config = 2, ch; FILE *hgd_pid; /* early as possible */ hgd_register_sig_handlers(); HGD_INIT_SYSLOG_DAEMON(); #ifdef HAVE_LIBCONFIG config_path[0] = NULL; xasprintf(&config_path[1], "%s", HGD_GLOBAL_CFG_DIR HGD_SERV_CFG); config_path[2] = hgd_get_XDG_userprefs_location(playd); #endif state_path = xstrdup(HGD_DFL_DIR); DPRINTF(HGD_D_DEBUG, "Parsing options:1"); while ((ch = getopt(argc, argv, "Bc:Cd:hpP:qvx:")) != -1) { switch (ch) { case 'c': if (num_config < 3) { num_config++; DPRINTF(HGD_D_DEBUG, "added config %d %s", num_config, optarg); config_path[num_config] = optarg; } else { DPRINTF(HGD_D_WARN, "Too many config files specified"); hgd_exit_nicely(); } break; case 'x': hgd_debug = atoi(optarg); if (hgd_debug > 3) hgd_debug = 3; DPRINTF(HGD_D_DEBUG, "set debug level to %d", hgd_debug); break; default: break; /* catch badness in next getopt */ }; } hgd_read_config(config_path + num_config); while(num_config > 0) { if (config_path[num_config] != NULL) { free (config_path[num_config]); config_path[num_config] = NULL; } num_config--; } RESET_GETOPT(); if (hgd_cache_exec_context(argv) != HGD_OK) hgd_exit_nicely(); DPRINTF(HGD_D_DEBUG, "Parsing options"); while ((ch = getopt(argc, argv, "Bc:Cd:hpP:qvx:")) != -1) { switch (ch) { case 'B': background = 0; DPRINTF(HGD_D_DEBUG, "Not \"backgrounding\" daemon."); break; case 'c': break; /* already handled */ case 'C': clear_playlist_on_start = 1; DPRINTF(HGD_D_DEBUG, "will clear playlist '%s'", state_path); break; case 'd': free(state_path); state_path = xstrdup(optarg); DPRINTF(HGD_D_DEBUG, "set hgd dir to '%s'", state_path); break; case 'p': DPRINTF(HGD_D_DEBUG, "No purging from fs"); purge_finished_fs = 0; break; #ifdef HAVE_PYTHON case 'P': DPRINTF(HGD_D_DEBUG, "Setting python plugin dir"); if (hgd_py_plugin_dir != NULL) free(hgd_py_plugin_dir); hgd_py_plugin_dir = xstrdup(optarg); break; #endif case 'q': DPRINTF(HGD_D_DEBUG, "No purging from db"); purge_finished_db = 0; break; case 'v': hgd_print_version(); exit_ok = 1; hgd_exit_nicely(); break; case 'x': DPRINTF(HGD_D_DEBUG, "set debug to %d", atoi(optarg)); hgd_debug = atoi(optarg); if (hgd_debug > 3) hgd_debug = 3; break; /* already set but over-rideable */ case 'h': default: hgd_usage(); exit_ok = 1; hgd_exit_nicely(); break; }; } argc -= optind; argv += optind; xasprintf(&db_path, "%s/%s", state_path, HGD_DB_NAME); xasprintf(&filestore_path, "%s/%s", state_path, HGD_FILESTORE_NAME); xasprintf(&mplayer_fifo_path, "%s/%s", state_path, HGD_MPLAYER_PIPE_NAME); umask(~S_IRWXU); hgd_mk_state_dir(); if (hgd_check_mplayer_present() != HGD_OK) hgd_exit_nicely(); db = hgd_open_db(db_path, 0); if (db == NULL) hgd_exit_nicely(); if (hgd_init_playstate() != HGD_OK) hgd_exit_nicely(); if (clear_playlist_on_start) { if (hgd_clear_playlist() != HGD_OK) hgd_exit_nicely(); } if (hgd_open_pid_file(&hgd_pid) != HGD_OK) { DPRINTF(HGD_D_ERROR, "Can't open PID file"); return (HGD_FAIL); } /* start */ if (background) hgd_daemonise(); /* do the Python dance */ #ifdef HAVE_PYTHON if (hgd_embed_py(1) != HGD_OK) { DPRINTF(HGD_D_ERROR, "Failed to initialise Python"); hgd_exit_nicely(); } #endif if (hgd_write_pid_file(&hgd_pid) != HGD_OK) { DPRINTF(HGD_D_ERROR, "Can't write PID away"); return (HGD_FAIL); } if (hgd_play_loop() == HGD_OK) exit_ok = 1; if (hgd_unlink_pid_file() != HGD_OK) DPRINTF(HGD_D_ERROR, "Could not unlink pidfile"); hgd_exit_nicely(); _exit (EXIT_SUCCESS); /* NOREACH */ }