bool master_udp::run_alone(const char* addrs, const char* path /* = NULL */, unsigned int count /* = 1 */) { // 每个进程只能有一个实例在运行 acl_assert(has_called == false); has_called = true; daemon_mode_ = false; __count_limit = count; acl_assert(addrs && *addrs); #ifdef ACL_WINDOWS acl_init(); #endif ACL_EVENT* eventp = acl_event_new_select(1, 0); set_event(eventp); // 设置基类的事件句柄 ACL_ARGV* tokens = acl_argv_split(addrs, ";,| \t"); ACL_ITER iter; acl_foreach(iter, tokens) { const char* addr = (const char*) iter.data; ACL_VSTREAM* sstream = acl_vstream_bind(addr, 0); if (sstream == NULL) { logger_error("bind %s error %s", addr, last_serror()); close_sstreams(); acl_event_free(eventp); acl_argv_free(tokens); return false; } acl_event_enable_read(eventp, sstream, 0, read_callback, sstream); socket_stream* ss = NEW socket_stream(); if (ss->open(sstream) == false) logger_fatal("open stream error!"); sstream->context = ss; sstreams_.push_back(ss); } acl_argv_free(tokens); // 初始化配置参数 conf_.load(path); service_pre_jail(NULL, NULL); service_init(NULL, NULL); while (!__stop) acl_event_loop(eventp); service_exit(NULL, NULL); // 必须在调用 acl_event_free 前调用 close_sstreams,因为在关闭 // 网络流对象时依然有对 ACL_EVENT 引擎的使用 close_sstreams(); acl_event_free(eventp); return true; }
int main(int argc, char* argv[]) { int ch; acl::acl_cpp_init(); snprintf(__server_addr, sizeof(__server_addr), "127.0.0.1:8088"); snprintf(__local_addr, sizeof(__local_addr), "0.0.0.0:18088"); while ((ch = getopt(argc, argv, "hs:l:o")) > 0) { switch (ch) { case 'h': usage(argv[0]); return 0; case 's': snprintf(__server_addr, sizeof(__server_addr), "%s", optarg); break; case 'l': snprintf(__local_addr, sizeof(__local_addr), "%s", optarg); break; case 'o': __server_fixed = false; break; default: break; } } ACL_EVENT* event = acl_event_new_select(1, 0); run(event); return 0; }
void acl_master_restart_service(ACL_MASTER_SERV *serv) { const char *myname = "acl_master_restart_service"; if (acl_var_master_global_event == NULL) acl_var_master_global_event = acl_event_new_select( acl_var_master_delay_sec, acl_var_master_delay_usec); if (acl_var_master_global_event == NULL) acl_msg_fatal("%s(%d)->%s: acl_event_new null, serr=%s", __FILE__, __LINE__, myname, strerror(errno)); /* * Undo some of the things that master_start_service() did. */ acl_master_wakeup_cleanup(serv); acl_master_status_cleanup(serv); /* * Now undo the undone. */ acl_master_status_init(serv); /* set ACL_MASTER_FLAG_RELOADING flag */ serv->flags |= ACL_MASTER_FLAG_RELOADING; acl_master_avail_listen(serv); /* delete ACL_MASTER_FLAG_RELOADING flag */ serv->flags &= ~ACL_MASTER_FLAG_RELOADING; acl_master_wakeup_init(serv); }
void acl_master_start_service(ACL_MASTER_SERV *serv) { const char *myname = "acl_master_start_service"; if (serv == NULL) acl_msg_fatal("%s(%d): serv null", myname, __LINE__); if (acl_var_master_global_event == NULL) acl_var_master_global_event = acl_event_new_select( acl_var_master_delay_sec, acl_var_master_delay_usec); if (acl_var_master_global_event == NULL) acl_msg_fatal("%s(%d)->%s: acl_event_new null, serr=%s", __FILE__, __LINE__, myname, strerror(errno)); /* * Enable connection requests, wakeup timers, and status updates from * child processes. */ acl_msg_info("%s: starting service %s ...", myname, serv->name); acl_master_listen_init(serv); acl_msg_info("%s: service %s listen init ok ...", myname, serv->name); acl_master_status_init(serv); acl_msg_info("%s: service %s status init ok ...", myname, serv->name); acl_master_avail_listen(serv); acl_msg_info("%s: service %s avail listen ok ...", myname, serv->name); acl_master_wakeup_init(serv); acl_msg_info("%s: service %s wakeup init ok ...", myname, serv->name); acl_msg_info("%s: service started!", myname); }
bool master_proc::run_alone(const char* addrs, const char* path /* = NULL */, int count /* = 1 */) { // 每个进程只能有一个实例在运行 acl_assert(has_called == false); has_called = true; daemon_mode_ = false; __count_limit = count; acl_assert(addrs && *addrs); #ifdef ACL_WINDOWS acl_cpp_init(); #endif ACL_EVENT* eventp = acl_event_new_select(1, 0); set_event(eventp); // 调用基类方法设置事件引擎句柄 std::vector<ACL_VSTREAM*> sstreams; ACL_ARGV* tokens = acl_argv_split(addrs, ";,| \t"); ACL_ITER iter; acl_foreach(iter, tokens) { const char* addr = (const char*) iter.data; ACL_VSTREAM* sstream = acl_vstream_listen(addr, 128); if (sstream == NULL) { logger_error("listen %s error %s", addr, last_serror()); close_all_listener(sstreams); acl_argv_free(tokens); return false; } service_on_listen(sstream); acl_event_enable_listen(eventp, sstream, 0, listen_callback, sstream); sstreams.push_back(sstream); } acl_argv_free(tokens); // 初始化配置参数 conf_.load(path); service_pre_jail(NULL, NULL); service_init(NULL, NULL); while (!__stop) acl_event_loop(eventp); close_all_listener(sstreams); acl_event_free(eventp); service_exit(NULL, NULL); return true; }
ACL_EVENT *acl_event_new(int event_mode, int use_thr, int delay_sec, int delay_usec) { const char *myname = "acl_event_new"; ACL_EVENT *eventp = NULL; if (use_thr) { switch (event_mode) { case ACL_EVENT_SELECT: eventp = acl_event_new_select_thr(delay_sec, delay_usec); break; case ACL_EVENT_KERNEL: eventp = acl_event_new_kernel_thr(delay_sec, delay_usec); break; case ACL_EVENT_POLL: eventp = acl_event_new_poll_thr(delay_sec, delay_usec); break; default: acl_msg_fatal("%s(%d): unsupport %d event", myname, __LINE__, event_mode); break; } } else { switch (event_mode) { case ACL_EVENT_SELECT: eventp = acl_event_new_select(delay_sec, delay_usec); break; case ACL_EVENT_KERNEL: eventp = acl_event_new_kernel(delay_sec, delay_usec); break; case ACL_EVENT_POLL: eventp = acl_event_new_poll(delay_sec, delay_usec); break; case ACL_EVENT_WMSG: /* 使用该值作为消息号 */ eventp = acl_event_new_wmsg((unsigned int) delay_sec); break; default: acl_msg_fatal("%s(%d): unsupport %d event", myname, __LINE__, event_mode); break; } } return eventp; }
void tls_mgr_open(ACL_EVENT *eventp) { /* * Sanity check. */ if (tls_mgr != 0) { if (acl_msg_verbose) acl_msg_info("tls_mgr_open: multiple initialization"); return; } if (eventp == NULL) { eventp = acl_event_new_select(1, 0); acl_pthread_atexit_add(eventp, free_event); } /* * Use whatever IPC is preferred for internal use: UNIX-domain sockets or * Solaris streams. */ #ifndef VAR_TLS_MGR_SERVICE tls_mgr = attr_clnt_create(eventp, "local:" TLS_MGR_CLASS "/" TLS_MGR_SERVICE, var_ipc_timeout, var_ipc_idle_limit, var_ipc_ttl_limit); if (tls_mgr == 0) { acl_msg_warn("attr_clnt_create error, service: local:%s", TLS_MGR_CLASS "/" TLS_MGR_SERVICE); return; } #else tls_mgr = attr_clnt_create(eventp, var_tlsmgr_service, var_ipc_timeout, var_ipc_idle_limit, var_ipc_ttl_limit); if (tls_mgr == 0) { acl_msg_warn("attr_clnt_create error, service: %s", var_tlsmgr_service); return; } #endif acl_pthread_atexit_add(tls_mgr, (void (*)(void*)) attr_clnt_free); attr_clnt_control(tls_mgr, ATTR_CLNT_CTL_PROTO, attr_vprint, attr_vscan, ATTR_CLNT_CTL_END); }
int main(int unused_ac, char **av) { ACL_VSTRING *inbuf = acl_vstring_alloc(10); int status; ARGV *argv = 0; ACL_EVENT *eventp = acl_event_new_select(1, 0); acl_msg_verbose = 3; mail_conf_read(); acl_msg_info("using config files in %s", var_config_dir); if (chdir(var_queue_dir) < 0) acl_msg_fatal("chdir %s: %s", var_queue_dir, acl_last_serror()); tls_mgr_open(eventp); while (acl_vstring_fgets_nonl(inbuf, ACL_VSTREAM_IN)) { argv = argv_split(STR(inbuf), " \t\r\n"); if (argv->argc == 0) { argv_free(argv); continue; } #define COMMAND(argv, str, len) \ (strcasecmp(argv->argv[0], str) == 0 && argv->argc == len) if (COMMAND(argv, "policy", 2)) { int cachable; status = tls_mgr_policy(argv->argv[1], &cachable); acl_vstream_printf("status=%d cachable=%d\n", status, cachable); } else if (COMMAND(argv, "seed", 2)) { ACL_VSTRING *buf = acl_vstring_alloc(10); ACL_VSTRING *hex = acl_vstring_alloc(10); int len = atoi(argv->argv[1]); status = tls_mgr_seed(buf, len); hex_encode(hex, STR(buf), LEN(buf)); acl_vstream_printf("status=%d seed=%s\n", status, STR(hex)); acl_vstring_free(hex); acl_vstring_free(buf); } else if (COMMAND(argv, "lookup", 3)) { ACL_VSTRING *buf = acl_vstring_alloc(10); status = tls_mgr_lookup(argv->argv[1], argv->argv[2], buf); acl_vstream_printf("status=%d session=%.*s\n", status, LEN(buf), STR(buf)); acl_vstring_free(buf); } else if (COMMAND(argv, "update", 4)) { status = tls_mgr_update(argv->argv[1], argv->argv[2], argv->argv[3], strlen(argv->argv[3])); acl_vstream_printf("status=%d\n", status); } else if (COMMAND(argv, "delete", 3)) { status = tls_mgr_delete(argv->argv[1], argv->argv[2]); acl_vstream_printf("status=%d\n", status); } else { acl_vstream_printf("usage:\n" "seed byte_count\n" "policy smtpd|smtp|lmtp\n" "lookup smtpd|smtp|lmtp cache_id\n" "update smtpd|smtp|lmtp cache_id session\n" "delete smtpd|smtp|lmtp cache_id\n"); } acl_vstream_fflush(ACL_VSTREAM_OUT); argv_free(argv); } acl_vstring_free(inbuf); acl_event_free(eventp); return (0); }