Index: trunk/src/sh_database.c
===================================================================
--- trunk/src/sh_database.c	(revision 26)
+++ trunk/src/sh_database.c	(revision 27)
@@ -1192,38 +1192,5 @@
 	}
     }
-#if 0
-  /* apparently slower, see gyule.7 */
-  len = (long) strlen(val);
-
-  if ((val[0] != '\0') && (*size > 2))
-    {
-      if (flag == 1) 
-	{
-	  *end = ',';  ++end;
-	  *end = '\''; ++end; (*size) -= 2; 
-	  *end = '\0';
-	
-	  if ((long) *size > (len+2))
-	    {
-	      (void) sl_strlcat(end, val, (size_t) *size);
-	      end   += len; (*size) -= len;
-	      *end = '\''; ++end;  (*size) -= 1; 
-	    }
-	  *end = '\0'; 
-	}
-      else
-	{
-	  *end = ',';  ++end; (*size) -= 1;
-	  *end = '\0';
-	
-	  if ((long) *size > (len+1))
-	    {
-	      (void) sl_strlcat(end, val, (size_t) *size);
-	      end   += len; (*size) -= len;
-	    }
-	  *end = '\0';
-	}
-    }
-#endif
+
   return end;
 }
@@ -1695,13 +1662,46 @@
 }
 
+/* recursively enter linked list of messages into database, last first
+ */
+int sh_database_insert_rec (dbins * curr, unsigned int depth)
+{
+  long    id = 0;
+  dbins * prev;
+
+  SL_ENTER(_("sh_database_insert_rec"));
+
+  if (curr->next)
+    {
+      prev = curr->next;
+      sl_strlcpy(prev->host, curr->host, 64);
+      id = sh_database_insert_rec (curr->next, (depth + 1));
+    }
+
+  if (id != 0)                       /* this is a server wrapper          */
+    {
+      if (enter_wrapper != 0)
+	{
+	  id = sh_database_entry (curr, id);
+	}
+    }
+  else
+    {
+      /*
+       * id = -1 is the client message; log_ref will be NULL 
+       */
+      if (depth > 0)                  /* this is a client message         */
+	id = sh_database_entry (curr, -1);
+      else                            /* this is a generic server message */
+	id = sh_database_entry (curr, 0);
+    }
+
+  SH_FREE(curr);
+
+  SL_RETURN(id, _("sh_database_insert"));
+}
+
 int sh_database_insert (char * message)
 {
   dbins * db_entry;
-  dbins * prev;
-  dbins * curr;
-  long    id = 0;
-#ifdef HOST_SWITCH
-  char  * temp[64];
-#endif
 
   SL_ENTER(_("sh_database_insert"));
@@ -1714,35 +1714,10 @@
   (void) sh_database_parse (message, db_entry);
 
-  /* Enter the list into the database. Actually, the list can only have
-   * two entries at most.
-   */
-  curr = db_entry;
-  if (curr->next)
-    {
-      prev = curr->next;
-#ifdef HOST_SWITCH
-      strncpy(temp, prev->host,       64);
+  /* recursively enter the linked list into the database
+   */
+  (void) sh_database_insert_rec (db_entry, 0);
+
+  SL_RETURN(0, _("sh_database_insert"));
+}
+
 #endif
-      strncpy(prev->host, curr->host, 64);
-#ifdef HOST_SWITCH
-      strncpy(curr->host, temp,       64);
-#endif
-      id = sh_database_entry (prev, -1);
-      SH_FREE(prev);
-    }
-
-  if (id != 0)                       /* this is a server wrapper          */
-    {
-      if (enter_wrapper != 0)
-	(void) sh_database_entry (curr, id);
-    }
-  else                                /* this is a generic server message */
-    {
-      (void) sh_database_entry (curr, 0);
-    }
-  SH_FREE(curr);
-
-  SL_RETURN(0, _("sh_database_insert"));
-}
-
-#endif
Index: trunk/src/sh_error.c
===================================================================
--- trunk/src/sh_error.c	(revision 26)
+++ trunk/src/sh_error.c	(revision 27)
@@ -639,5 +639,5 @@
 }
 
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 /* set severity for TCP export
  */
@@ -843,5 +843,5 @@
 #endif
 
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
   char   * ex_msg;
 #endif
@@ -862,5 +862,5 @@
   static int syslog_block = 0;
   static int log_block    = 0;
-#if defined(SH_WITH_CLIENT)
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
   static int export_block = 0;
 #endif
@@ -926,4 +926,6 @@
     severity = sev;
 
+  /* these are messages from remote sources
+   */
   if ((severity  & SH_ERR_INET) != 0)
     {
@@ -939,5 +941,5 @@
        ( (errFlags.sysloglevel  & severity    ) == 0 || 
 	 (errFlags.syslog_class & (1 << class)) == 0 )     &&
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_CLIENT)
        ( (errFlags.exportlevel  & severity    ) == 0 ||
 	 (errFlags.export_class & (1 << class)) == 0 )     &&
@@ -958,5 +960,5 @@
 	 (errFlags.mail_class    & (1 << class)) == 0 )
 #ifdef SH_WITH_SERVER
-      && (flag_inet == S_FALSE)
+       && (flag_inet == S_FALSE) /* still log messages from remote sources */
 #endif
        )
@@ -1119,13 +1121,18 @@
        * to log server
        ****************************************************/
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
       /* Export by TCP.
        */
-      if ((errFlags.exportlevel  & severity  )   != 0 &&
-          (errFlags.export_class & (1 << class)) != 0 &&
-          (errFlags.exportlevel  & SH_ERR_NOT)   == 0 &&
-	  class != AUD                                &&
-          sh.flag.isserver != GOOD                    &&
-          (flag_inet == S_FALSE) ) /* don't log inet to export */
+
+      if ( ((errFlags.exportlevel  & severity  )   != 0 &&
+	    (errFlags.export_class & (1 << class)) != 0 &&
+	    (errFlags.exportlevel  & SH_ERR_NOT)   == 0 &&
+	    class != AUD                               )
+#ifdef SH_WITH_SERVER
+	   || (flag_inet == S_TRUE) /* always log inet to export */
+#endif
+          /* sh.flag.isserver != GOOD                    && */
+          /* (flag_inet == S_FALSE) */ /* don't log inet to export */
+	   )
         {
           if (export_block == 0)
@@ -1142,5 +1149,4 @@
 	      sl_snprintf(ex_msg, ex_len, _("%d?%u?%s"),
 		      severity, class, lmsg->msg);
-
               retval = sh_forward (ex_msg);
 	      SH_FREE(ex_msg);
Index: trunk/src/sh_files.c
===================================================================
--- trunk/src/sh_files.c	(revision 26)
+++ trunk/src/sh_files.c	(revision 27)
@@ -454,8 +454,22 @@
 }
 
-
 int sh_files_pushfile_user1 (const char * str_s)
 {
   return (sh_files_pushfile (SH_LEVEL_USER1, str_s));
+}
+
+int sh_files_pushfile_user2 (const char * str_s)
+{
+  return (sh_files_pushfile (SH_LEVEL_USER2, str_s));
+}
+
+int sh_files_pushfile_user3 (const char * str_s)
+{
+  return (sh_files_pushfile (SH_LEVEL_USER3, str_s));
+}
+
+int sh_files_pushfile_user4 (const char * str_s)
+{
+  return (sh_files_pushfile (SH_LEVEL_USER4, str_s));
 }
 
@@ -612,4 +626,16 @@
   return (sh_files_parse_mask(&mask_USER1, str));
 } 
+int sh_files_redef_user2(const char * str)
+{
+  return (sh_files_parse_mask(&mask_USER2, str));
+} 
+int sh_files_redef_user3(const char * str)
+{
+  return (sh_files_parse_mask(&mask_USER3, str));
+} 
+int sh_files_redef_user4(const char * str)
+{
+  return (sh_files_parse_mask(&mask_USER4, str));
+} 
 int sh_files_redef_readonly(const char * str)
 {
@@ -657,4 +683,10 @@
     case SH_LEVEL_USER1:
       return (unsigned long) mask_USER1;
+    case SH_LEVEL_USER2:
+      return (unsigned long) mask_USER2;
+    case SH_LEVEL_USER3:
+      return (unsigned long) mask_USER3;
+    case SH_LEVEL_USER4:
+      return (unsigned long) mask_USER4;
     case SH_LEVEL_PRELINK:
       return (unsigned long) mask_PRELINK;
@@ -1042,4 +1074,19 @@
 {
   return (sh_files_pushdir (SH_LEVEL_USER1, str_s));
+}
+
+int sh_files_pushdir_user2 (const char * str_s)
+{
+  return (sh_files_pushdir (SH_LEVEL_USER2, str_s));
+}
+
+int sh_files_pushdir_user3 (const char * str_s)
+{
+  return (sh_files_pushdir (SH_LEVEL_USER3, str_s));
+}
+
+int sh_files_pushdir_user4 (const char * str_s)
+{
+  return (sh_files_pushdir (SH_LEVEL_USER4, str_s));
 }
 
Index: trunk/src/sh_forward.c
===================================================================
--- trunk/src/sh_forward.c	(revision 26)
+++ trunk/src/sh_forward.c	(revision 27)
@@ -335,5 +335,5 @@
 #endif
 
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 
 static int count_dev_server = 0;
@@ -708,4 +708,21 @@
 static long sh_forward_try (char * errmsg);
 
+static unsigned int ServerPort = SH_DEFAULT_PORT;
+
+int sh_forward_server_port (const char * str)
+{
+  unsigned long l;
+  char * endptr;
+
+  SL_ENTER(_("sh_forward_server_port"));
+
+  l = strtoul (str, &endptr, 0);
+  if (l > 65535 || endptr == str)
+    {
+      SL_RETURN (-1, _("sh_forward_server_port"));
+    }
+  ServerPort = (unsigned int) l;
+  SL_RETURN (0, _("sh_forward_server_port"));
+}
 
 long sh_forward (char * errmsg)
@@ -880,5 +897,5 @@
 
   sockfd = connect_port_2 (sh.srvexport.name, sh.srvexport.alt, 
-			   SH_DEFAULT_PORT, 
+			   ServerPort, 
 			   error_call, &error_num, error_msg, 256);
 
@@ -1441,7 +1458,10 @@
 						flag_err,
 						MSG_TCP_NOCONF);
-			      } else {
+			      } 
+#ifdef SH_WITH_CLIENT
+			      else {
 				sh_socket_server_cmd(buffer);
 			      }
+#endif
 			      flag_err = 0;
 
Index: trunk/src/sh_getopt.c
===================================================================
--- trunk/src/sh_getopt.c	(revision 26)
+++ trunk/src/sh_getopt.c	(revision 27)
@@ -80,4 +80,11 @@
     sh_util_set_interactive },
 #endif
+#if defined(SH_WITH_SERVER) || defined(SH_WITH_CLIENT)
+  { N_("server-port"),  
+    '-', 
+    N_("Set the server port to connect to"),  
+    HAS_ARG_YES, 
+    sh_forward_server_port },
+#endif
 #ifdef SH_WITH_SERVER
   { N_("server"),  
@@ -112,5 +119,5 @@
     HAS_ARG_YES, 
     sh_calls_set_bind_addr },
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_SERVER) || defined(SH_WITH_CLIENT)
   { N_("set-export-severity"),  
     'e', 
@@ -554,5 +561,5 @@
 	  for (i = 0; op_table[i].longopt != NULL; ++i) 
 	    {
-      
+
 	      if (sl_strncmp(_(op_table[i].longopt), 
 			     &argv[1][2], 
@@ -562,5 +569,6 @@
 		  if ( op_table[i].hasArg == HAS_ARG_YES ) 
 		    {
-		      if ( (theequal = strchr(argv[1], '=')) == NULL) 
+		      theequal = strchr(argv[1], '=');
+		      if (theequal == NULL) 
 			{ 
 			  if (argc < 3) 
Index: trunk/src/sh_hash.c
===================================================================
--- trunk/src/sh_hash.c	(revision 26)
+++ trunk/src/sh_hash.c	(revision 27)
@@ -297,4 +297,7 @@
     N_("[User0]"),
     N_("[User1]"),
+    N_("[User2]"),
+    N_("[User3]"),
+    N_("[User4]"),
     N_("[Prelink]"),
     NULL
Index: trunk/src/sh_readconf.c
===================================================================
--- trunk/src/sh_readconf.c	(revision 26)
+++ trunk/src/sh_readconf.c	(revision 27)
@@ -69,4 +69,7 @@
   SH_SECTION_USER0,
   SH_SECTION_USER1,
+  SH_SECTION_USER2,
+  SH_SECTION_USER3,
+  SH_SECTION_USER4,
   SH_SECTION_PRELINK,
 #if defined (SH_WITH_MAIL) 
@@ -108,4 +111,7 @@
   { N_("[User0]"),            SH_SECTION_USER0},
   { N_("[User1]"),            SH_SECTION_USER1},
+  { N_("[User2]"),            SH_SECTION_USER2},
+  { N_("[User3]"),            SH_SECTION_USER3},
+  { N_("[User4]"),            SH_SECTION_USER4},
   { N_("[Prelink]"),          SH_SECTION_PRELINK},
 #ifdef WITH_EXTERNAL
@@ -820,4 +826,16 @@
   { N_("file"),           SH_SECTION_USER1,      SH_SECTION_NONE, 
     sh_files_pushfile_user1 },
+  { N_("dir"),            SH_SECTION_USER2,      SH_SECTION_NONE, 
+    sh_files_pushdir_user2 },
+  { N_("file"),           SH_SECTION_USER2,      SH_SECTION_NONE, 
+    sh_files_pushfile_user2 },
+  { N_("dir"),            SH_SECTION_USER3,      SH_SECTION_NONE, 
+    sh_files_pushdir_user3 },
+  { N_("file"),           SH_SECTION_USER3,      SH_SECTION_NONE, 
+    sh_files_pushfile_user3 },
+  { N_("dir"),            SH_SECTION_USER4,      SH_SECTION_NONE, 
+    sh_files_pushdir_user4 },
+  { N_("file"),           SH_SECTION_USER4,      SH_SECTION_NONE, 
+    sh_files_pushfile_user4 },
   { N_("dir"),            SH_SECTION_PRELINK,    SH_SECTION_NONE, 
     sh_files_pushdir_prelink },
@@ -892,4 +910,13 @@
   { N_("redefuser1"),           SH_SECTION_MISC,   SH_SECTION_NONE, 
     sh_files_redef_user1 },
+
+  { N_("redefuser2"),           SH_SECTION_MISC,   SH_SECTION_NONE, 
+    sh_files_redef_user2 },
+
+  { N_("redefuser3"),           SH_SECTION_MISC,   SH_SECTION_NONE, 
+    sh_files_redef_user3 },
+
+  { N_("redefuser4"),           SH_SECTION_MISC,   SH_SECTION_NONE, 
+    sh_files_redef_user4 },
 
   { N_("redefprelink"),         SH_SECTION_MISC,   SH_SECTION_NONE, 
@@ -941,11 +968,16 @@
 #endif
 
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
   { N_("exportseverity"),      SH_SECTION_LOG,  SH_SECTION_NONE, 
     sh_error_setexport },
   { N_("exportclass"),         SH_SECTION_LOG,  SH_SECTION_NONE, 
     sh_error_export_mask },
+#if defined(SH_WITH_SERVER)
+  { N_("setlogserver"),        SH_SECTION_SRV,  SH_SECTION_MISC, 
+    sh_forward_setlogserver },
+#else
   { N_("setlogserver"),        SH_SECTION_CLT,  SH_SECTION_MISC, 
     sh_forward_setlogserver },
+#endif
 #endif
   { N_("setfilechecktime"),  SH_SECTION_MISC,   SH_SECTION_NONE, 
@@ -1088,4 +1120,7 @@
     N_("severityuser0"),
     N_("severityuser1"),
+    N_("severityuser2"),
+    N_("severityuser3"),
+    N_("severityuser4"),
     N_("severityprelink"),
     NULL
@@ -1104,4 +1139,7 @@
     SH_ERR_T_USER0,       
     SH_ERR_T_USER1,       
+    SH_ERR_T_USER2,       
+    SH_ERR_T_USER3,       
+    SH_ERR_T_USER4,       
     SH_ERR_T_PRELINK,       
   };
Index: trunk/src/sh_srp.c
===================================================================
--- trunk/src/sh_srp.c	(revision 26)
+++ trunk/src/sh_srp.c	(revision 27)
@@ -384,5 +384,5 @@
 }
 
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
   
 
@@ -489,5 +489,5 @@
   
   
-#ifdef SH_WITH_CLIENT
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
   
 char * sh_srp_S_c (char * u_str, char * B_str)
Index: trunk/src/sh_tools.c
===================================================================
--- trunk/src/sh_tools.c	(revision 26)
+++ trunk/src/sh_tools.c	(revision 27)
@@ -695,5 +695,5 @@
 }
 
-#if defined(HAVE_NTIME) || defined(SH_WITH_CLIENT)
+#if defined(HAVE_NTIME) || defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 static
 int sh_write_select(int type, int sockfd, 
@@ -842,5 +842,5 @@
 #endif
 
-#if defined (SH_WITH_CLIENT)
+#if defined (SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 unsigned long write_port (int sockfd, char *buf, unsigned long nbytes, 
 			  int * w_error, int timeout)
@@ -862,5 +862,5 @@
 #endif
 
-#if defined(HAVE_NTIME) || defined(SH_WITH_CLIENT)
+#if defined(HAVE_NTIME) || defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 
 unsigned long read_port (int sockfd, char *buf, unsigned long nbytes, 
@@ -898,5 +898,5 @@
 #endif
 
-#if defined (SH_WITH_CLIENT)
+#if defined (SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 
 int check_request (char * have, char * need)
@@ -952,5 +952,5 @@
 #endif
 
-#if defined (SH_WITH_CLIENT)
+#if defined (SH_WITH_CLIENT) || defined (SH_WITH_SERVER)
 
 void get_header (unsigned char * head, unsigned long * bytes, char * u)
@@ -1032,4 +1032,9 @@
  * (msg_size = payload_size - key_len = payload_size - 48)
  */ 
+
+/* 
+ * only SH_V2_FULLSIZE is used, and only once
+ */
+#if 0
 #ifdef SH_WITH_SERVER
 #define SH_V2_FULLSIZE  240
@@ -1041,4 +1046,6 @@
 #define SH_V2_MESSAGE   960
 #endif
+#endif
+#define SH_V2_FULLSIZE 1024
 
 #ifdef SH_ENCRYPT
@@ -1383,5 +1390,5 @@
 #endif
 
-#if defined (SH_WITH_CLIENT)
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER)
 
 /* verify the checksum of a buffer; checksum comes first
@@ -1535,5 +1542,5 @@
 #endif
 
-#if defined(SH_WITH_CLIENT) || defined(SH_STEALTH) || defined(WITH_GPG) || defined(WITH_PGP)
+#if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER) || defined(SH_STEALTH) || defined(WITH_GPG) || defined(WITH_PGP)
 
 /* --------- secure temporary file ------------ */
Index: trunk/src/sh_unix.c
===================================================================
--- trunk/src/sh_unix.c	(revision 26)
+++ trunk/src/sh_unix.c	(revision 27)
@@ -127,4 +127,7 @@
 unsigned long mask_USER0        = MASK_USER_;
 unsigned long mask_USER1        = MASK_USER_;
+unsigned long mask_USER2        = MASK_USER_;
+unsigned long mask_USER3        = MASK_USER_;
+unsigned long mask_USER4        = MASK_USER_;
 unsigned long mask_ALLIGNORE    = MASK_ALLIGNORE_;
 unsigned long mask_ATTRIBUTES   = MASK_ATTRIBUTES_;
@@ -142,4 +145,7 @@
   mask_USER0        = MASK_USER_;
   mask_USER1        = MASK_USER_;
+  mask_USER2        = MASK_USER_;
+  mask_USER3        = MASK_USER_;
+  mask_USER4        = MASK_USER_;
   mask_ALLIGNORE    = MASK_ALLIGNORE_;
   mask_ATTRIBUTES   = MASK_ATTRIBUTES_;
Index: trunk/src/sh_userfiles.c
===================================================================
--- trunk/src/sh_userfiles.c	(revision 26)
+++ trunk/src/sh_userfiles.c	(revision 27)
@@ -221,4 +221,7 @@
     else if ( strstr(s, "user0")     != NULL ) new->level = SH_LEVEL_USER0;
     else if ( strstr(s, "user1")     != NULL ) new->level = SH_LEVEL_USER1;
+    else if ( strstr(s, "user2")     != NULL ) new->level = SH_LEVEL_USER2;
+    else if ( strstr(s, "user3")     != NULL ) new->level = SH_LEVEL_USER3;
+    else if ( strstr(s, "user4")     != NULL ) new->level = SH_LEVEL_USER4;
     else if ( strstr(s, "prelink")   != NULL ) new->level = SH_LEVEL_PRELINK;
     else            /* The default */          new->level = default_level;
@@ -332,4 +335,13 @@
                     (void) sh_files_pushfile_user1(filepath);
                     break;
+                case SH_LEVEL_USER2:
+                    (void) sh_files_pushfile_user2(filepath);
+                    break;
+                case SH_LEVEL_USER3:
+                    (void) sh_files_pushfile_user3(filepath);
+                    break;
+                case SH_LEVEL_USER4:
+                    (void) sh_files_pushfile_user4(filepath);
+                    break;
                 case SH_LEVEL_PRELINK:
                     (void) sh_files_pushfile_prelink(filepath);
