/*ARGSUSED*/ static void rdsvc(mdb_iob_t *rdiob, mdb_iob_t *wriob, mdb_iob_ctx_t *ctx) { if (setjmp(ctx->ctx_rpcb) == 0) { /* * Save the current standard input into the pipe context, and * reset m_in to point to the pipe. We will restore it on * the way back in wrsvc() below. */ ctx->ctx_iob = mdb.m_in; mdb.m_in = rdiob; ctx->ctx_rptr = mdb.m_frame; if (ctx->ctx_wptr != NULL) mdb_frame_switch(ctx->ctx_wptr); if (ctx->ctx_data != NULL) longjmp(ctx->ctx_wpcb, 1); else if (wriob == NULL) (void) runsvc(); else if ((ctx->ctx_data = mdb_context_create(runsvc)) != NULL) mdb_context_switch(ctx->ctx_data); else mdb_warn("failed to create pipe context"); } }
int main(int argc, const char *argv[]) { int opt; poptContext pc; int opt_version = 0; char *opt_config_file = NULL; int opt_debug = 0; struct gt_config cfg = {0}; int ret; AUTOCLEAN(int werr, waitchildren) = 0; struct poptOption long_options[] = { POPT_AUTOHELP {"config", 'c', POPT_ARG_STRING, &opt_config_file, 0, \ _("Specify a non-default config file"), NULL}, \ {"debug", 'd', POPT_ARG_NONE, &opt_debug, 0, \ _("Enable debugging"), NULL}, \ {"version", '\0', POPT_ARG_NONE, &opt_version, 0, \ _("Print version number and exit"), NULL }, \ POPT_TABLEEND }; pc = poptGetContext(argv[0], argc, argv, long_options, 0); while((opt = poptGetNextOpt(pc)) != -1) { switch(opt) { default: fprintf(stderr, "\n%s %s: %s\n\n", err_string(ERR_BADOPT), poptBadOption(pc, 0), poptStrerror(opt)); poptPrintUsage(pc, stderr, 0); return 1; } } if (opt_version) { puts(VERSION""DISTRO_VERSION""PRERELEASE_VERSION); return 0; } ret = load_config(opt_config_file, &cfg); if (ret) { fprintf(stderr, "Failed to load config file '%s': %s\n", opt_config_file, err_string(ret)); return 2; } for (int i = 0; i < cfg.num_svcs; i++) { ret = runsvc(&cfg.svcs[i]); if (ret) { fprintf(stderr, "Service terminated: %s\n", err_string(ret)); return 3; } } return 0; }