int conf_load(struct conf *conf, const char *conf_name, char *config_search_dirs[], char *plugin_search_dirs[]) { conf_init(conf); cur_conf = conf; cur_conf->config_search_dirs = config_search_dirs; cur_conf->plugin_search_dirs = plugin_search_dirs; if (!(yyin = conf_push_config(cur_conf, conf_name, NULL))) { return -1; } if (yyparse()) { if (fclose(yyin)) { wminput_err("Error closing configuration file"); } conf_unload(cur_conf); return -1; } if (uinput_open(cur_conf)) { conf_unload(cur_conf); return -1; } return 0; }
int main(int argc, char * argv[]) { int verbose = 0; int level = 0; FILE * dest = stderr; char optchar = -1; while (optchar = getopt(argc, argv, "c:vd:e:h")) { if (-1 == optchar) break; switch (optchar) { case 'c': conf.source = strdup(optarg); if (NULL == conf.source) fprintf(stderr, "cannot open config file: %s\n", optarg); break; case 'v': verbose = 1; break; case 'e': if (0 == strcmp(optarg, "stderr")) dest = stderr; else if (0 == strcmp(optarg, "stdout")) dest = stdout; else { FILE * out = fopen(optarg, "r"); if (NULL == out) { fprintf(stderr, "failed to open destination for debug, using stderr\n"); dest = stderr; } else dest = out; } break; case 'd': level = atoi(optarg); break; case 'h': show_help(argv[0]); exit(1); break; default: break; } } if (NULL == conf.source) { fprintf(stderr, "no config file in use\n"); exit(1); } dbg_init(dest, level, verbose); DBG(1, "mpsd startup\n"); if (RET_OK == conf_load(&conf)) { core_init(&conf); core_deinit(&conf); DBG(1, "mpsd closing\n"); } conf_unload(&conf); return 0; }
int conf_load(struct conf *conf, const char *conf_name, char *config_search_dirs[], char *plugin_search_dirs[]) { if (first_time) { struct sigaction sa; sa.sa_handler = reloadconf; sigemptyset (&(sa.sa_mask)); sa.sa_flags = 0; first_time = 0; stored_conf_name = conf_name; sigaction (SIGHUP, &sa, NULL); } conf_init(conf); cur_conf = conf; cur_conf->config_search_dirs = config_search_dirs; cur_conf->plugin_search_dirs = plugin_search_dirs; if (!(yyin = conf_push_config(cur_conf, conf_name, NULL))) { return -1; } if (yyparse()) { if (fclose(yyin)) { wminput_err("Error closing configuration file"); } conf_unload(cur_conf); return -1; } if (uinput_open(cur_conf)) { conf_unload(cur_conf); return -1; } return 0; }
static void reloadconf (int ignore) { if (!(yyin = conf_push_config(cur_conf, stored_conf_name, NULL))) { wminput_err("Can not reload configuration file"); exit(-1); } if (yyin == NULL) { wminput_err("Can not reload configuration file"); conf_unload(cur_conf); exit(-1); } yyrestart(yyin); if (yyparse()) { if (fclose(yyin)) { wminput_err("Error closing configuration file"); } conf_unload(cur_conf); exit(-1); } wminput_err("Configuration reloaded"); }
void quit_do_cleanup(void) { log_write("#############################################################################\n"); log_command(LOG_SERVICES, NULL, "", "Services shutdown\n\n"); debug_out("==> Starting onexit cleanup...\n"); debug_out(" |==> Closing all sockets and freeing them...\n"); com_free_all(); /* Close ALL connections and free memory */ debug_out(" |==> Executing pending mySQL queries...\n"); queue_wait_until_empty(); /* Make the queue write all the pending data to mySQL before quitting */ debug_out(" |==> Freeing memory used by databases...\n"); help_free(); dbase_clear(); /* Clear the dbase and free memory */ debug_out(" |==> Flushing and closing log files...\n"); log_close(); /* flush and close log files */ debug_out(" |==> Freeing memory used by settings...\n"); conf_unload(); /* free memory taken by config */ debug_out(" |==> Freeing memory used by timers...\n"); timer_freeall(); /* remove all timers */ debug_out(" \\==> Cleanup done, quitting...\n"); }
int main(int argc, char *argv[]) { char wait_forever = 0, quiet = 0, reconnect = 0, reconnect_wait = 0; char *config_search_dirs[3], *plugin_search_dirs[3]; char *config_filename = DEFAULT_CONFIG_FILE; char home_config_dir[HOME_DIR_LEN]; char home_plugin_dir[HOME_DIR_LEN]; char *tmp; const char *dev_name = NULL; int c, i; char *str_addr; bdaddr_t bdaddr, current_bdaddr; sigset_t sigset; int signum, ret=0; struct uinput_listen_data uinput_listen_data; pthread_t uinput_listen_thread; init = 1; /* Parse Options */ while (1) { int option_index = 0; static struct option long_options[] = { {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {"config", 1, 0, 'c'}, {"daemon", 0, 0, 'd'}, {"quiet", 0, 0, 'q'}, {"reconnect", 2, 0, 'r'}, {"wait", 0, 0, 'w'}, {"name", 1, 0, 'n'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "hvc:dqr::wn:", long_options, &option_index); if (c == -1) { break; } switch (c) { case 'h': print_usage(); return 0; break; case 'v': printf("CWiid Version %s\n", PACKAGE_VERSION); return 0; break; case 'c': config_filename = optarg; break; case 'd': wait_forever = 1; quiet = 1; reconnect = 1; break; case 'q': quiet = 1; break; case 'r': reconnect = 1; if (optarg) { reconnect_wait = strtol(optarg, &tmp, 10); if (*tmp != '\0') { wminput_err("bad reconnect wait time"); return -1; } } break; case 'w': wait_forever = 1; break; case 'n': dev_name = optarg; break; case '?': printf("Try `wminput --help` for more information\n"); return 1; break; default: return -1; break; } } if (c_init()) { return -1; } #ifdef HAVE_PYTHON if (py_init()) { return -1; } #endif /* Load Config */ /* Setup search directory arrays */ if ((tmp = getenv("HOME")) == NULL) { wminput_err("Unable to find home directory"); config_search_dirs[0] = WMINPUT_CONFIG_DIR; plugin_search_dirs[0] = CWIID_PLUGINS_DIR; config_search_dirs[1] = plugin_search_dirs[1] = NULL; } else { snprintf(home_config_dir, HOME_DIR_LEN, "%s/.cwiid/wminput", tmp); snprintf(home_plugin_dir, HOME_DIR_LEN, "%s/.cwiid/plugins", tmp); config_search_dirs[0] = home_config_dir; plugin_search_dirs[0] = home_plugin_dir; config_search_dirs[1] = WMINPUT_CONFIG_DIR; plugin_search_dirs[1] = CWIID_PLUGINS_DIR; config_search_dirs[2] = plugin_search_dirs[2] = NULL; } if (conf_load(&conf, config_filename, config_search_dirs, plugin_search_dirs, dev_name)) { return -1; } /* Determine BDADDR */ /* priority: command-line option, environment variable, BDADDR_ANY */ if (optind < argc) { if (str2ba(argv[optind], &bdaddr)) { wminput_err("invalid bdaddr"); bdaddr = *BDADDR_ANY; } optind++; if (optind < argc) { wminput_err("invalid command-line"); print_usage(); conf_unload(&conf); return -1; } } else if ((str_addr = getenv(WIIMOTE_BDADDR)) != NULL) { if (str2ba(str_addr, &bdaddr)) { wminput_err("invalid address in %s", WIIMOTE_BDADDR); bdaddr = *BDADDR_ANY; } } else { bdaddr = *BDADDR_ANY; } sigemptyset(&sigset); sigaddset(&sigset, SIGTERM); sigaddset(&sigset, SIGINT); sigaddset(&sigset, SIGUSR1); do { bacpy(¤t_bdaddr, &bdaddr); /* Wiimote Connect */ if (!quiet) { printf("Put Wiimote in discoverable mode now (press 1+2)...\n"); } if (wait_forever) { if (!bacmp(¤t_bdaddr, BDADDR_ANY)) { if (cwiid_find_wiimote(¤t_bdaddr, -1)) { wminput_err("error finding wiimote"); conf_unload(&conf); return -1; } } /* TODO: avoid continuously calling cwiid_open */ cwiid_set_err(cwiid_err_connect); while (!(wiimote = cwiid_open(¤t_bdaddr, CWIID_FLAG_MESG_IFC))); cwiid_set_err(cwiid_err_default); } else { if ((wiimote = cwiid_open(¤t_bdaddr, CWIID_FLAG_MESG_IFC)) == NULL) { wminput_err("unable to connect"); conf_unload(&conf); return -1; } } if (cwiid_set_mesg_callback(wiimote, &cwiid_callback)) { wminput_err("error setting callback"); conf_unload(&conf); return -1; } if (c_wiimote(wiimote)) { conf_unload(&conf); return -1; } #ifdef HAVE_PYTHON if (py_wiimote(wiimote)) { conf_unload(&conf); return -1; } #endif /* init plugins */ for (i=0; (i < CONF_MAX_PLUGINS) && conf.plugins[i].name; i++) { switch (conf.plugins[i].type) { case PLUGIN_C: if (c_plugin_init(&conf.plugins[i], i)) { wminput_err("error on %s init", conf.plugins[i].name); conf_unload(&conf); cwiid_close(wiimote); return -1; } break; #ifdef HAVE_PYTHON case PLUGIN_PYTHON: if (py_plugin_init(&conf.plugins[i], i)) { wminput_err("error %s init", conf.plugins[i].name); conf_unload(&conf); cwiid_close(wiimote); return -1; } break; #endif } } if (wminput_set_report_mode()) { conf_unload(&conf); cwiid_close(wiimote); return -1; } uinput_listen_data.wiimote = wiimote; uinput_listen_data.conf = &conf; if (pthread_create(&uinput_listen_thread, NULL, (void *(*)(void *))uinput_listen, &uinput_listen_data)) { wminput_err("error starting uinput listen thread"); conf_unload(&conf); cwiid_close(wiimote); return -1; } if (!quiet) { printf("Ready.\n"); } init = 0; /* wait */ sigprocmask(SIG_BLOCK, &sigset, NULL); sigwait(&sigset, &signum); sigprocmask(SIG_UNBLOCK, &sigset, NULL); if ((signum == SIGTERM) || (signum == SIGINT)) { reconnect = 0; } if (pthread_cancel(uinput_listen_thread)) { wminput_err("Error canceling uinput listen thread"); ret = -1; } else if (pthread_join(uinput_listen_thread, NULL)) { wminput_err("Error joining uinput listen thread"); ret = -1; } c_wiimote_deinit(); #ifdef HAVE_PYTHON py_wiimote_deinit(); #endif /* disconnect */ if (cwiid_close(wiimote)) { wminput_err("Error on wiimote disconnect"); ret = -1; } if (reconnect && reconnect_wait) { sleep(reconnect_wait); } } while (reconnect); if (conf_unload(&conf)) { ret = -1; } c_deinit(); #ifdef HAVE_PYTHON py_deinit(); #endif if (!quiet) { printf("Exiting.\n"); } return ret; }
extern int d2cs_prefs_unload(void) { conf_unload(prefs_conf_table); return 0; }
extern void cmdline_unload(void) { conf_unload(conftab); }