#include #include #include #include #include "log_common.h" #include "ulog_api.h" #define SEV_EVENT_TIMEOUT 1 #define SEV_CMD "systemctl restart rsyslog" static struct event_base* g_ev_base = NULL; static struct event *g_ev_exit = NULL; static struct event *g_ev_sev = NULL; static void signal_exit(evutil_socket_t fd, short event, void *arg) { struct event *signal = arg; ULOG_DEBUG(g_log, "%s: got signal %d\n", __FUNCTION__, event_get_signal(signal)); event_del(signal); } static void sev_restart(evutil_socket_t fd, short event, void *arg) { struct event *signal = arg; ULOG_DEBUG(g_log, "%s: got signal %d\n", __FUNCTION__, event_get_signal(signal)); FILE *pp = popen(SEV_CMD, "r"); if (pp == NULL) { ULOG_ERR(g_log, "Open cmd:%s is failure:%s", SEV_CMD, strerror(errno)); goto END; } char buff[256]; while(fread(buff, 1, sizeof(buff), pp) > 0) { ULOG_ERR(g_log, "Executing cmd:%s is failure, response content is %s", SEV_CMD, buff); break; } END: if (pp != NULL) { pclose(pp); } event_del(signal); } int called = 0; static void signal_cb(evutil_socket_t fd, short event, void *arg) { struct event *signal = arg; printf("signal_cb: got signal %d\n", event_get_signal(signal)); if (called >= 2) event_del(signal); called++; } int log_sev_init() { ULOG_INFO(g_log, "Log service is initiating"); g_ev_base = event_base_new(); if (g_ev_base == NULL) { ULOG_ERR(g_log, "Allacting event base is failure"); goto FAIL; } g_ev_exit = evsignal_new(g_ev_base, SIGINT, signal_exit, event_self_cbarg()); if (g_ev_exit == NULL) { ULOG_ERR(g_log, "Allacting singal of event exit is failure"); goto FAIL; } /* g_ev_sev = evsignal_new(g_ev_base, -1, sev_restart, event_self_cbarg()); if (g_ev_sev == NULL) { ULOG_ERR(g_log, "Allacting singal of event service is failure"); goto FAIL; } */ //struct timeval tv = {SEV_EVENT_TIMEOUT, 0}; if (event_add(g_ev_exit, NULL) != 0) { ULOG_ERR(g_log, "Adding event exit is failure"); goto FAIL; } ULOG_INFO(g_log, "Log service which is initited is success"); return 0; FAIL: log_sev_free(); ULOG_ERR(g_log, "Log service which is initited is failure"); return -1; } int log_sev_wait() { int ret = event_base_dispatch(g_ev_base); if (ret == -1) { ULOG_ERR(g_log, "service waiting is failure"); } else if (ret == 1) { ULOG_INFO(g_log, "No events were registered"); } return ret; } int log_sev_exit() { if (g_ev_exit == NULL) { ULOG_WARNING(g_log, "Event exit was initiated"); return -1; } event_active(g_ev_exit, 0, 0); return 0; } int log_sev_free() { if (g_ev_sev != NULL) { event_free(g_ev_sev); g_ev_sev = NULL; } if (g_ev_exit != NULL) { event_free(g_ev_exit); g_ev_exit = NULL; } if (g_ev_base != NULL) { event_base_free(g_ev_base); g_ev_base = NULL; } } int log_sev_restart() { if (g_ev_sev == NULL) { ULOG_WARNING(g_log, "Event service was initiated"); return -1; } // 如果pending,就不需要添加事件 if (event_pending(g_ev_sev, 0, NULL)) { ULOG_DEBUG(g_log, "Not need set event service"); return 0; } struct timeval tv = {SEV_EVENT_TIMEOUT, 0}; if (event_add(g_ev_sev, NULL) != 0) { ULOG_ERR(g_log, "Setting event service is failure"); return -1; } ULOG_DEBUG(g_log, "Setting event service is success"); return 0; }