int main(int argc, char **argv) { httrackp * opt; signal_handlers(); //init hts ht_init(); //init libevent listen port et_init(); //libevent loop et_wait(); ht_uninit(); //free et_uninit(); return 0; }
int main(int argc, char **argv) { int ret = 0; httrackp *opt; signal_handlers(); hts_init(); opt = global_opt = hts_create_opt(); CHAIN_FUNCTION(opt, init, htsshow_init, NULL); CHAIN_FUNCTION(opt, uninit, htsshow_uninit, NULL); CHAIN_FUNCTION(opt, start, htsshow_start, NULL); CHAIN_FUNCTION(opt, end, htsshow_end, NULL); CHAIN_FUNCTION(opt, chopt, htsshow_chopt, NULL); CHAIN_FUNCTION(opt, preprocess, htsshow_preprocesshtml, NULL); CHAIN_FUNCTION(opt, postprocess, htsshow_postprocesshtml, NULL); CHAIN_FUNCTION(opt, check_html, htsshow_checkhtml, NULL); CHAIN_FUNCTION(opt, query, htsshow_query, NULL); CHAIN_FUNCTION(opt, query2, htsshow_query2, NULL); CHAIN_FUNCTION(opt, query3, htsshow_query3, NULL); CHAIN_FUNCTION(opt, loop, htsshow_loop, NULL); CHAIN_FUNCTION(opt, check_link, htsshow_check, NULL); CHAIN_FUNCTION(opt, check_mime, htsshow_check_mime, NULL); CHAIN_FUNCTION(opt, pause, htsshow_pause, NULL); CHAIN_FUNCTION(opt, filesave, htsshow_filesave, NULL); CHAIN_FUNCTION(opt, filesave2, htsshow_filesave2, NULL); CHAIN_FUNCTION(opt, linkdetected, htsshow_linkdetected, NULL); CHAIN_FUNCTION(opt, linkdetected2, htsshow_linkdetected2, NULL); CHAIN_FUNCTION(opt, xfrstatus, htsshow_xfrstatus, NULL); CHAIN_FUNCTION(opt, savename, htsshow_savename, NULL); CHAIN_FUNCTION(opt, sendhead, htsshow_sendheader, NULL); CHAIN_FUNCTION(opt, receivehead, htsshow_receiveheader, NULL); ret = hts_main2(argc, argv, opt); if (ret) { fprintf(stderr, "* %s\n", hts_errmsg(opt)); } global_opt = NULL; hts_free_opt(opt); htsthread_wait(); /* wait for pending threads */ hts_uninit(); return ret; }
int main(int argc, char **argv) { OPTIONS.verbose = 0; OPTIONS.endpoint = strdup("tcp://127.0.0.1:2997"); OPTIONS.daemonize = 1; OPTIONS.pidfile = strdup("/var/run/" ME ".pid"); OPTIONS.user = strdup("root"); OPTIONS.group = strdup("root"); OPTIONS.match = strdup("."); OPTIONS.avatar = strdup(":robot_face:"); OPTIONS.username = strdup("bolo"); struct option long_opts[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { "verbose", no_argument, NULL, 'v' }, { "endpoint", required_argument, NULL, 'e' }, { "foreground", no_argument, NULL, 'F' }, { "pidfile", required_argument, NULL, 'p' }, { "user", required_argument, NULL, 'u' }, { "group", required_argument, NULL, 'g' }, { "match", required_argument, NULL, 'm' }, { "webhook", required_argument, NULL, 'U' }, { "channel", required_argument, NULL, 'C' }, { "botname", required_argument, NULL, 'N' }, { "avatar", required_argument, NULL, 'A' }, { 0, 0, 0, 0 }, }; for (;;) { int idx = 1; int c = getopt_long(argc, argv, "h?Vv+e:Fp:u:g:m:U:C:N:A:", long_opts, &idx); if (c == -1) break; switch (c) { case 'h': case '?': printf(ME " v%s\n", BOLO_VERSION); printf("Usage: " ME " [-h?FVv] [-e tcp://host:port]\n" " [-l level]\n" " [-u user] [-g group] [-p /path/to/pidfile]\n\n"); printf("Options:\n"); printf(" -?, -h show this help screen\n"); printf(" -F, --foreground don't daemonize, stay in the foreground\n"); printf(" -V, --version show version information and exit\n"); printf(" -v, --verbose turn on debugging, to standard error\n"); printf(" -e, --endpoint bolo broadcast endpoint to connect to\n"); printf(" -u, --user user to run as (if daemonized)\n"); printf(" -g, --group group to run as (if daemonized)\n"); printf(" -p, --pidfile where to store the pidfile (if daemonized)\n"); printf(" -U, --webhook Slack webhook URL for integration\n"); printf(" -C, --channel channel (#channel or @user) to notify\n"); printf(" -N, --botname name to use for the notification robot\n"); printf(" -A, --avatar avatar image to use (either :emoji: or a URL)\n"); exit(0); case 'V': logger(LOG_DEBUG, "handling -V/--version"); printf(ME " v%s\n" "Copyright (c) 2016 The Bolo Authors. All Rights Reserved.\n", BOLO_VERSION); exit(0); case 'v': OPTIONS.verbose++; break; case 'e': free(OPTIONS.endpoint); OPTIONS.endpoint = strdup(optarg); break; case 'F': OPTIONS.daemonize = 0; break; case 'p': free(OPTIONS.pidfile); OPTIONS.pidfile = strdup(optarg); break; case 'u': free(OPTIONS.user); OPTIONS.user = strdup(optarg); break; case 'g': free(OPTIONS.group); OPTIONS.group = strdup(optarg); break; case 'm': free(OPTIONS.match); OPTIONS.match = strdup(optarg); break; case 'U': free(OPTIONS.webhook); OPTIONS.webhook = strdup(optarg); break; case 'C': free(OPTIONS.channel); OPTIONS.channel = strdup(optarg); break; case 'N': free(OPTIONS.username); OPTIONS.username = strdup(optarg); break; case 'A': free(OPTIONS.avatar); OPTIONS.avatar = strdup(optarg); break; default: fprintf(stderr, "unhandled option flag %#02x\n", c); return 1; } } if (!OPTIONS.channel) { fprintf(stderr, "Missing required --channel flag.\n"); return 1; } if (!OPTIONS.webhook) { fprintf(stderr, "Missing required --webhook flag.\n"); return 1; } if (OPTIONS.daemonize) { log_open(ME, "daemon"); log_level(LOG_ERR + OPTIONS.verbose, NULL); mode_t um = umask(0); if (daemonize(OPTIONS.pidfile, OPTIONS.user, OPTIONS.group) != 0) { fprintf(stderr, "daemonization failed: (%i) %s\n", errno, strerror(errno)); return 3; } umask(um); } else { log_open(ME, "console"); log_level(LOG_INFO + OPTIONS.verbose, NULL); } logger(LOG_NOTICE, "starting up"); const char *re_err; int re_off; OPTIONS.re = pcre_compile(OPTIONS.match, 0, &re_err, &re_off, NULL); if (!OPTIONS.re) { fprintf(stderr, "Bad --match pattern (%s): %s\n", OPTIONS.match, re_err); exit(1); } OPTIONS.re_extra = pcre_study(OPTIONS.re, 0, &re_err); logger(LOG_DEBUG, "initializing curl subsystem"); OPTIONS.curl = curl_easy_init(); if (!OPTIONS.curl) { logger(LOG_ERR, "failed to initialize curl subsystem"); return 3; } logger(LOG_DEBUG, "allocating 0MQ context"); void *zmq = zmq_ctx_new(); if (!zmq) { logger(LOG_ERR, "failed to initialize 0MQ context"); return 3; } logger(LOG_DEBUG, "allocating 0MQ SUB socket to talk to %s", OPTIONS.endpoint); void *z = zmq_socket(zmq, ZMQ_SUB); if (!z) { logger(LOG_ERR, "failed to create a SUB socket"); return 3; } logger(LOG_DEBUG, "setting subscriber filter"); if (zmq_setsockopt(z, ZMQ_SUBSCRIBE, "", 0) != 0) { logger(LOG_ERR, "failed to set subscriber filter"); return 3; } logger(LOG_DEBUG, "connecting to %s", OPTIONS.endpoint); if (vzmq_connect(z, OPTIONS.endpoint) != 0) { logger(LOG_ERR, "failed to connect to %s", OPTIONS.endpoint); return 3; } pdu_t *p; logger(LOG_INFO, "waiting for a PDU from %s", OPTIONS.endpoint); signal_handlers(); while (!signalled()) { while ((p = pdu_recv(z))) { logger(LOG_INFO, "received a [%s] PDU of %i frames", pdu_type(p), pdu_size(p)); if (strcmp(pdu_type(p), "TRANSITION") == 0 && pdu_size(p) == 6) { s_notify(p); } pdu_free(p); logger(LOG_INFO, "waiting for a PDU from %s", OPTIONS.endpoint); } } logger(LOG_INFO, "shutting down"); vzmq_shutdown(z, 0); zmq_ctx_destroy(zmq); return 0; }
int main(int argc, char **argv) { int ret = 0; httrackp *opt; #ifdef _WIN32 { WORD wVersionRequested; // requested version WinSock API WSADATA wsadata; // Windows Sockets API data int stat; wVersionRequested = 0x0101; stat = WSAStartup(wVersionRequested, &wsadata); if (stat != 0) { printf("Winsock not found!\n"); return; } else if (LOBYTE(wsadata.wVersion) != 1 && HIBYTE(wsadata.wVersion) != 1) { printf("WINSOCK.DLL does not support version 1.1\n"); WSACleanup(); return; } } #endif signal_handlers(); hts_init(); // Check version compatibility if (hts_sizeof_opt() != sizeof(httrackp)) { fprintf(stderr, "incompatible current httrack library version %s, expected version %s", hts_version(), HTTRACK_VERSIONID); abortLog("incompatible httrack library version, please update both httrack and its library"); } opt = global_opt = hts_create_opt(); assert(opt->size_httrackp == sizeof(httrackp)); CHAIN_FUNCTION(opt, init, htsshow_init, NULL); CHAIN_FUNCTION(opt, uninit, htsshow_uninit, NULL); CHAIN_FUNCTION(opt, start, htsshow_start, NULL); CHAIN_FUNCTION(opt, end, htsshow_end, NULL); CHAIN_FUNCTION(opt, chopt, htsshow_chopt, NULL); CHAIN_FUNCTION(opt, preprocess, htsshow_preprocesshtml, NULL); CHAIN_FUNCTION(opt, postprocess, htsshow_postprocesshtml, NULL); CHAIN_FUNCTION(opt, check_html, htsshow_checkhtml, NULL); CHAIN_FUNCTION(opt, query, htsshow_query, NULL); CHAIN_FUNCTION(opt, query2, htsshow_query2, NULL); CHAIN_FUNCTION(opt, query3, htsshow_query3, NULL); CHAIN_FUNCTION(opt, loop, htsshow_loop, NULL); CHAIN_FUNCTION(opt, check_link, htsshow_check, NULL); CHAIN_FUNCTION(opt, check_mime, htsshow_check_mime, NULL); CHAIN_FUNCTION(opt, pause, htsshow_pause, NULL); CHAIN_FUNCTION(opt, filesave, htsshow_filesave, NULL); CHAIN_FUNCTION(opt, filesave2, htsshow_filesave2, NULL); CHAIN_FUNCTION(opt, linkdetected, htsshow_linkdetected, NULL); CHAIN_FUNCTION(opt, linkdetected2, htsshow_linkdetected2, NULL); CHAIN_FUNCTION(opt, xfrstatus, htsshow_xfrstatus, NULL); CHAIN_FUNCTION(opt, savename, htsshow_savename, NULL); CHAIN_FUNCTION(opt, sendhead, htsshow_sendheader, NULL); CHAIN_FUNCTION(opt, receivehead, htsshow_receiveheader, NULL); ret = hts_main2(argc, argv, opt); if (ret) { fprintf(stderr, "* %s\n", hts_errmsg(opt)); } global_opt = NULL; hts_free_opt(opt); htsthread_wait(); /* wait for pending threads */ hts_uninit(); #ifdef _WIN32 WSACleanup(); #endif return ret; }
int main(int argc, char **argv) { OPTIONS.verbose = 0; OPTIONS.endpoint = strdup("tcp://127.0.0.1:2997"); OPTIONS.daemonize = 1; OPTIONS.pidfile = strdup("/var/run/bolo2redis.pid"); OPTIONS.user = strdup("root"); OPTIONS.group = strdup("root"); OPTIONS.redis_host = strdup("127.0.0.1"); OPTIONS.redis_port = 6379; struct option long_opts[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { "verbose", no_argument, NULL, 'v' }, { "endpoint", required_argument, NULL, 'e' }, { "foreground", no_argument, NULL, 'F' }, { "pidfile", required_argument, NULL, 'p' }, { "user", required_argument, NULL, 'u' }, { "group", required_argument, NULL, 'g' }, { "host", required_argument, NULL, 'H' }, { "port", required_argument, NULL, 'P' }, { 0, 0, 0, 0 }, }; for (;;) { int idx = 1; int c = getopt_long(argc, argv, "h?Vv+e:Fp:u:g:H:P:", long_opts, &idx); if (c == -1) break; switch (c) { case 'h': case '?': printf("bolo2redis v%s\n", BOLO_VERSION); printf("Usage: bolo2redis [-h?FVv] [-e tcp://host:port]\n" " [-H redis.host.or.ip] [-P port]\n" " [-u user] [-g group] [-p /path/to/pidfile]\n\n"); printf("Options:\n"); printf(" -?, -h show this help screen\n"); printf(" -F, --foreground don't daemonize, stay in the foreground\n"); printf(" -V, --version show version information and exit\n"); printf(" -v, --verbose turn on debugging, to standard error\n"); printf(" -e, --endpoint bolo broadcast endpoint to connect to\n"); printf(" -H, --host name or address of redis server\n"); printf(" -P, --port what port redis is running on\n"); printf(" -u, --user user to run as (if daemonized)\n"); printf(" -g, --group group to run as (if daemonized)\n"); printf(" -p, --pidfile where to store the pidfile (if daemonized)\n"); exit(0); case 'V': logger(LOG_DEBUG, "handling -V/--version"); printf("bolo2redis v%s\n" "Copyright (c) 2016 The Bolo Authors. All Rights Reserved.\n", BOLO_VERSION); exit(0); case 'v': OPTIONS.verbose++; break; case 'e': free(OPTIONS.endpoint); OPTIONS.endpoint = strdup(optarg); break; case 'F': OPTIONS.daemonize = 0; break; case 'p': free(OPTIONS.pidfile); OPTIONS.pidfile = strdup(optarg); break; case 'u': free(OPTIONS.user); OPTIONS.user = strdup(optarg); break; case 'g': free(OPTIONS.group); OPTIONS.group = strdup(optarg); break; case 'H': free(OPTIONS.redis_host); OPTIONS.redis_host = strdup(optarg); break; case 'P': OPTIONS.redis_port = atoi(optarg); break; default: fprintf(stderr, "unhandled option flag %#02x\n", c); return 1; } } if (OPTIONS.daemonize) { log_open("bolo2redis", "daemon"); log_level(LOG_ERR + OPTIONS.verbose, NULL); mode_t um = umask(0); if (daemonize(OPTIONS.pidfile, OPTIONS.user, OPTIONS.group) != 0) { fprintf(stderr, "daemonization failed: (%i) %s\n", errno, strerror(errno)); return 3; } umask(um); } else { log_open("bolo2redis", "console"); log_level(LOG_INFO + OPTIONS.verbose, NULL); } logger(LOG_NOTICE, "starting up"); logger(LOG_DEBUG, "allocating 0MQ context"); void *zmq = zmq_ctx_new(); if (!zmq) { logger(LOG_ERR, "failed to initialize 0MQ context"); return 3; } logger(LOG_DEBUG, "allocating 0MQ SUB socket to talk to %s", OPTIONS.endpoint); void *z = zmq_socket(zmq, ZMQ_SUB); if (!z) { logger(LOG_ERR, "failed to create a SUB socket"); return 3; } logger(LOG_DEBUG, "setting subscriber filter"); if (zmq_setsockopt(z, ZMQ_SUBSCRIBE, "", 0) != 0) { logger(LOG_ERR, "failed to set subscriber filter"); return 3; } logger(LOG_DEBUG, "connecting to %s", OPTIONS.endpoint); if (vzmq_connect(z, OPTIONS.endpoint) != 0) { logger(LOG_ERR, "failed to connect to %s", OPTIONS.endpoint); return 3; } logger(LOG_INFO, "connecting to redis at %s:%i", OPTIONS.redis_host, OPTIONS.redis_port); redisContext *redis = redisConnect(OPTIONS.redis_host, OPTIONS.redis_port); if (redis != NULL && redis->err) { logger(LOG_ERR, "failed to connect to redis running at %s:%i: %s", OPTIONS.redis_host, OPTIONS.redis_port, redis->err); return 3; } pdu_t *p; logger(LOG_INFO, "waiting for a PDU from %s", OPTIONS.endpoint); signal_handlers(); while (!signalled()) { while ((p = pdu_recv(z))) { logger(LOG_INFO, "received a [%s] PDU of %i frames", pdu_type(p), pdu_size(p)); if (strcmp(pdu_type(p), "SET.KEYS") == 0 && pdu_size(p) % 2 == 1 ) { int i = 1; while (i < pdu_size(p)) { char *k = pdu_string(p, i++); char *v = pdu_string(p, i++); logger(LOG_DEBUG, "setting key `%s' = '%s'", k, v); redisReply *reply = redisCommand(redis, "SET %s %s", k, v); if (reply->type == REDIS_REPLY_ERROR) { logger(LOG_ERR, "received error from redis: %s", reply->str); } freeReplyObject(reply); free(k); free(v); } } pdu_free(p); logger(LOG_INFO, "waiting for a PDU from %s", OPTIONS.endpoint); } } logger(LOG_INFO, "shutting down"); vzmq_shutdown(z, 0); zmq_ctx_destroy(zmq); return 0; }