int main(int argc, const char * const *argv) { apr_pool_t *pool; apr_status_t rv; apr_getopt_t *opt; apt_bool_t ret = TRUE; uni_service_register_e reg = USR_NONE; uni_service_control_e control = USC_NONE; const char *root_dir = ".."; const char *name = NULL; apt_bool_t autostart = FALSE; unsigned long recover = 0; int log_priority = -1; const char *disp_name = NULL; const char *description = NULL; static const apr_getopt_option_t opt_option[] = { /* long-option, short-option, has-arg flag, description */ { "register", 'r', TRUE, "register service" }, /* -r or --register arg */ { "unregister", 'u', FALSE, "unregister service" }, /* -u or --unregister */ { "start", 's', FALSE, "start service" }, /* -s or --start */ { "stop", 't', FALSE, "stop service" }, /* -t or --stop */ { "name", 'n', TRUE, "service name" }, /* -n or --name arg */ { "autostart", 'a', FALSE, "start automatically" },/* -a or --autostart */ { "fail-restart",'f', TRUE, "restart if fails" }, /* -f or --fail-restart arg */ { "log-prio", 'l', TRUE, "log priority" }, /* -l arg or --log-prio arg */ { "disp-name", 'p', TRUE, "display name" }, /* -p arg or --disp-name arg */ { "description", 'c', TRUE, "description" }, /* -c arg or --description arg */ { "help", 'h', FALSE, "show help" }, /* -h or --help */ { NULL, 0, 0, NULL }, /* end */ }; /* APR global initialization */ if(apr_initialize() != APR_SUCCESS) { apr_terminate(); return 1; } /* create APR pool */ pool = apt_pool_create(); if(!pool) { apr_terminate(); return 1; } rv = apr_getopt_init(&opt, pool , argc, argv); if(rv == APR_SUCCESS) { int optch; const char *optarg; while((rv = apr_getopt_long(opt, opt_option, &optch, &optarg)) == APR_SUCCESS) { switch(optch) { case 'r': if ((reg == USR_NONE) || (reg == USR_REGISTER)) { reg = USR_REGISTER; root_dir = optarg; } else { puts("Incosistent arguments"); ret = FALSE; } break; case 'u': if ((reg == USR_NONE) || (reg == USR_UNREGISTER)) reg = USR_UNREGISTER; else { puts("Incosistent arguments"); ret = FALSE; } break; case 's': if ((control == USC_NONE) || (control == USC_START)) control = USC_START; else { puts("Incosistent arguments"); ret = FALSE; } break; case 't': if ((control == USC_NONE) || (control == USC_STOP)) control = USC_STOP; else { puts("Incosistent arguments"); ret = FALSE; } break; case 'n': name = optarg; break; case 'a': autostart = TRUE; break; case 'f': if (sscanf(optarg, "%lu", &recover) != 1) { puts("Invalid value for param --fail-restart"); ret = FALSE; } break; case 'l': if ((sscanf(optarg, "%d", &log_priority) != 1) || (log_priority < 0) || (log_priority > 7)) { puts("Invalid value for param --log-prio"); ret = FALSE; } break; case 'p': disp_name = optarg; break; case 'c': description = optarg; break; case 'h': usage(); break; } if (!ret) break; } if (ret && (((reg == USR_REGISTER) && (control == USC_STOP)) || ((reg == USR_UNREGISTER) && (control == USC_START)))) { ret = FALSE; puts("Inconsistent arguments"); } if((rv != APR_EOF) || !ret || (!reg && !control)) { ret = FALSE; usage(); } } while (ret) { /* No problem so far */ if (reg == USR_REGISTER) ret = uni_service_register(root_dir, pool, name, autostart, recover, log_priority, disp_name, description); if (!ret) break; if (control == USC_START) ret = uni_service_start(name); if (!ret) break; if (control == USC_STOP) ret = uni_service_stop(name); /* Do not break here, stop failure should not matter before unregistration */ if (reg == USR_UNREGISTER) ret = uni_service_unregister(name); break; } /* destroy APR pool */ apr_pool_destroy(pool); /* APR global termination */ apr_terminate(); return ret ? 0 : 1; }
int main(int argc, const char * const *argv) { apr_pool_t *pool; apr_status_t rv; apr_getopt_t *opt; static const apr_getopt_option_t opt_option[] = { /* long-option, short-option, has-arg flag, description */ { "register", 'r', TRUE, "register service" }, /* -r or --register arg */ { "unregister", 'u', FALSE, "unregister service" },/* -u or --unregister */ { "start", 's', FALSE, "start service" }, /* -s or --start */ { "stop", 't', FALSE, "stop service" }, /* -t or --stop */ { "help", 'h', FALSE, "show help" }, /* -h or --help */ { NULL, 0, 0, NULL }, /* end */ }; /* APR global initialization */ if(apr_initialize() != APR_SUCCESS) { apr_terminate(); return 0; } /* create APR pool */ pool = apt_pool_create(); if(!pool) { apr_terminate(); return 0; } rv = apr_getopt_init(&opt, pool , argc, argv); if(rv == APR_SUCCESS) { int optch; const char *optarg; while((rv = apr_getopt_long(opt, opt_option, &optch, &optarg)) == APR_SUCCESS) { switch(optch) { case 'r': uni_service_register(optarg,pool); break; case 'u': uni_service_unregister(); break; case 's': uni_service_start(); break; case 't': uni_service_stop(); break; case 'h': usage(); break; } } if(rv != APR_EOF) { usage(); } } /* destroy APR pool */ apr_pool_destroy(pool); /* APR global termination */ apr_terminate(); return 0; }