/** \brief Display the inlined help */ void lib_apps_t::display_help(const clineopt_arr_t &clineopt_arr) throw() { // display a inlined help KLOG_STDERR(human_name() << " - " << summary() << "\n"); KLOG_STDERR(canon_name() << " version " << version() << " - list of possible options:\n" ); KLOG_STDERR(clineopt_helper_t::help_string(clineopt_arr) ); KLOG_STDERR(longdesc() << "\n"); }
/** \brief parse the envvar for the cmdline_opt * * - NOTE: the env_var is of the form NEOIP_OLOAD_CMDLINE_OPT for neoip-oload * - e.g. export NEOIP_OLOAD_CMDLINE_OPT="-x 50k" */ clineopt_err_t lib_apps_t::parse_cmdline_from_envvar(const clineopt_arr_t &clineopt_arr) throw() { std::string envvar_key = string_t::to_upper(canon_name()) + "_CMDLINE_OPT"; char * envvar_val = getenv(envvar_key.c_str()); // log to debug KLOG_DBG("envvar_key="<< envvar_key); // if there are no envvar, return now if( !envvar_val ) return clineopt_err_t::OK; // parse the envvar_val as a argv array std::vector<std::string> env_arr = string_t::parse_as_argv(envvar_val); // parse the env_arr with the clineopt_arr clineopt_err_t clineopt_err; clineopt_err = clineopt_helper_t::parse(env_arr, m_arg_option, clineopt_arr); return clineopt_err; }
int main(int argc, char **argv) { DKIM_STAT status; u_int verifycnt = 0; int c; int w; int rate; size_t msgsize = DEFMSGSIZE; size_t msgrem; size_t wsz; time_t start = DEFTESTINT; time_t testint = DEFTESTINT; dkim_canon_t hcanon = DKIM_CANON_RELAXED; dkim_canon_t bcanon = DKIM_CANON_SIMPLE; dkim_alg_t signalg = DKIM_SIGN_UNKNOWN; dkim_query_t qtype = DKIM_QUERY_FILE; char *p; DKIM *dkim; DKIM_LIB *lib; dkim_sigkey_t key; unsigned char hdr[MAXHEADER + 1]; unsigned char body[BODYBUFRSZ]; progname = (p = strrchr(argv[0], '/')) == NULL ? argv[0] : p + 1; while ((c = getopt(argc, argv, "b:h:m:s:t:")) != -1) { switch (c) { case 'b': bcanon = canon_code(optarg); if (bcanon == (dkim_canon_t) -1) { fprintf(stderr, "%s: unknown canonicalization '%s'\n", progname, optarg); return EX_USAGE; } break; case 'h': hcanon = canon_code(optarg); if (hcanon == (dkim_canon_t) -1) { fprintf(stderr, "%s: unknown canonicalization '%s'\n", progname, optarg); return EX_USAGE; } break; case 'm': msgsize = strtoul(optarg, &p, 10); if (*p != '\0') { fprintf(stderr, "%s: invalid size '%s'\n", progname, optarg); return EX_USAGE; } break; case 's': signalg = alg_code(optarg); if (signalg == (dkim_alg_t) -1) { fprintf(stderr, "%s: unknown signing algorithm '%s'\n", progname, optarg); return EX_USAGE; } break; case 't': testint = strtoul(optarg, &p, 10); if (*p != '\0') { fprintf(stderr, "%s: invalid seconds '%s'\n", progname, optarg); return EX_USAGE; } break; default: return usage(); } } #ifdef USE_GNUTLS (void) gnutls_global_init(); #endif /* USE_GNUTLS */ /* instantiate the library */ lib = dkim_init(NULL, NULL); if (signalg == DKIM_SIGN_UNKNOWN) { if (dkim_libfeature(lib, DKIM_FEATURE_SHA256)) signalg = DKIM_SIGN_RSASHA256; else signalg = DKIM_SIGN_RSASHA1; } else if (signalg == DKIM_SIGN_RSASHA256 && !dkim_libfeature(lib, DKIM_FEATURE_SHA256)) { fprintf(stdout, "### requested signing algorithm not available\n"); dkim_close(lib); return 1; } fprintf(stdout, "*** VERIFYING SPEED TEST: %s/%s with %s, size %u for %lds\n", canon_name(hcanon), canon_name(bcanon), alg_name(signalg), (unsigned int) msgsize, (long) testint); key = KEY; (void) dkim_options(lib, DKIM_OP_SETOPT, DKIM_OPTS_QUERYMETHOD, &qtype, sizeof qtype); (void) dkim_options(lib, DKIM_OP_SETOPT, DKIM_OPTS_QUERYINFO, KEYFILE, strlen(KEYFILE)); srandom(time(NULL)); /* prepare a random body buffer */ for (c = 0, w = 0; c < sizeof body; c++) { if (w >= 75 && c < sizeof body - 2) { body[c++] = '\r'; body[c++] = '\n'; w = 0; } body[c++] = (random() + 32) % 127; w++; } /* generate the signature */ dkim = dkim_sign(lib, JOBID, NULL, key, SELECTOR, DOMAIN, hcanon, bcanon, signalg, -1L, &status); status = dkim_header(dkim, HEADER02, strlen(HEADER02)); status = dkim_header(dkim, HEADER03, strlen(HEADER03)); status = dkim_header(dkim, HEADER04, strlen(HEADER04)); status = dkim_header(dkim, HEADER05, strlen(HEADER05)); status = dkim_header(dkim, HEADER06, strlen(HEADER06)); status = dkim_header(dkim, HEADER07, strlen(HEADER07)); status = dkim_header(dkim, HEADER08, strlen(HEADER08)); status = dkim_header(dkim, HEADER09, strlen(HEADER09)); status = dkim_eoh(dkim); msgrem = msgsize; while (msgrem > 0) { wsz = MIN(msgrem, sizeof body); status = dkim_body(dkim, body, wsz); msgrem -= wsz; } status = dkim_eom(dkim, NULL); memset(hdr, '\0', sizeof hdr); snprintf(hdr, sizeof hdr, "%s: ", DKIM_SIGNHEADER); status = dkim_getsighdr(dkim, hdr + strlen(hdr), sizeof hdr - strlen(hdr), strlen(hdr) + 1); status = dkim_free(dkim); (void) time(&start); /* begin the verify loop */ while (time(NULL) < start + testint) { dkim = dkim_verify(lib, JOBID, NULL, &status); status = dkim_header(dkim, hdr, strlen(hdr)); status = dkim_header(dkim, HEADER02, strlen(HEADER02)); status = dkim_header(dkim, HEADER03, strlen(HEADER03)); status = dkim_header(dkim, HEADER04, strlen(HEADER04)); status = dkim_header(dkim, HEADER05, strlen(HEADER05)); status = dkim_header(dkim, HEADER06, strlen(HEADER06)); status = dkim_header(dkim, HEADER07, strlen(HEADER07)); status = dkim_header(dkim, HEADER08, strlen(HEADER08)); status = dkim_header(dkim, HEADER09, strlen(HEADER09)); status = dkim_eoh(dkim); msgrem = DEFMSGSIZE; while (msgrem > 0) { wsz = MIN(msgrem, sizeof body); status = dkim_body(dkim, body, wsz); msgrem -= wsz; } status = dkim_eom(dkim, NULL); status = dkim_free(dkim); verifycnt++; } dkim_close(lib); rate = verifycnt / testint; fprintf(stdout, "*** %u messages verified (%d msgs/sec)\n", verifycnt, rate); return 0; }
/** \brief start the apps */ libsess_err_t lib_apps_t::start(int argc, char **argv, const clineopt_arr_t &apps_clineopt_arr , const std::string &m_canon_name, const std::string &m_human_name , const std::string &m_version, const std::string &m_summary , const std::string &m_longdesc, const apps_type_t &m_apps_type) throw() { // copy the parameter this->m_canon_name = m_canon_name; this->m_human_name = m_human_name; this->m_version = m_version; this->m_summary = m_summary; this->m_longdesc = m_longdesc; this->m_apps_type = m_apps_type; // sanity check - all parameters MUST be set DBG_ASSERT( !canon_name().empty() ); DBG_ASSERT( !human_name().empty() ); DBG_ASSERT( !version().empty() ); DBG_ASSERT( !summary().empty() ); DBG_ASSERT( !longdesc().empty() ); DBG_ASSERT( !apps_type().is_null() ); #if 0 // TODO fixup this issue... *apparently* setting this or not under window // didnt change the result. so i manually change the OS preference // - obviously this is crap :) // - as seens in neoip-nunit "all/base/string" which is failing with "1,0" // on cout/cin // set 'locale' to the default C one // - without that the operating system may use display float(1.0) as "1,0" // - i didnt experience it under linux but did under _WIN32. likely because // i run linux under english default // - as i do it only for float/double, maybe i should limit this to LC_NUMERIC ? setlocale(LC_ALL, "C" ); #endif // parse the command line clineopt_err_t clineopt_err; clineopt_err = parse_cmdline(argc, argv, apps_clineopt_arr); // display the short help if the clineopt is in the cmdline if( m_arg_option.contain_key("help") ) { // build the full clineopt_arr clineopt_arr_t clineopt_arr = apps_clineopt_arr; clineopt_arr += lib_session_t::clineopt_arr(); clineopt_arr += neutral_clineopt_arr(); // display the help display_help(clineopt_arr); // notify the caller not to launch the apps return libsess_err_t(libsess_err_t::OK, "DONTLAUNCHAPPS"); } // display the version if the clineopt is in the cmdline if( m_arg_option.contain_key("version") ) { // display the version display_version(); // notify the caller not to launch the apps return libsess_err_t(libsess_err_t::OK, "DONTLAUNCHAPPS"); } // if the cmdline parsing failed, return an error if( clineopt_err.failed() ) return libsess_err_from_clineopt(clineopt_err); // initialize the lib_session if( lib_session_init() ) return libsess_err_t(libsess_err_t::ERROR, "lib_session_init() failed!!!"); libsess_err_t libsess_err; libsess_err = lib_session_get()->set_profile(profile.lib_session()).start(this); if( libsess_err.failed() ) return libsess_err; // unbuffer the output just to debug setbuf(stderr, NULL); setbuf(stdout, NULL); /* init signal handler for stun shutdown */ signal( SIGINT, signal_hd ); signal( SIGTERM, signal_hd ); #ifndef _WIN32 // no sigpipe in mingw // NOTE: added to run only ELOOP_LEVT // - it was not needed for ELOOP_GLIB, likely glib use it for itself signal( SIGPIPE, SIG_IGN ); #endif // put a 'random' seed srand(time(NULL)); // return no error return libsess_err_t::OK; }