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 */
*/
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;
}
/**
*/
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");
+ }
}
/**
*/
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;
}
/**
*/
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");
+ }
}
/**
*/
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);
}
/**
*/
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;
}
/**
*/
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;
}
/**
*/
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 */