static void init(void) { int i; double bpm; double decay; int samp_rate; int min_burst; int burst_increase; int min_gain; int gain_increase; int detune; config_init(&cfg); if(!config_read_file(&cfg, CONFIG_FILE)) { fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg), config_error_line(&cfg), config_error_text(&cfg)); config_destroy(&cfg); exit(EXIT_FAILURE); } if(!config_lookup_float(&cfg, "bpm", &bpm)) config_die("bpm"); if(!config_lookup_float(&cfg, "subdiv", &subdiv)) config_die("subdiv"); if(!config_lookup_int(&cfg, "samp_rate", &samp_rate)) config_die("samp_rate"); if(!config_lookup_int(&cfg, "min_burst", &min_burst)) config_die("min_burst"); if(!config_lookup_int(&cfg, "burst_increase", &burst_increase)) config_die("burst_increase"); if(!config_lookup_float(&cfg, "decay", &decay)) config_die("decay"); if(!config_lookup_int(&cfg, "min_gain", &min_gain)) config_die("min_gain"); if(!config_lookup_int(&cfg, "gain_increase", &gain_increase)) config_die("gain_increase"); if(!config_lookup_int(&cfg, "detune", &detune)) config_die("detune"); note_length = (float)samp_rate * 60 * subdiv / bpm; system_init(); agent_count = system_get_agent_count(); synths = calloc(agent_count, sizeof(Synth *)); for(i = 0; i < agent_count; i ++) { float pan = ((float)i / 20) * ((i % 2) * 2 - 1) + .5; synths[i] = synth_create(samp_rate, min_burst + i * burst_increase, decay, pan, min_gain + gain_increase * i, detune); } }
int config_file_parse (char *file, stud_config *cfg) { if (cfg == NULL) config_die("Undefined stud options; THIS IS A BUG!\n"); char line[CONFIG_BUF_SIZE]; FILE *fd = NULL; // should we read stdin? if (file == NULL || strlen(file) < 1 || strcmp(file, "-") == 0) { fd = stdin; } else { fd = fopen(file, "r"); } if (fd == NULL) config_die("Unable to open configuration file '%s': %s\n", file, strerror(errno)); // read config int i = 0; while (i < CONFIG_MAX_LINES) { memset(line, '\0', sizeof(line)); if (fgets(line, (sizeof(line) - 1), fd) == NULL) break; i++; // get configuration key char *key, *val; key = config_get_param(line); if (key == NULL) continue; // get configuration key value... val = config_get_value(line); if (val == NULL) continue; str_trim(val); // printf("File '%s', line %d, key: '%s', value: '%s'\n", file, i, key, val); // validate configuration key => value config_param_validate(key, val, cfg, file, i); } fclose(fd); return 1; }
void config_param_validate (char *k, char *v, stud_config *cfg, char *file, int line) { int r = 1; struct stat st; if (strcmp(k, "tls") == 0) { cfg->ETYPE = ENC_TLS; } else if (strcmp(k, "ssl") == 0) { cfg->ETYPE = ENC_SSL; } else if (strcmp(k, CFG_CIPHERS) == 0) { if (v != NULL && strlen(v) > 0) { config_assign_str(&cfg->CIPHER_SUITE, v); } } else if (strcmp(k, CFG_SSL_ENGINE) == 0) { if (v != NULL && strlen(v) > 0) { config_assign_str(&cfg->ENGINE, v); } } else if (strcmp(k, CFG_PREFER_SERVER_CIPHERS) == 0) { r = config_param_val_bool(v, &cfg->PREFER_SERVER_CIPHERS); } else if (strcmp(k, CFG_FRONTEND) == 0) { r = config_param_host_port_wildcard(v, &cfg->FRONT_IP, &cfg->FRONT_PORT, 1); } else if (strcmp(k, CFG_BACKEND) == 0) { r = config_param_host_port(v, &cfg->BACK_IP, &cfg->BACK_PORT); } else if (strcmp(k, CFG_WORKERS) == 0) { r = config_param_val_intl_pos(v, &cfg->NCORES); } else if (strcmp(k, CFG_BACKLOG) == 0) { r = config_param_val_int(v, &cfg->BACKLOG); if (r && cfg->BACKLOG < -1) cfg->BACKLOG = -1; } else if (strcmp(k, CFG_KEEPALIVE) == 0) { r = config_param_val_int_pos(v, &cfg->TCP_KEEPALIVE_TIME); } #ifdef USE_SHARED_CACHE else if (strcmp(k, CFG_SHARED_CACHE) == 0) { r = config_param_val_int(v, &cfg->SHARED_CACHE); } else if (strcmp(k, CFG_SHARED_CACHE_LISTEN) == 0) { if (v != NULL && strlen(v) > 0) r = config_param_host_port_wildcard(v, &cfg->SHCUPD_IP, &cfg->SHCUPD_PORT, 1); } else if (strcmp(k, CFG_SHARED_CACHE_PEER) == 0) { r = config_param_shcupd_peer(v, cfg); } else if (strcmp(k, CFG_SHARED_CACHE_MCASTIF) == 0) { r = config_param_shcupd_mcastif(v, &cfg->SHCUPD_MCASTIF, &cfg->SHCUPD_MCASTTTL); } #endif else if (strcmp(k, CFG_CHROOT) == 0) { if (v != NULL && strlen(v) > 0) { // check directory if (stat(v, &st) != 0) { config_error_set("Unable to stat directory '%s': %s'.", v, strerror(errno)); r = 0; } else { if (! S_ISDIR(st.st_mode)) { config_error_set("Bad chroot directory '%s': Not a directory.", v, strerror(errno)); r = 0; } else { config_assign_str(&cfg->CHROOT, v); } } } } else if (strcmp(k, CFG_USER) == 0) { if (v != NULL && strlen(v) > 0) { struct passwd *passwd; passwd = getpwnam(v); if (!passwd) { config_error_set("Invalid user '%s'.", v); r = 0; } else { cfg->UID = passwd->pw_uid; cfg->GID = passwd->pw_gid; } } } else if (strcmp(k, CFG_GROUP) == 0) { if (v != NULL && strlen(v) > 0) { struct group *grp; grp = getgrnam(v); if (!grp) { config_error_set("Invalid group '%s'.", v); r = 0; } else { cfg->GID = grp->gr_gid; } } } else if (strcmp(k, CFG_QUIET) == 0) { r = config_param_val_bool(v, &cfg->QUIET); } else if (strcmp(k, CFG_SYSLOG) == 0) { r = config_param_val_bool(v, &cfg->SYSLOG); } else if (strcmp(k, CFG_SYSLOG_FACILITY) == 0) { r = 1; if (!strcmp(v, "auth") || !strcmp(v, "authpriv")) cfg->SYSLOG_FACILITY = LOG_AUTHPRIV; else if (!strcmp(v, "cron")) cfg->SYSLOG_FACILITY = LOG_CRON; else if (!strcmp(v, "daemon")) cfg->SYSLOG_FACILITY = LOG_DAEMON; else if (!strcmp(v, "ftp")) cfg->SYSLOG_FACILITY = LOG_FTP; else if (!strcmp(v, "local0")) cfg->SYSLOG_FACILITY = LOG_LOCAL0; else if (!strcmp(v, "local1")) cfg->SYSLOG_FACILITY = LOG_LOCAL1; else if (!strcmp(v, "local2")) cfg->SYSLOG_FACILITY = LOG_LOCAL2; else if (!strcmp(v, "local3")) cfg->SYSLOG_FACILITY = LOG_LOCAL3; else if (!strcmp(v, "local4")) cfg->SYSLOG_FACILITY = LOG_LOCAL4; else if (!strcmp(v, "local5")) cfg->SYSLOG_FACILITY = LOG_LOCAL5; else if (!strcmp(v, "local6")) cfg->SYSLOG_FACILITY = LOG_LOCAL6; else if (!strcmp(v, "local7")) cfg->SYSLOG_FACILITY = LOG_LOCAL7; else if (!strcmp(v, "lpr")) cfg->SYSLOG_FACILITY = LOG_LPR; else if (!strcmp(v, "mail")) cfg->SYSLOG_FACILITY = LOG_MAIL; else if (!strcmp(v, "news")) cfg->SYSLOG_FACILITY = LOG_NEWS; else if (!strcmp(v, "user")) cfg->SYSLOG_FACILITY = LOG_USER; else if (!strcmp(v, "uucp")) cfg->SYSLOG_FACILITY = LOG_UUCP; else { config_error_set("Invalid facility '%s'.", v); r = 0; } } else if (strcmp(k, CFG_DAEMON) == 0) { r = config_param_val_bool(v, &cfg->DAEMONIZE); } else if (strcmp(k, CFG_WRITE_IP) == 0) { r = config_param_val_bool(v, &cfg->WRITE_IP_OCTET); } else if (strcmp(k, CFG_WRITE_PROXY) == 0) { r = config_param_val_bool(v, &cfg->WRITE_PROXY_LINE); } else if (strcmp(k, CFG_PROXY_PROXY) == 0) { r = config_param_val_bool(v, &cfg->PROXY_PROXY_LINE); } else if (strcmp(k, CFG_PEM_FILE) == 0) { printf( "strcmp %s\n", k ); if (v != NULL && strlen(v) > 0) { if (stat(v, &st) != 0) { config_error_set("Unable to stat x509 certificate PEM file '%s': ", v, strerror(errno)); r = 0; } else if (! S_ISREG(st.st_mode)) { config_error_set("Invalid x509 certificate PEM file '%s': Not a file.", v); r = 0; } else { struct cert_files *cert = calloc(1, sizeof(*cert)); config_assign_str(&cert->CERT_FILE, v); cert->NEXT = cfg->CERT_FILES; cfg->CERT_FILES = cert; } } } else { fprintf( stderr, "Ignoring unknown configuration key '%s' in configuration file '%s', line %d\n", k, file, line ); } if (! r) { if (file != NULL) config_die("Error in configuration file '%s', line %d: %s\n", file, line, config_error_get()); else config_die("Invalid parameter '%s': %s", k, config_error_get()); } }
void config_parse_cli(int argc, char **argv, stud_config *cfg) { static int tls = 0, ssl = 0; static int client = 0; int c, i; int test_only = 0; char *prog; struct option long_options[] = { #ifndef NO_CONFIG_FILE { CFG_CONFIG, 1, NULL, CFG_PARAM_CFGFILE }, { CFG_CONFIG_DEFAULT, 0, NULL, CFG_PARAM_DEFCFG }, #endif { "tls", 0, &tls, 1}, { "ssl", 0, &ssl, 1}, { "client", 0, &client, 1}, { CFG_CIPHERS, 1, NULL, 'c' }, { CFG_PREFER_SERVER_CIPHERS, 0, NULL, 'O' }, { CFG_BACKEND, 1, NULL, 'b' }, { CFG_FRONTEND, 1, NULL, 'f' }, { CFG_WORKERS, 1, NULL, 'n' }, { CFG_BACKLOG, 1, NULL, 'B' }, #ifdef USE_SHARED_CACHE { CFG_SHARED_CACHE, 1, NULL, 'C' }, { CFG_SHARED_CACHE_LISTEN, 1, NULL, 'U' }, { CFG_SHARED_CACHE_PEER, 1, NULL, 'P' }, { CFG_SHARED_CACHE_MCASTIF, 1, NULL, 'M' }, #endif { CFG_KEEPALIVE, 1, NULL, 'k' }, { CFG_CHROOT, 1, NULL, 'r' }, { CFG_USER, 1, NULL, 'u' }, { CFG_GROUP, 1, NULL, 'g' }, { CFG_QUIET, 0, NULL, 'q' }, { CFG_SYSLOG, 0, NULL, 's' }, { CFG_SYSLOG_FACILITY, 1, NULL, CFG_PARAM_SYSLOG_FACILITY }, { CFG_DAEMON, 0, &cfg->DAEMONIZE, 1 }, { CFG_WRITE_IP, 0, &cfg->WRITE_IP_OCTET, 1 }, { CFG_WRITE_PROXY, 0, &cfg->WRITE_PROXY_LINE, 1 }, { CFG_PROXY_PROXY, 0, &cfg->PROXY_PROXY_LINE, 1 }, { "test", 0, NULL, 't' }, { "version", 0, NULL, 'V' }, { "help", 0, NULL, 'h' }, { 0, 0, 0, 0 } }; while (1) { int option_index = 0; c = getopt_long( argc, argv, "c:e:Ob:f:n:B:C:U:P:M:k:r:u:g:qstVh", long_options, &option_index ); if (c == -1) break; switch (c) { case 0: break; #ifndef NO_CONFIG_FILE case CFG_PARAM_CFGFILE: if (!config_file_parse(optarg, cfg)) config_die("%s", config_error_get()); break; case CFG_PARAM_DEFCFG: config_print_default(stdout, cfg); exit(0); break; #endif case CFG_PARAM_SYSLOG_FACILITY: config_param_validate(CFG_SYSLOG_FACILITY, optarg, cfg, NULL, 0); break; case 'c': config_param_validate(CFG_CIPHERS, optarg, cfg, NULL, 0); break; case 'e': config_param_validate(CFG_SSL_ENGINE, optarg, cfg, NULL, 0); break; case 'O': config_param_validate(CFG_PREFER_SERVER_CIPHERS, CFG_BOOL_ON, cfg, NULL, 0); break; case 'b': config_param_validate(CFG_BACKEND, optarg, cfg, NULL, 0); break; case 'f': config_param_validate(CFG_FRONTEND, optarg, cfg, NULL, 0); break; case 'n': config_param_validate(CFG_WORKERS, optarg, cfg, NULL, 0); break; case 'B': config_param_validate(CFG_BACKLOG, optarg, cfg, NULL, 0); break; #ifdef USE_SHARED_CACHE case 'C': config_param_validate(CFG_SHARED_CACHE, optarg, cfg, NULL, 0); break; case 'U': config_param_validate(CFG_SHARED_CACHE_LISTEN, optarg, cfg, NULL, 0); break; case 'P': config_param_validate(CFG_SHARED_CACHE_PEER, optarg, cfg, NULL, 0); break; case 'M': config_param_validate(CFG_SHARED_CACHE_MCASTIF, optarg, cfg, NULL, 0); break; #endif case 'k': config_param_validate(CFG_KEEPALIVE, optarg, cfg, NULL, 0); break; case 'r': config_param_validate(CFG_CHROOT, optarg, cfg, NULL, 0); break; case 'u': config_param_validate(CFG_USER, optarg, cfg, NULL, 0); break; case 'g': config_param_validate(CFG_GROUP, optarg, cfg, NULL, 0); break; case 'q': config_param_validate(CFG_QUIET, CFG_BOOL_ON, cfg, NULL, 0); break; case 's': config_param_validate(CFG_SYSLOG, CFG_BOOL_ON, cfg, NULL, 0); break; case 't': test_only = 1; break; case 'V': printf("%s %s\n", basename(argv[0]), STUD_VERSION); exit(0); break; case 'h': config_print_usage(argv[0], cfg); exit(0); break; default: config_die("Invalid command line parameters. Run %s --help for instructions.", basename(argv[0])); } } prog = argv[0]; if (tls && ssl) config_die("Options --tls and --ssl are mutually exclusive."); else { if (ssl) cfg->ETYPE = ENC_SSL; else if (tls) cfg->ETYPE = ENC_TLS; } if (client) { cfg->PMODE = SSL_CLIENT; } if (cfg->WRITE_IP_OCTET && cfg->WRITE_PROXY_LINE) config_die("Options --write-ip and --write-proxy are mutually exclusive."); if (cfg->WRITE_PROXY_LINE && cfg->PROXY_PROXY_LINE) config_die("Options --write-proxy and --proxy-proxy are mutually exclusive."); if (cfg->WRITE_IP_OCTET && cfg->PROXY_PROXY_LINE) config_die("Options --write-ip and --proxy-proxy are mutually exclusive."); if (cfg->DAEMONIZE) { cfg->SYSLOG = 1; cfg->QUIET = 1; } #ifdef USE_SHARED_CACHE if (cfg->SHCUPD_IP != NULL && ! cfg->SHARED_CACHE) config_die("Shared cache update listener is defined, but shared cache is disabled."); #endif // Any arguments left are presumed to be PEM files argc -= optind; argv += optind; for (i = 0; i < argc; i++) { config_param_validate(CFG_PEM_FILE, argv[i], cfg, NULL, 0); } /* if (cfg->PMODE == SSL_SERVER && cfg->CERT_FILES == NULL) { config_die("No x509 certificate PEM file specified!"); } */ // was this only a test? /* if (test_only) { fprintf(stderr, "Trying to initialize SSL contexts with your certificates"); if (!init_openssl()) { config_die("Error initializing OpenSSL."); } printf("%s configuration looks ok.\n", basename(prog)); exit(0); } */ }