Index: trunk/psLib/src/sysUtils/psLogMsg.c
===================================================================
--- trunk/psLib/src/sysUtils/psLogMsg.c	(revision 1143)
+++ trunk/psLib/src/sysUtils/psLogMsg.c	(revision 1153)
@@ -11,6 +11,6 @@
  *  @author George Gusciora, MHPCC
  *
- *  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-06-30 02:07:47 $
+ *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-06-30 20:22:37 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -45,15 +45,12 @@
 
 #define MAX_LOG_LINE_LENGTH 128
-static int p_psGlobalLogDest = PS_LOG_TO_STDERR; // where to log messages
-static int p_psGlobalLogLevel = PS_LOG_INFO;     // log all messages at this or above
-//static FILE *p_logFP = NULL;
-// The following variables control
-// which information is displayed in
-// log messages.
-static bool p_psLogTime = true;        // Flag to include time info
-static bool p_psLogHost = true;        // Flag to include host info
-static bool p_psLogLevel = true;       // Flag to include level info
-static bool p_psLogName = true;        // Flag to include name info
-static bool p_psLogMsg = true;         // Flag to include message info
+static FILE* logDest = (FILE*)1;       // flag to initialize to stderr before using.
+static int globalLogLevel = PS_LOG_INFO; // log all messages at this or above
+static bool logTime = true;            // Flag to include time info
+static bool logHost = true;            // Flag to include host info
+static bool logLevel = true;           // Flag to include level info
+static bool logName = true;            // Flag to include name info
+static bool logMsg = true;             // Flag to include message info
+
 /*****************************************************************************
 psLogSetLevel(): Set the current log level and return old level.
@@ -68,5 +65,5 @@
 {
     // Save old global log level for changing it.
-    int oldLevel = p_psGlobalLogLevel;
+    int oldLevel = globalLogLevel;
 
     if ((level < MIN_LOG_LEVEL) || (level > MAX_LOG_LEVEL)) {
@@ -77,5 +74,5 @@
 
     // Set new global log level
-    p_psGlobalLogLevel = level;
+    globalLogLevel = level;
 
     // Return old global log level
@@ -95,28 +92,60 @@
  An integer specifying the old log destination.
  *****************************************************************************/
-int psLogSetDestination(int dest)
-{
-    // Save old global log destination before changing it.
-    int old = p_psGlobalLogDest;
-
-    switch (dest) {
-    case PS_LOG_NONE:
-    case PS_LOG_TO_STDOUT:
-    case PS_LOG_TO_STDERR:
-        // Set new global log destination
-        p_psGlobalLogDest = dest;
-        break;
-
-    default:
-        // NOTE: Should you log this error properly?
-        fprintf(stderr,"Unknown p_psGlobalLogDest: %d (ignored)\n", dest);
-        break;
-    }
-
-    // Return old global log destination
-    return old;
-}
-
-
+int psLogSetDestination(const char* dest)
+{
+    char protocol[5];
+    char location[257];
+
+    // if logDest has not been initialized, do so before using it
+    if (logDest==(FILE*)1) {
+        logDest = stderr;
+    }
+
+    if (dest == NULL || strcmp(dest,"none")==0) {
+        if (logDest != NULL && logDest != stderr && logDest != stdout) {
+            fclose(logDest);
+        }
+        logDest = NULL;
+        return 0;
+    }
+
+    if (sscanf(dest,"%4s:%256s",protocol,location) < 2) {
+        psError(__func__,"The specified destination, %s, is malformed.", dest);
+        return 1;
+    }
+
+    if (strcmp(protocol,"dest") == 0) {
+        if (strcmp(location,"stderr") == 0) {
+            if (logDest != NULL && logDest != stderr && logDest != stdout) {
+                fclose(logDest);
+            }
+            logDest = stderr;
+            return 0;
+        }
+        if (strcmp(location,"stdout") == 0) {
+            if (logDest != NULL && logDest != stderr && logDest != stdout) {
+                fclose(logDest);
+            }
+            logDest = stdout;
+            return 0;
+        }
+        psError(__func__,"The location, %s, for protocol 'dest' is invalid.",location);
+        return 1;
+    } else if (strcmp(protocol,"file") == 0) {
+        FILE* file = fopen(location,"w");
+        if (file == NULL) {
+            psError(__func__,"Could not open file '%s' for output.",location);
+            return 1;
+        }
+        if (logDest != NULL && logDest != stderr && logDest != stdout) {
+            fclose(logDest);
+        }
+        logDest = file;
+        return 0;
+    }
+
+    psError(__func__,"Do not know how to handle the protocol '%s'.",protocol);
+    return 1;
+}
 
 /*****************************************************************************
@@ -138,9 +167,9 @@
 {
     // assume nothing desired unless specified
-    p_psLogHost = false;
-    p_psLogLevel = false;
-    p_psLogMsg = false;
-    p_psLogName = false;
-    p_psLogTime = false;
+    logHost = false;
+    logLevel = false;
+    logMsg = false;
+    logName = false;
+    logTime = false;
 
     // if fmt is NULL, no logging is desired.
@@ -160,21 +189,21 @@
         case 'H':
         case 'h':
-            p_psLogHost = true;
+            logHost = true;
             break;
         case 'L':
         case 'l':
-            p_psLogLevel = true;
+            logLevel = true;
             break;
         case 'M':
         case 'm':
-            p_psLogMsg = true;
+            logMsg = true;
             break;
         case 'N':
         case 'n':
-            p_psLogName = true;
+            logName = true;
             break;
         case 'T':
         case 't':
-            p_psLogTime = true;
+            logTime = true;
             break;
         default:
@@ -184,5 +213,5 @@
     }
 
-    if (!p_psLogMsg) {
+    if (!logMsg) {
         psTrace("utils.logMsg", 1,
                 "You must at least log error messages (You chose \"%s\")",
@@ -225,6 +254,11 @@
     struct tm *utc = gmtime(&clock);    // The current gm time.
 
+    // if logDest has not been initialized, do so before using it
+    if (logDest==(FILE*)1) {
+        logDest = stderr;
+    }
+
     // If logging is off, or if the level is too high, return immediately.
-    if ((level > p_psGlobalLogLevel) || (p_psGlobalLogDest == PS_LOG_NONE)) {
+    if ((level > globalLogLevel) || (logDest == NULL)) {
         return;
     }
@@ -270,5 +304,5 @@
 
     // Create the various log fields...
-    if (p_psLogTime) {
+    if (logTime) {
         maxLength -= snprintf(head_ptr, maxLength, "%4d:%02d:%02d %02d:%02d:%02dZ",
                               utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday,
@@ -277,5 +311,5 @@
     }
     // Hostname should be 20 characters.
-    if (p_psLogHost) {
+    if (logHost) {
         if (head_ptr > head) {
             *head_ptr++ = '|';
@@ -284,5 +318,5 @@
         head_ptr += strlen(head_ptr);
     }
-    if (p_psLogLevel) {
+    if (logLevel) {
         if (head_ptr > head) {
             *head_ptr++ = '|';
@@ -292,5 +326,5 @@
     }
     // The name field must be 15 characters.
-    if (p_psLogName) {
+    if (logName) {
         if (head_ptr > head) {
             *head_ptr++ = '|';
@@ -302,38 +336,17 @@
     if (head_ptr > head) {
         *head_ptr++ = '|';
-    } else if (!p_psLogMsg) { // no output desired
+    } else if (!logMsg) { // no output desired
         return;
     }
     *head_ptr = '\0';
 
-    switch (p_psGlobalLogDest) {
-    case PS_LOG_TO_STDOUT:
-        puts(head);
-        if (p_psLogMsg) {
-            vprintf(fmt, ap);
-            if (fmt[strlen(fmt) - 1] != '\n') {
-                putc('\n', stdout);
-            }
-        } else {
-            putc('\n', stdout);
-        }
-        break;
-
-    case PS_LOG_TO_STDERR:
-        fputs(head, stderr);
-        if (p_psLogMsg) {
-            vfprintf(stderr, fmt, ap);
-            if (fmt[strlen(fmt) - 1] != '\n') {
-                putc('\n', stderr);
-            }
-        } else {
-            putc('\n', stderr);
-        }
-        break;
-
-    default:
-        fprintf(stderr, "psLogMsg: You cannot get here (%s:%d)\n",
-                __FILE__, __LINE__);
-        abort();
+    fputs(head, logDest);
+    if (logMsg) {
+        vfprintf(logDest, fmt, ap);
+        if (fmt[strlen(fmt) - 1] != '\n') {
+            fputc('\n', logDest);
+        }
+    } else {
+        fputc('\n', logDest);
     }
 }
