condTimedWait fixed
[public/netxms.git] / src / server / core / admin.cpp
index e57c4f8..83e5ec2 100644 (file)
@@ -1,3 +1,5 @@
+/* $Id: admin.cpp,v 1.7 2005-02-02 22:32:16 alk Exp $ */
+
 /* 
 ** NetXMS - Network Management System
 ** Copyright (C) 2003, 2004 Victor Kirhenshtein
@@ -20,7 +22,7 @@
 **
 **/
 
-#include "nms_core.h"
+#include "nxcore.h"
 #include <local_admin.h>
 
 
 #define SEND_ERROR() \
    { \
       wCmd = LA_RESP_ERROR; \
-      send(sock, (char *)&wCmd, sizeof(WORD), 0); \
+      SendEx(sock, (char *)&wCmd, sizeof(WORD), 0); \
    }
 #define SEND_SUCCESS() \
    { \
       wCmd = LA_RESP_SUCCESS; \
-      send(sock, (char *)&wCmd, sizeof(WORD), 0); \
+      SendEx(sock, (char *)&wCmd, sizeof(WORD), 0); \
    }
 
 
@@ -72,10 +74,10 @@ static BOOL SendString(SOCKET sock, char *szString)
    WORD wLen;
 
    wLen = strlen(szString);
-   if (send(sock, (char *)&wLen, sizeof(WORD), 0) != 2)
+   if (SendEx(sock, (char *)&wLen, sizeof(WORD), 0) != 2)
       return FALSE;
 
-   return send(sock, szString, wLen, 0) == wLen;
+   return SendEx(sock, szString, wLen, 0) == wLen;
 }
 
 
@@ -83,7 +85,7 @@ static BOOL SendString(SOCKET sock, char *szString)
 // Request processing thread
 //
 
-static void ProcessingThread(void *pArg)
+static THREAD_RESULT THREAD_CALL ProcessingThread(void *pArg)
 {
    SOCKET sock = (SOCKET)pArg;
    WORD wCmd;
@@ -148,7 +150,7 @@ static void ProcessingThread(void *pArg)
             break;
          case LA_CMD_GET_FLAGS:
             // Send value of application flags
-            send(sock, (char *)&g_dwFlags, sizeof(DWORD), 0);
+            SendEx(sock, (char *)&g_dwFlags, sizeof(DWORD), 0);
             break;
          case LA_CMD_SET_FLAGS:
             iError = recv(sock, (char *)&dwTemp, sizeof(DWORD), 0);
@@ -171,6 +173,7 @@ static void ProcessingThread(void *pArg)
 close_connection:
    shutdown(sock, 2);
    closesocket(sock);
+   return THREAD_OK;
 }
 
 
@@ -178,19 +181,22 @@ close_connection:
 // Local administrative interface listener thread
 //
 
-void LocalAdminListener(void *pArg)
+THREAD_RESULT THREAD_CALL LocalAdminListener(void *pArg)
 {
    SOCKET sock, sockClient;
    struct sockaddr_in servAddr;
-   int iSize, errorCount = 0;
+   int errorCount = 0;
+   socklen_t iSize;
 
    // Create socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
       WriteLog(MSG_SOCKET_FAILED, EVENTLOG_ERROR_TYPE, "s", "LocalAdminListener");
-      return;
+      return THREAD_OK;
    }
 
+       SetSocketReuseFlag(sock);
+
    // Fill in local address structure
    memset(&servAddr, 0, sizeof(struct sockaddr_in));
    servAddr.sin_family = AF_INET;
@@ -201,7 +207,9 @@ void LocalAdminListener(void *pArg)
    if (bind(sock, (struct sockaddr *)&servAddr, sizeof(struct sockaddr_in)) != 0)
    {
       WriteLog(MSG_BIND_ERROR, EVENTLOG_ERROR_TYPE, "dse", LOCAL_ADMIN_PORT, "LocalAdminListener", WSAGetLastError());
-      exit(1);
+      closesocket(sock);
+      /* TODO: we should initiate shutdown from here */
+      return THREAD_OK;
    }
 
    // Set up queue
@@ -239,4 +247,15 @@ void LocalAdminListener(void *pArg)
    }
 
    closesocket(sock);
+   return THREAD_OK;
 }
+
+///////////////////////////////////////////////////////////////////////////////
+/*
+
+$Log: not supported by cvs2svn $
+Revision 1.6  2005/01/18 15:51:42  alk
++ sockets reuse (*nix only)
+
+
+*/