diff --git a/src/win32-misc.c b/src/win32-misc.c index 8014c8fb13..80eb29cd62 100644 --- a/src/win32-misc.c +++ b/src/win32-misc.c @@ -31,78 +31,78 @@ void setenv(const char *name, const char *value, int overwrite) { - if (overwrite || NULL == getenv(name)) { - char *str = SCMalloc(strlen(name) + strlen(value) + 2); - if (unlikely(str == NULL)) - return; - snprintf(str, strlen(name) + strlen(value) + 1, "%s=%s", name, value); - putenv(str); - SCFree(str); - } + if (overwrite || NULL == getenv(name)) { + char *str = SCMalloc(strlen(name) + strlen(value) + 2); + if (unlikely(str == NULL)) + return; + snprintf(str, strlen(name) + strlen(value) + 1, "%s=%s", name, value); + putenv(str); + SCFree(str); + } } void unsetenv(const char *name) { - char *str = SCMalloc(strlen(name) + 2); - if (unlikely(str == NULL)) - return; - snprintf(str, strlen(name) + 1, "%s=", name); - putenv(str); - SCFree(str); + char *str = SCMalloc(strlen(name) + 2); + if (unlikely(str == NULL)) + return; + snprintf(str, strlen(name) + 1, "%s=", name); + putenv(str); + SCFree(str); } const char* inet_ntop(int af, const void *src, char *dst, uint32_t cnt) { - if (af == AF_INET) - { - struct sockaddr_in in; - memset(&in, 0, sizeof(in)); - in.sin_family = AF_INET; - memcpy(&in.sin_addr, src, sizeof(struct in_addr)); - if (0 == getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST)) - return dst; - } - else if (af == AF_INET6) - { - struct sockaddr_in6 in6; - memset(&in6, 0, sizeof(in6)); - in6.sin6_family = AF_INET6; - memcpy(&in6.sin6_addr, src, sizeof(struct in_addr6)); - if (0 == getnameinfo((struct sockaddr *)&in6, sizeof(struct sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST)) - return dst; - } - return NULL; + if (af == AF_INET) + { + struct sockaddr_in in; + memset(&in, 0, sizeof(in)); + in.sin_family = AF_INET; + memcpy(&in.sin_addr, src, sizeof(struct in_addr)); + if (0 == getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST)) + return dst; + } + else if (af == AF_INET6) + { + struct sockaddr_in6 in6; + memset(&in6, 0, sizeof(in6)); + in6.sin6_family = AF_INET6; + memcpy(&in6.sin6_addr, src, sizeof(struct in_addr6)); + if (0 == getnameinfo((struct sockaddr *)&in6, sizeof(struct sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST)) + return dst; + } + return NULL; } int inet_pton(int af, const char *src, void *dst) { - struct addrinfo hints; - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = af; + struct addrinfo hints; + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = af; - struct addrinfo* result = NULL; - if (0 != getaddrinfo(src, NULL, &hints, &result)) - return -1; + struct addrinfo* result = NULL; + if (0 != getaddrinfo(src, NULL, &hints, &result)) + return -1; - if (result) { - if (result->ai_family == AF_INET) { - struct sockaddr_in* in = (struct sockaddr_in*)result->ai_addr; - memcpy(dst, &in->sin_addr, 4); - } - else if (result->ai_family == AF_INET6) { - struct sockaddr_in6* in6 = (struct sockaddr_in6*)result->ai_addr; - memcpy(dst, &in6->sin6_addr, 16); - } - else { - freeaddrinfo(result); - return -1; - } + if (result) { + if (result->ai_family == AF_INET) { + struct sockaddr_in* in = (struct sockaddr_in*)result->ai_addr; + memcpy(dst, &in->sin_addr, 4); + } + else if (result->ai_family == AF_INET6) { + struct sockaddr_in6* in6 = (struct sockaddr_in6*)result->ai_addr; + memcpy(dst, &in6->sin6_addr, 16); + } + else { + freeaddrinfo(result); + return -1; + } - freeaddrinfo(result); - return 1; - } + freeaddrinfo(result); + return 1; + } - return -1; + return -1; } #endif /* OS_WIN32 */ diff --git a/src/win32-service.c b/src/win32-service.c index 62d79ac5a1..257447e5fc 100644 --- a/src/win32-service.c +++ b/src/win32-service.c @@ -44,14 +44,14 @@ int main(int argc, char **argv); */ int SCRunningAsService(void) { - HANDLE h = INVALID_HANDLE_VALUE; - if ((h = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) { - SCLogInfo("Running as service: yes"); - return 1; - } - CloseHandle(h); - SCLogInfo("Running as service: no"); - return 0; + HANDLE h = INVALID_HANDLE_VALUE; + if ((h = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) { + SCLogInfo("Running as service: yes"); + return 1; + } + CloseHandle(h); + SCLogInfo("Running as service: no"); + return 0; } /** @@ -59,24 +59,24 @@ int SCRunningAsService(void) */ void SCAtExitHandler(void) { - SERVICE_STATUS status = { - SERVICE_WIN32, - SERVICE_STOPPED, - SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN, - NO_ERROR, - NO_ERROR, - 0, - 0 - }; - - SCLogInfo("Exit handler called."); - - /* mark service as stopped */ - if (!SetServiceStatus(service_status_handle, &status)) { - SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); - } else { - SCLogInfo("Service status set to: SERVICE_STOPPED"); - } + SERVICE_STATUS status = { + SERVICE_WIN32, + SERVICE_STOPPED, + SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN, + NO_ERROR, + NO_ERROR, + 0, + 0 + }; + + SCLogInfo("Exit handler called."); + + /* mark service as stopped */ + if (!SetServiceStatus(service_status_handle, &status)) { + SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); + } else { + SCLogInfo("Service status set to: SERVICE_STOPPED"); + } } /** @@ -84,34 +84,34 @@ void SCAtExitHandler(void) */ static DWORD WINAPI SCServiceCtrlHandlerEx(DWORD code, DWORD etype, LPVOID edata, LPVOID context) { - if (code == SERVICE_CONTROL_SHUTDOWN || code == SERVICE_CONTROL_STOP) { - SERVICE_STATUS status = { - SERVICE_WIN32, - SERVICE_STOP_PENDING, - SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN, - NO_ERROR, - NO_ERROR, - 0, - 0 - }; - - SCLogInfo("Service control handler called with %s control code.", - ((code == SERVICE_CONTROL_SHUTDOWN) ? ("SERVICE_CONTROL_SHUTDOWN") : ("SERVICE_CONTROL_STOP"))); - - /* mark service as stop pending */ - if (!SetServiceStatus(service_status_handle, &status)) { - SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); - } else { - SCLogInfo("Service status set to: SERVICE_STOP_PENDING"); - } - - /* mark engine as stopping */ - EngineStop(); - - return NO_ERROR; - } - - return ERROR_CALL_NOT_IMPLEMENTED; + if (code == SERVICE_CONTROL_SHUTDOWN || code == SERVICE_CONTROL_STOP) { + SERVICE_STATUS status = { + SERVICE_WIN32, + SERVICE_STOP_PENDING, + SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN, + NO_ERROR, + NO_ERROR, + 0, + 0 + }; + + SCLogInfo("Service control handler called with %s control code.", + ((code == SERVICE_CONTROL_SHUTDOWN) ? ("SERVICE_CONTROL_SHUTDOWN") : ("SERVICE_CONTROL_STOP"))); + + /* mark service as stop pending */ + if (!SetServiceStatus(service_status_handle, &status)) { + SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); + } else { + SCLogInfo("Service status set to: SERVICE_STOP_PENDING"); + } + + /* mark engine as stopping */ + EngineStop(); + + return NO_ERROR; + } + + return ERROR_CALL_NOT_IMPLEMENTED; } /** @@ -119,48 +119,48 @@ static DWORD WINAPI SCServiceCtrlHandlerEx(DWORD code, DWORD etype, LPVOID edata */ static void WINAPI SCServiceMain(uint32_t argc, char** argv) { - SERVICE_STATUS status = { - SERVICE_WIN32, - SERVICE_RUNNING, - SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN, - NO_ERROR, - NO_ERROR, - 0, - 0 - }; - - if ((service_status_handle = RegisterServiceCtrlHandlerEx(PROG_NAME, SCServiceCtrlHandlerEx, NULL)) == (SERVICE_STATUS_HANDLE)0) { - SCLogError(SC_ERR_SVC, "Can't register service control handler: %d", (int)GetLastError()); - return; - } - - /* register exit handler */ - if (atexit(SCAtExitHandler)) { - SCLogWarning(SC_ERR_SVC, "Can't register exit handler: %d", (int)GetLastError()); - } - - /* mark service as running immediately */ - if (!SetServiceStatus(service_status_handle, &status)) { - SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); - } else { - SCLogInfo("Service status set to: SERVICE_RUNNING"); - } - - SCLogInfo("Entering main function..."); - - /* suricata initialization -> main loop -> uninitialization */ - main(service_argc, service_argv); - - SCLogInfo("Leaving main function."); - - /* mark service as stopped */ - status.dwCurrentState = SERVICE_STOPPED; - - if (!SetServiceStatus(service_status_handle, &status)) { - SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); - } else { - SCLogInfo("Service status set to: SERVICE_STOPPED"); - } + SERVICE_STATUS status = { + SERVICE_WIN32, + SERVICE_RUNNING, + SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN, + NO_ERROR, + NO_ERROR, + 0, + 0 + }; + + if ((service_status_handle = RegisterServiceCtrlHandlerEx(PROG_NAME, SCServiceCtrlHandlerEx, NULL)) == (SERVICE_STATUS_HANDLE)0) { + SCLogError(SC_ERR_SVC, "Can't register service control handler: %d", (int)GetLastError()); + return; + } + + /* register exit handler */ + if (atexit(SCAtExitHandler)) { + SCLogWarning(SC_ERR_SVC, "Can't register exit handler: %d", (int)GetLastError()); + } + + /* mark service as running immediately */ + if (!SetServiceStatus(service_status_handle, &status)) { + SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); + } else { + SCLogInfo("Service status set to: SERVICE_RUNNING"); + } + + SCLogInfo("Entering main function..."); + + /* suricata initialization -> main loop -> uninitialization */ + main(service_argc, service_argv); + + SCLogInfo("Leaving main function."); + + /* mark service as stopped */ + status.dwCurrentState = SERVICE_STOPPED; + + if (!SetServiceStatus(service_status_handle, &status)) { + SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError()); + } else { + SCLogInfo("Service status set to: SERVICE_STOPPED"); + } } /** @@ -171,34 +171,34 @@ static void WINAPI SCServiceMain(uint32_t argc, char** argv) */ int SCServiceInit(int argc, char **argv) { - SERVICE_TABLE_ENTRY DispatchTable[] = { - {PROG_NAME, (LPSERVICE_MAIN_FUNCTION) SCServiceMain}, - {NULL, NULL} - }; + SERVICE_TABLE_ENTRY DispatchTable[] = { + {PROG_NAME, (LPSERVICE_MAIN_FUNCTION) SCServiceMain}, + {NULL, NULL} + }; - /* continue with suricata initialization */ - if (service_initialized) { - SCLogWarning(SC_ERR_SVC, "Service is already initialized."); - return 0; - } + /* continue with suricata initialization */ + if (service_initialized) { + SCLogWarning(SC_ERR_SVC, "Service is already initialized."); + return 0; + } - /* save args */ - service_argc = argc; - service_argv = argv; + /* save args */ + service_argc = argc; + service_argv = argv; - service_initialized = 1; + service_initialized = 1; - SCLogInfo("Entering service control dispatcher..."); + SCLogInfo("Entering service control dispatcher..."); - if (!StartServiceCtrlDispatcher(DispatchTable)) { - /* exit with failure */ - exit(EXIT_FAILURE); - } + if (!StartServiceCtrlDispatcher(DispatchTable)) { + /* exit with failure */ + exit(EXIT_FAILURE); + } - SCLogInfo("Leaving service control dispatcher."); + SCLogInfo("Leaving service control dispatcher."); - /* exit with success */ - exit(EXIT_SUCCESS); + /* exit with success */ + exit(EXIT_SUCCESS); } /** @@ -209,67 +209,67 @@ int SCServiceInit(int argc, char **argv) */ int SCServiceInstall(int argc, char **argv) { - char path[2048]; - SC_HANDLE service = NULL; - SC_HANDLE scm = NULL; - int ret = -1; - int i = 0; - - do { - memset(path, 0, sizeof(path)); - - if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){ - SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError()); - break; - } - - /* skip name of binary itself */ - for (i = 1; i < argc; i++) { - if ((strlen(argv[i]) <= strlen("--service-install")) && (strncmp("--service-install", argv[i], strlen(argv[i])) == 0)) { - continue; - } - strlcat(path, " ", sizeof(path) - strlen(path) - 1); - strlcat(path, argv[i], sizeof(path) - strlen(path) - 1); - } - - if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) { - SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError()); - break; - } - - service = CreateService( - scm, - PROG_NAME, - PROG_NAME, - SERVICE_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_DEMAND_START, - SERVICE_ERROR_NORMAL, - path, - NULL, - NULL, - NULL, - NULL, - NULL); - - if (service == NULL) { - SCLogError(SC_ERR_SVC, "Can't create service: %d", (int)GetLastError()); - break; - } - - ret = 0; - - } while(0); - - if (service) { - CloseServiceHandle(service); - } - - if (scm) { - CloseServiceHandle(scm); - } - - return ret; + char path[2048]; + SC_HANDLE service = NULL; + SC_HANDLE scm = NULL; + int ret = -1; + int i = 0; + + do { + memset(path, 0, sizeof(path)); + + if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){ + SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError()); + break; + } + + /* skip name of binary itself */ + for (i = 1; i < argc; i++) { + if ((strlen(argv[i]) <= strlen("--service-install")) && (strncmp("--service-install", argv[i], strlen(argv[i])) == 0)) { + continue; + } + strlcat(path, " ", sizeof(path) - strlen(path) - 1); + strlcat(path, argv[i], sizeof(path) - strlen(path) - 1); + } + + if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) { + SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError()); + break; + } + + service = CreateService( + scm, + PROG_NAME, + PROG_NAME, + SERVICE_ALL_ACCESS, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_DEMAND_START, + SERVICE_ERROR_NORMAL, + path, + NULL, + NULL, + NULL, + NULL, + NULL); + + if (service == NULL) { + SCLogError(SC_ERR_SVC, "Can't create service: %d", (int)GetLastError()); + break; + } + + ret = 0; + + } while(0); + + if (service) { + CloseServiceHandle(service); + } + + if (scm) { + CloseServiceHandle(scm); + } + + return ret; } /** @@ -280,50 +280,50 @@ int SCServiceInstall(int argc, char **argv) */ int SCServiceRemove(int argc, char **argv) { - SERVICE_STATUS status; - SC_HANDLE service = NULL; - SC_HANDLE scm = NULL; - int ret = -1; - - do { - if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) { - SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError()); - break; - } - - if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) { - SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError()); - break; - } - - if (!QueryServiceStatus(service, &status)) { - SCLogError(SC_ERR_SVC, "Can't query service status: %d", (int)GetLastError()); - break; - } - - if (status.dwCurrentState != SERVICE_STOPPED) { - SCLogError(SC_ERR_SVC, "Service isn't in stopped state: %d", (int)GetLastError()); - break; - } - - if (!DeleteService(service)) { - SCLogError(SC_ERR_SVC, "Can't delete service: %d", (int)GetLastError()); - break; - } - - ret = 0; - - } while(0); - - if (service) { - CloseServiceHandle(service); - } - - if (scm) { - CloseServiceHandle(scm); - } - - return ret; + SERVICE_STATUS status; + SC_HANDLE service = NULL; + SC_HANDLE scm = NULL; + int ret = -1; + + do { + if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) { + SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError()); + break; + } + + if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) { + SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError()); + break; + } + + if (!QueryServiceStatus(service, &status)) { + SCLogError(SC_ERR_SVC, "Can't query service status: %d", (int)GetLastError()); + break; + } + + if (status.dwCurrentState != SERVICE_STOPPED) { + SCLogError(SC_ERR_SVC, "Service isn't in stopped state: %d", (int)GetLastError()); + break; + } + + if (!DeleteService(service)) { + SCLogError(SC_ERR_SVC, "Can't delete service: %d", (int)GetLastError()); + break; + } + + ret = 0; + + } while(0); + + if (service) { + CloseServiceHandle(service); + } + + if (scm) { + CloseServiceHandle(scm); + } + + return ret; } /** @@ -334,61 +334,61 @@ int SCServiceRemove(int argc, char **argv) */ int SCServiceChangeParams(int argc, char **argv) { - char path[2048]; - SC_HANDLE service = NULL; - SC_HANDLE scm = NULL; - int ret = -1; - int i = 0; - - do { - memset(path, 0, sizeof(path)); - - if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){ - SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError()); - break; - } - - /* skip name of binary itself */ - for (i = 1; i < argc; i++) { - if ((strlen(argv[i]) <= strlen("--service-change-params")) && (strncmp("--service-change-params", argv[i], strlen(argv[i])) == 0)) { - continue; - } - strlcat(path, " ", sizeof(path) - strlen(path) - 1); - strlcat(path, argv[i], sizeof(path) - strlen(path) - 1); - } - - if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) { - SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError()); - break; - } - - if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) { - SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError()); - break; - } - - if (!ChangeServiceConfig( - service, - SERVICE_WIN32_OWN_PROCESS, - SERVICE_DEMAND_START, - SERVICE_ERROR_NORMAL, - path, - NULL, - NULL, - NULL, - NULL, - NULL, - PROG_NAME)) - { - SCLogError(SC_ERR_SVC, "Can't change service configuration: %d", (int)GetLastError()); - break; - } - - ret = 0; - - } while(0); - - return ret; + char path[2048]; + SC_HANDLE service = NULL; + SC_HANDLE scm = NULL; + int ret = -1; + int i = 0; + + do { + memset(path, 0, sizeof(path)); + + if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){ + SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError()); + break; + } + + /* skip name of binary itself */ + for (i = 1; i < argc; i++) { + if ((strlen(argv[i]) <= strlen("--service-change-params")) && (strncmp("--service-change-params", argv[i], strlen(argv[i])) == 0)) { + continue; + } + strlcat(path, " ", sizeof(path) - strlen(path) - 1); + strlcat(path, argv[i], sizeof(path) - strlen(path) - 1); + } + + if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) { + SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError()); + break; + } + + if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) { + SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError()); + break; + } + + if (!ChangeServiceConfig( + service, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_DEMAND_START, + SERVICE_ERROR_NORMAL, + path, + NULL, + NULL, + NULL, + NULL, + NULL, + PROG_NAME)) + { + SCLogError(SC_ERR_SVC, "Can't change service configuration: %d", (int)GetLastError()); + break; + } + + ret = 0; + + } while(0); + + return ret; } #endif /* OS_WIN32 */