static int conf_cmdline(struct mip6_config *cfg, int argc, char **argv) { static struct option long_opts[] = { {"version", 0, 0, 'V'}, {"help", 0, 0, 'h'}, {"correspondent-node", 0, 0, 'C'}, {"home-agent", 0, 0, 'H'}, {"mobile-node", 0, 0, 'M'}, {"show-config", 0, 0, 0}, #ifdef ENABLE_VT {"vt-service", 1, 0, 0 }, #endif {0, 0, 0, 0} }; /* parse all other cmd line parameters than -c */ while (1) { int idx, c; c = getopt_long(argc, argv, "c:d:l:Vh?CMH", long_opts, &idx); if (c == -1) break; switch (c) { case 0: #ifdef ENABLE_VT if (strcmp(long_opts[idx].name, "vt-service") == 0) { cfg->vt_service = optarg; break; } #endif if (idx == 5) conf_show(cfg); return -1; case 'V': conf_version(); return -1; case '?': case 'h': conf_usage(basename(argv[0])); return -1; case 'd': cfg->debug_level = atoi(optarg); break; case 'l': cfg->debug_log_file = optarg; break; case 'C': cfg->mip6_entity = MIP6_ENTITY_CN; break; case 'H': cfg->mip6_entity = MIP6_ENTITY_HA; break; case 'M': cfg->mip6_entity = MIP6_ENTITY_MN; break; default: break; }; } return 0; }
/*! * \brief fifo command for listing configuration * \return pointer to the mi_root on success, 0 otherwise */ static struct mi_root* forward_fifo_list(struct mi_root* cmd_tree, void *param) { struct mi_node *node = NULL; struct mi_root * ret = init_mi_tree(200, MI_OK_S, MI_OK_LEN); if(ret == NULL) return 0; node = addf_mi_node_child( &ret->node, 0, 0, 0, "Printing forwarding information:"); if(node == NULL) goto error; // critical section start: // avoids dirty reads when updating configuration. lock_get(conf_lock); conf_show(ret); // critical section end lock_release(conf_lock); return ret; error: free_mi_tree(ret); return 0; }
static int conf_cmdline(struct mip6_config *cfg, int argc, char **argv) { static struct option long_opts[] = { {"version", 0, 0, 'V'}, {"help", 0, 0, 'h'}, {"correspondent-node", 0, 0, 'C'}, {"home-agent", 0, 0, 'H'}, {"mobile-node", 0, 0, 'M'}, {"mobile-access-gateway", optional_argument, 0, 'm'}, {"local-mobility-anchor", optional_argument, 0, 'a'}, {"pmip-tunneling", optional_argument, 0, 'i'}, {"pmip-dyn-tunneling", optional_argument, 0, 'd'}, {"lma-address", optional_argument, 0, 'L'}, {"mag-ingress-address", optional_argument, 0, 'N'}, {"mag-egress-address", optional_argument, 0, 'E'}, {"show-config", 0, 0, 0}, {"radius-client-cfg-file", optional_argument, 0, 'R'}, {"radius-password", 0, 0, 'P'}, #ifdef ENABLE_VT {"vt-service", 1, 0, 0 }, #endif {0, 0, 0, 0} }; /* parse all other cmd line parameters than -c */ while (1) { int idx, c; c = getopt_long(argc, argv, "c:d:l:L:N:E:R:P:Vh?CMHmaip", long_opts, &idx); if (c == -1) break; switch (c) { case 0: #ifdef ENABLE_VT if (strcmp(long_opts[idx].name, "vt-service") == 0) { cfg->vt_service = optarg; break; } #endif if (idx == 5) conf_show(cfg); return -1; case 'V': conf_version(); return -1; case '?': case 'h': conf_usage(basename(argv[0])); return -1; case 'd': cfg->debug_level = atoi(optarg); break; case 'l': cfg->debug_log_file = optarg; break; case 'C': cfg->mip6_entity = MIP6_ENTITY_CN; break; case 'H': cfg->mip6_entity = MIP6_ENTITY_HA; break; case 'M': cfg->mip6_entity = MIP6_ENTITY_MN; break; case 'L': if (strchr(optarg, ':')) { if (inet_pton(AF_INET6, optarg, (char *) &cfg->LmaAddress) <= 0) { fprintf(stderr, "invalid address %s\n", optarg); exit(2); } } break; case 'N': if (strchr(optarg, ':')) { if (inet_pton(AF_INET6, optarg, (char *) &cfg->MagAddressIngress) <= 0) { fprintf(stderr, "invalid address %s\n", optarg); exit(2); } } break; case 'E': if (strchr(optarg, ':')) { if (inet_pton(AF_INET6, optarg, (char *) &cfg->MagAddressEgress) <= 0) { fprintf(stderr, "invalid address %s\n", optarg); exit(2); } } break; case 'm': cfg->mip6_entity = MIP6_ENTITY_MAG; break; case 'a': cfg->mip6_entity = MIP6_ENTITY_LMA; break; case 'i': cfg->TunnelingEnabled = 1; break; case 'p': cfg->DynamicTunnelingEnabled = 1; break; case 'R': cfg->RadiusClientConfigFile = optarg; break; case 'P': cfg->RadiusPassword = optarg; break; default: break; }; } return 0; }
int main(int argc, char **argv) { pthread_t sigth; sigset_t sigblock; int logflags = 0; int ret = 1; debug_init(); sigemptyset(&sigblock); sigaddset(&sigblock, SIGHUP); sigaddset(&sigblock, SIGINT); sigaddset(&sigblock, SIGTERM); #ifdef ENABLE_VT sigaddset(&sigblock, SIGPIPE); #endif pthread_sigmask(SIG_BLOCK, &sigblock, NULL); if (conf_parse(&conf, argc, argv)) return 1; if (conf.debug_level > 0) logflags = LOG_PERROR; openlog(basename(argv[0]), LOG_PID|logflags, LOG_DAEMON); syslog(LOG_INFO, "%s v%s started (%s)", PACKAGE_NAME, PACKAGE_VERSION, entity_string[conf.mip6_entity]); #ifdef ENABLE_VT if (vt_init() < 0) goto vt_failed; #endif /* if not debugging, detach from tty */ if (conf.debug_level == 0) daemon_start(1); else { /* if debugging with debug log file, detach from tty */ if (conf.debug_log_file) { daemon_start(1); ret = debug_open(conf.debug_log_file); if (ret < 0) { fprintf(stderr, "can't init debug log:%s\n", strerror(-ret)); goto debug_failed; } dbg("%s started in debug mode\n", PACKAGE_NAME); } else { dbg("%s started in debug mode, not detaching from terminal\n", PACKAGE_NAME); } conf_show(&conf); } srandom(time(NULL)); if (rr_cn_init() < 0) goto rr_cn_failed; if (policy_init() < 0) goto policy_failed; if (taskqueue_init() < 0) goto taskqueue_failed; if (bcache_init() < 0) goto bcache_failed; if (mh_init() < 0) goto mh_failed; if (icmp6_init() < 0) goto icmp6_failed; if (xfrm_init() < 0) goto xfrm_failed; cn_init(); if ((is_ha() || is_mn()) && tunnelctl_init() < 0) goto tunnelctl_failed; if (is_ha() && ha_init() < 0) goto ha_failed; if (is_mn() && mn_init() < 0) goto mn_failed; #ifdef ENABLE_VT if (vt_start(conf.vt_hostname, conf.vt_service) < 0) goto vt_start_failed; #endif if (pthread_create(&sigth, NULL, sigh, NULL)) goto sigth_failed; pthread_join(sigth, NULL); ret = 0; sigth_failed: #ifdef ENABLE_VT vt_fini(); vt_start_failed: #endif if (is_mn()) mn_cleanup(); mn_failed: if (is_ha()) ha_cleanup(); ha_failed: if (is_ha() || is_mn()) tunnelctl_cleanup(); tunnelctl_failed: cn_cleanup(); xfrm_cleanup(); xfrm_failed: icmp6_cleanup(); icmp6_failed: mh_cleanup(); mh_failed: bcache_cleanup(); bcache_failed: taskqueue_destroy(); taskqueue_failed: policy_cleanup(); policy_failed: rr_cn_failed: debug_close(); debug_failed: #ifdef ENABLE_VT vt_failed: #endif syslog(LOG_INFO, "%s v%s stopped (%s)", PACKAGE_NAME, PACKAGE_VERSION, entity_string[conf.mip6_entity]); closelog(); return ret; }