]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/smux.c
[autoconf] bugs 162,303,178: Fix 'present but can not be compiled' warnings
[mirror_frr.git] / lib / smux.c
index ddb8bfecaf7309b4ea26428cb84d9b54b42aeebb..8218c44081e44c907c10e369ba1dc3b49d607a08 100644 (file)
@@ -33,7 +33,7 @@
 #include "thread.h"
 #include "linklist.h"
 #include "command.h"
-#include "version.h"
+#include <lib/version.h>
 #include "memory.h"
 #include "sockunion.h"
 #include "smux.h"
@@ -52,16 +52,11 @@ int smux_sock = -1;
 struct list *treelist;
 
 /* SMUX oid. */
-oid *smux_oid;
+oid *smux_oid = NULL;
 size_t smux_oid_len;
 
-/* SMUX default oid. */
-oid *smux_default_oid;
-size_t smux_default_oid_len;
-
 /* SMUX password. */
-char *smux_passwd;
-char *smux_default_passwd = "";
+char *smux_passwd = NULL;
 
 /* SMUX read threads. */
 struct thread *smux_read_thread;
@@ -160,9 +155,9 @@ oid_compare_part (oid *o1, int o1_len, oid *o2, int o2_len)
 }
 \f
 void
-smux_oid_dump (char *prefix, oid *oid, size_t oid_len)
+smux_oid_dump (const char *prefix, oid *oid, size_t oid_len)
 {
-  int i;
+  unsigned int i;
   int first = 1;
   char buf[MAX_OID_LEN * 3];
 
@@ -173,7 +168,7 @@ smux_oid_dump (char *prefix, oid *oid, size_t oid_len)
       sprintf (buf + strlen (buf), "%s%d", first ? "" : ".", (int) oid[i]);
       first = 0;
     }
-  zlog_info ("%s: %s", prefix, buf);
+  zlog_debug ("%s: %s", prefix, buf);
 }
 
 int
@@ -242,9 +237,9 @@ smux_socket ()
 
   memset (&serv, 0, sizeof (struct sockaddr_in));
   serv.sin_family = AF_INET;
-#ifdef HAVE_SIN_LEN
+#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
   serv.sin_len = sizeof (struct sockaddr_in);
-#endif /* HAVE_SIN_LEN */
+#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
 
   sp = getservbyname ("smux", "tcp");
   if (sp != NULL) 
@@ -276,7 +271,7 @@ smux_getresp_send (oid objid[], size_t objid_len, long reqid, long errstat,
   int ret;
   u_char buf[BUFSIZ];
   u_char *ptr, *h1, *h1e, *h2, *h2e;
-  int len, length;
+  size_t len, length;
 
   ptr = buf;
   len = BUFSIZ;
@@ -284,8 +279,8 @@ smux_getresp_send (oid objid[], size_t objid_len, long reqid, long errstat,
 
   if (debug_smux)
     {
-      zlog_info ("SMUX GETRSP send");
-      zlog_info ("SMUX GETRSP reqid: %ld", reqid);
+      zlog_debug ("SMUX GETRSP send");
+      zlog_debug ("SMUX GETRSP reqid: %ld", reqid);
     }
 
   h1 = ptr;
@@ -298,13 +293,13 @@ smux_getresp_send (oid objid[], size_t objid_len, long reqid, long errstat,
                       &reqid, sizeof (reqid));
 
   if (debug_smux)
-    zlog_info ("SMUX GETRSP errstat: %ld", errstat);
+    zlog_debug ("SMUX GETRSP errstat: %ld", errstat);
 
   ptr = asn_build_int (ptr, &len,
                       (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
                       &errstat, sizeof (errstat));
   if (debug_smux)
-    zlog_info ("SMUX GETRSP errindex: %ld", errindex);
+    zlog_debug ("SMUX GETRSP errindex: %ld", errindex);
 
   ptr = asn_build_int (ptr, &len,
                       (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
@@ -327,13 +322,13 @@ smux_getresp_send (oid objid[], size_t objid_len, long reqid, long errstat,
   asn_build_sequence(h1,&length,(u_char)SMUX_GETRSP,ptr-h1e);
 
   if (debug_smux)
-    zlog_info ("SMUX getresp send: %d", ptr - buf);
+    zlog_debug ("SMUX getresp send: %ld", (ptr - buf));
   
   ret = send (smux_sock, buf, (ptr - buf), 0);
 }
 
 char *
-smux_var (char *ptr, int len, oid objid[], size_t *objid_len,
+smux_var (char *ptr, size_t len, oid objid[], size_t *objid_len,
           size_t *var_val_len,
           u_char *var_val_type,
           void **var_value)
@@ -344,15 +339,15 @@ smux_var (char *ptr, int len, oid objid[], size_t *objid_len,
   u_char *val;
 
   if (debug_smux)
-    zlog_info ("SMUX var parse: len %d", len);
+    zlog_debug ("SMUX var parse: len %ld", len);
 
   /* Parse header. */
   ptr = asn_parse_header (ptr, &len, &type);
   
   if (debug_smux)
     {
-      zlog_info ("SMUX var parse: type %d len %d", type, len);
-      zlog_info ("SMUX var parse: type must be %d", 
+      zlog_debug ("SMUX var parse: type %d len %ld", type, len);
+      zlog_debug ("SMUX var parse: type must be %d", 
                 (ASN_SEQUENCE | ASN_CONSTRUCTOR));
     }
 
@@ -375,7 +370,7 @@ smux_var (char *ptr, int len, oid objid[], size_t *objid_len,
     smux_oid_dump ("Request OID", objid, *objid_len);
 
   if (debug_smux)
-    zlog_info ("SMUX val_type: %d", val_type);
+    zlog_debug ("SMUX val_type: %d", val_type);
 
   /* Check request value type. */
   if (debug_smux)
@@ -384,46 +379,46 @@ smux_var (char *ptr, int len, oid objid[], size_t *objid_len,
     case ASN_NULL:
       /* In case of SMUX_GET or SMUX_GET_NEXT val_type is set to
          ASN_NULL. */
-      zlog_info ("ASN_NULL");
+      zlog_debug ("ASN_NULL");
       break;
 
     case ASN_INTEGER:
-      zlog_info ("ASN_INTEGER");
+      zlog_debug ("ASN_INTEGER");
       break;
     case ASN_COUNTER:
     case ASN_GAUGE:
     case ASN_TIMETICKS:
     case ASN_UINTEGER:
-      zlog_info ("ASN_COUNTER");
+      zlog_debug ("ASN_COUNTER");
       break;
     case ASN_COUNTER64:
-      zlog_info ("ASN_COUNTER64");
+      zlog_debug ("ASN_COUNTER64");
       break;
     case ASN_IPADDRESS:
-      zlog_info ("ASN_IPADDRESS");
+      zlog_debug ("ASN_IPADDRESS");
       break;
     case ASN_OCTET_STR:
-      zlog_info ("ASN_OCTET_STR");
+      zlog_debug ("ASN_OCTET_STR");
       break;
     case ASN_OPAQUE:
     case ASN_NSAP:
     case ASN_OBJECT_ID:
-      zlog_info ("ASN_OPAQUE");
+      zlog_debug ("ASN_OPAQUE");
       break;
     case SNMP_NOSUCHOBJECT:
-      zlog_info ("SNMP_NOSUCHOBJECT");
+      zlog_debug ("SNMP_NOSUCHOBJECT");
       break;
     case SNMP_NOSUCHINSTANCE:
-      zlog_info ("SNMP_NOSUCHINSTANCE");
+      zlog_debug ("SNMP_NOSUCHINSTANCE");
       break;
     case SNMP_ENDOFMIBVIEW:
-      zlog_info ("SNMP_ENDOFMIBVIEW");
+      zlog_debug ("SNMP_ENDOFMIBVIEW");
       break;
     case ASN_BIT_STR:
-      zlog_info ("ASN_BIT_STR");
+      zlog_debug ("ASN_BIT_STR");
       break;
     default:
-      zlog_info ("Unknown type");
+      zlog_debug ("Unknown type");
       break;
     }
   return ptr;
@@ -442,16 +437,15 @@ smux_set (oid *reqid, size_t *reqid_len,
   struct variable *v;
   int subresult;
   oid *suffix;
-  int suffix_len;
+  size_t suffix_len;
   int result;
   u_char *statP = NULL;
   WriteMethod *write_method = NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   /* Check */
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode, subtree))
     {
-      subtree = node->data;
       subresult = oid_compare_part (reqid, *reqid_len,
                                     subtree->name, subtree->name_len);
 
@@ -476,7 +470,7 @@ smux_set (oid *reqid, size_t *reqid_len,
               if (result == 0)
                 {
                   if (debug_smux)
-                    zlog_info ("SMUX function call index is %d", v->magic);
+                    zlog_debug ("SMUX function call index is %d", v->magic);
                  
                   statP = (*v->findVar) (v, suffix, &suffix_len, 1,
                                         &val_len, &write_method);
@@ -511,15 +505,14 @@ smux_get (oid *reqid, size_t *reqid_len, int exact,
   struct variable *v;
   int subresult;
   oid *suffix;
-  int suffix_len;
+  size_t suffix_len;
   int result;
   WriteMethod *write_method=NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   /* Check */
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode,subtree))
     {
-      subtree = node->data;
       subresult = oid_compare_part (reqid, *reqid_len, 
                                    subtree->name, subtree->name_len);
 
@@ -544,7 +537,7 @@ smux_get (oid *reqid, size_t *reqid_len, int exact,
              if (result == 0)
                {
                  if (debug_smux)
-                   zlog_info ("SMUX function call index is %d", v->magic);
+                   zlog_debug ("SMUX function call index is %d", v->magic);
 
                  *val = (*v->findVar) (v, suffix, &suffix_len, exact,
                                        val_len, &write_method);
@@ -580,10 +573,10 @@ smux_getnext (oid *reqid, size_t *reqid_len, int exact,
   struct variable *v;
   int subresult;
   oid *suffix;
-  int suffix_len;
+  size_t suffix_len;
   int result;
   WriteMethod *write_method=NULL;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
 
   /* Save incoming request. */
@@ -591,9 +584,8 @@ smux_getnext (oid *reqid, size_t *reqid_len, int exact,
   savelen = *reqid_len;
 
   /* Check */
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode, subtree))
     {
-      subtree = node->data;
       subresult = oid_compare_part (reqid, *reqid_len, 
                                    subtree->name, subtree->name_len);
 
@@ -631,7 +623,7 @@ smux_getnext (oid *reqid, size_t *reqid_len, int exact,
              if (result <= 0)
                {
                  if (debug_smux)
-                   zlog_info ("SMUX function call index is %d", v->magic);
+                   zlog_debug ("SMUX function call index is %d", v->magic);
                  if(result<0)
                    {
                      oid_copy(suffix, v->name, v->namelen);
@@ -667,19 +659,19 @@ smux_parse_get_header (char *ptr, size_t *len, long *reqid)
   ptr = asn_parse_int (ptr, len, &type, reqid, sizeof (*reqid));
 
   if (debug_smux)
-    zlog_info ("SMUX GET reqid: %d len: %d", (int) *reqid, (int) *len);
+    zlog_debug ("SMUX GET reqid: %d len: %d", (int) *reqid, (int) *len);
 
   /* Error status. */
   ptr = asn_parse_int (ptr, len, &type, &errstat, sizeof (errstat));
 
   if (debug_smux)
-    zlog_info ("SMUX GET errstat %ld len: %d", errstat, *len);
+    zlog_debug ("SMUX GET errstat %ld len: %ld", errstat, *len);
 
   /* Error index. */
   ptr = asn_parse_int (ptr, len, &type, &errindex, sizeof (errindex));
 
   if (debug_smux)
-    zlog_info ("SMUX GET errindex %ld len: %d", errindex, *len);
+    zlog_debug ("SMUX GET errindex %ld len: %ld", errindex, *len);
 
   return ptr;
 }
@@ -696,7 +688,7 @@ smux_parse_set (char *ptr, size_t len, int action)
   int ret;
 
   if (debug_smux)
-    zlog_info ("SMUX SET(%s) message parse: len %d",
+    zlog_debug ("SMUX SET(%s) message parse: len %ld",
                (RESERVE1 == action) ? "RESERVE1" : ((FREE == action) ? "FREE" : "COMMIT"),
                len);
 
@@ -708,7 +700,7 @@ smux_parse_set (char *ptr, size_t len, int action)
 
   ret = smux_set (oid, &oid_len, val_type, val, val_len, action);
   if (debug_smux)
-    zlog_info ("SMUX SET ret %d", ret);
+    zlog_debug ("SMUX SET ret %d", ret);
 
   /* Return result. */
   if (RESERVE1 == action)
@@ -727,7 +719,7 @@ smux_parse_get (char *ptr, size_t len, int exact)
   int ret;
 
   if (debug_smux)
-    zlog_info ("SMUX GET message parse: len %d", len);
+    zlog_debug ("SMUX GET message parse: len %ld", len);
   
   /* Parse GET message header. */
   ptr = smux_parse_get_header (ptr, &len, &reqid);
@@ -764,7 +756,7 @@ smux_parse_close (char *ptr, int len)
 
 /* SMUX_RRSP message. */
 void
-smux_parse_rrsp (char *ptr, int len)
+smux_parse_rrsp (char *ptr, size_t len)
 {
   char val;
   long errstat;
@@ -772,12 +764,12 @@ smux_parse_rrsp (char *ptr, int len)
   ptr = asn_parse_int (ptr, &len, &val, &errstat, sizeof (errstat));
 
   if (debug_smux)
-    zlog_info ("SMUX_RRSP value: %d errstat: %ld", val, errstat);
+    zlog_debug ("SMUX_RRSP value: %d errstat: %ld", val, errstat);
 }
 
 /* Parse SMUX message. */
 int
-smux_parse (char *ptr, int len)
+smux_parse (char *ptr, size_t len)
 {
   /* This buffer we'll use for SOUT message. We could allocate it with
      malloc and save only static pointer/lenght, but IMHO static
@@ -797,7 +789,7 @@ process_rest: /* see note below: YYY */
   ptr = asn_parse_header (ptr, &len, &type);
 
   if (debug_smux)
-    zlog_info ("SMUX message received type: %d rest len: %d", type, len);
+    zlog_debug ("SMUX message received type: %d rest len: %ld", type, len);
 
   switch (type)
     {
@@ -814,7 +806,7 @@ process_rest: /* see note below: YYY */
     case SMUX_SOUT:
       /* SMUX_SOUT message is now valied for us. */
       if (debug_smux)
-        zlog_info ("SMUX_SOUT(%s)", rollback ? "rollback" : "commit");
+        zlog_debug ("SMUX_SOUT(%s)", rollback ? "rollback" : "commit");
 
       if (sout_save_len > 0)
         {
@@ -849,32 +841,32 @@ process_rest: /* see note below: YYY */
     case SMUX_CLOSE:
       /* Close SMUX connection. */
       if (debug_smux)
-       zlog_info ("SMUX_CLOSE");
+       zlog_debug ("SMUX_CLOSE");
       smux_parse_close (ptr, len);
       return -1;
       break;
     case SMUX_RRSP:
       /* This is response for register message. */
       if (debug_smux)
-       zlog_info ("SMUX_RRSP");
+       zlog_debug ("SMUX_RRSP");
       smux_parse_rrsp (ptr, len);
       break;
     case SMUX_GET:
       /* Exact request for object id. */
       if (debug_smux)
-       zlog_info ("SMUX_GET");
+       zlog_debug ("SMUX_GET");
       smux_parse_get (ptr, len, 1);
       break;
     case SMUX_GETNEXT:
       /* Next request for object id. */
       if (debug_smux)
-       zlog_info ("SMUX_GETNEXT");
+       zlog_debug ("SMUX_GETNEXT");
       smux_parse_get (ptr, len, 0);
       break;
     case SMUX_SET:
       /* SMUX_SET is supported with some limitations. */
       if (debug_smux)
-       zlog_info ("SMUX_SET");
+       zlog_debug ("SMUX_SET");
 
       /* save the data for future SMUX_SOUT */
       memcpy (sout_save_buff, ptr, len);
@@ -902,14 +894,14 @@ smux_read (struct thread *t)
   smux_read_thread = NULL;
 
   if (debug_smux)
-    zlog_info ("SMUX read start");
+    zlog_debug ("SMUX read start");
 
   /* Read message from SMUX socket. */
   len = recv (sock, buf, SMUXMAXPKTSIZE, 0);
 
   if (len < 0)
     {
-      zlog_warn ("Can't read all SMUX packet: %s", strerror (errno));
+      zlog_warn ("Can't read all SMUX packet: %s", safe_strerror (errno));
       close (sock);
       smux_sock = -1;
       smux_event (SMUX_CONNECT, 0);
@@ -926,7 +918,7 @@ smux_read (struct thread *t)
     }
 
   if (debug_smux)
-    zlog_info ("SMUX read len: %d", len);
+    zlog_debug ("SMUX read len: %d", len);
 
   /* Parse the message. */
   ret = smux_parse (buf, len);
@@ -950,15 +942,15 @@ smux_open (int sock)
 {
   u_char buf[BUFSIZ];
   u_char *ptr;
-  int len;
+  size_t len;
   u_long version;
   u_char progname[] = QUAGGA_PROGNAME "-" QUAGGA_VERSION;
 
   if (debug_smux)
     {
       smux_oid_dump ("SMUX open oid", smux_oid, smux_oid_len);
-      zlog_info ("SMUX open progname: %s", progname);
-      zlog_info ("SMUX open password: %s", smux_passwd);
+      zlog_debug ("SMUX open progname: %s", progname);
+      zlog_debug ("SMUX open password: %s", smux_passwd);
     }
 
   ptr = buf;
@@ -971,7 +963,7 @@ smux_open (int sock)
   version = 0;
   ptr = asn_build_int (ptr, &len, 
                       (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
-                      &version, sizeof (u_long));
+                      &version, sizeof (version));
 
   /* SMUX connection oid. */
   ptr = asn_build_objid (ptr, &len,
@@ -1004,10 +996,10 @@ smux_trap (oid *name, size_t namelen,
           struct trap_object *trapobj, size_t trapobjlen,
           unsigned int tick, u_char sptrap)
 {
-  int i;
+  unsigned int i;
   u_char buf[BUFSIZ];
   u_char *ptr;
-  int len, length;
+  size_t len, length;
   struct in_addr addr;
   unsigned long val;
   u_char *h1, *h1e;
@@ -1034,25 +1026,25 @@ smux_trap (oid *name, size_t namelen,
   ptr = asn_build_string (ptr, &len, 
                          (u_char)
                          (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_IPADDRESS),
-                         (u_char *)&addr, sizeof (struct in_addr));
+                         (u_char *)&addr, sizeof (addr));
 
   /* Generic trap integer. */
   val = SNMP_TRAP_ENTERPRISESPECIFIC;
   ptr = asn_build_int (ptr, &len, 
                       (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
-                      &val, sizeof (int));
+                      &val, sizeof (val));
 
   /* Specific trap integer. */
   val = sptrap;
   ptr = asn_build_int (ptr, &len, 
                       (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
-                      &val, sizeof (int));
+                      &val, sizeof (val));
 
   /* Timeticks timestamp. */
   val = 0;
   ptr = asn_build_unsigned_int (ptr, &len, 
                                (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_TIMETICKS),
-                               &val, sizeof (int));
+                               &val, sizeof (val));
   
   /* Variables. */
   h1 = ptr;
@@ -1073,18 +1065,39 @@ smux_trap (oid *name, size_t namelen,
       u_char val_type;
 
       /* Make OID. */
-      oid_copy (oid, name, namelen);
-      oid_copy (oid + namelen, trapobj[i].name, trapobj[i].namelen);
-      oid_copy (oid + namelen + trapobj[i].namelen, iname, inamelen);
-      oid_len = namelen + trapobj[i].namelen + inamelen;
+      if (trapobj[i].namelen > 0) 
+        {
+          oid_copy (oid, name, namelen);
+          oid_copy (oid + namelen, trapobj[i].name, trapobj[i].namelen);
+          oid_copy (oid + namelen + trapobj[i].namelen, iname, inamelen);
+          oid_len = namelen + trapobj[i].namelen + inamelen;
+        }
+      else 
+        {
+          oid_copy (oid, name, namelen);
+          oid_copy (oid + namelen, trapobj[i].name, trapobj[i].namelen * (-1));
+          oid_len = namelen + trapobj[i].namelen * (-1) ;
+        }
 
-      if (debug_smux)
-       smux_oid_dump ("Trap", oid, oid_len);
+      if (debug_smux) 
+        {
+          smux_oid_dump ("Trap", name, namelen);
+          if (trapobj[i].namelen < 0)
+            smux_oid_dump ("Trap", 
+                           trapobj[i].name, (- 1) * (trapobj[i].namelen));
+          else 
+            {
+              smux_oid_dump ("Trap", trapobj[i].name, (trapobj[i].namelen));
+              smux_oid_dump ("Trap", iname, inamelen);
+            }
+          smux_oid_dump ("Trap", oid, oid_len);
+          zlog_info ("BUFSIZ: %d // oid_len: %lu", BUFSIZ, (u_long)oid_len);
+      }
 
       ret = smux_get (oid, &oid_len, 1, &val_type, &val, &val_len);
 
       if (debug_smux)
-       zlog_info ("smux_get result %d", ret);
+       zlog_debug ("smux_get result %d", ret);
 
       if (ret == 0)
        ptr = snmp_build_var_op (ptr, oid, &oid_len,
@@ -1108,21 +1121,20 @@ smux_register (int sock)
 {
   u_char buf[BUFSIZ];
   u_char *ptr;
-  int len, ret;
+  int ret;
+  size_t len;
   long priority;
   long operation;
   struct subtree *subtree;
-  struct listnode *node;
+  struct listnode *node, *nnode;
 
   ret = 0;
 
-  for (node = treelist->head; node; node = node->next)
+  for (ALL_LIST_ELEMENTS (treelist, node, nnode, subtree))
     {
       ptr = buf;
       len = BUFSIZ;
 
-      subtree = node->data;
-
       /* SMUX RReq Header. */
       ptr = asn_build_header (ptr, &len, (u_char) SMUX_RREQ, 0);
 
@@ -1136,19 +1148,19 @@ smux_register (int sock)
       priority = -1;
       ptr = asn_build_int (ptr, &len, 
                          (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
-                         &priority, sizeof (u_long));
+                         &priority, sizeof (priority));
 
       /* Operation. */
       operation = 2; /* Register R/W */
       ptr = asn_build_int (ptr, &len, 
                          (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER),
-                         &operation, sizeof (u_long));
+                         &operation, sizeof (operation));
 
       if (debug_smux)
         {
           smux_oid_dump ("SMUX register oid", subtree->name, subtree->name_len);
-          zlog_info ("SMUX register priority: %ld", priority);
-          zlog_info ("SMUX register operation: %ld", operation);
+          zlog_debug ("SMUX register priority: %ld", priority);
+          zlog_debug ("SMUX register operation: %ld", operation);
         }
 
       len = BUFSIZ;
@@ -1167,7 +1179,7 @@ smux_connect (struct thread *t)
   int ret;
 
   if (debug_smux)
-    zlog_info ("SMUX connect try %d", fail + 1);
+    zlog_debug ("SMUX connect try %d", fail + 1);
 
   /* Clear thread poner of myself. */
   smux_connect_thread = NULL;
@@ -1185,7 +1197,7 @@ smux_connect (struct thread *t)
   ret = smux_open (smux_sock);
   if (ret < 0)
     {
-      zlog_warn ("SMUX open message send failed: %s", strerror (errno));
+      zlog_warn ("SMUX open message send failed: %s", safe_strerror (errno));
       close (smux_sock);
       smux_sock = -1;
       if (++fail < SMUX_MAX_FAILURE)
@@ -1197,7 +1209,7 @@ smux_connect (struct thread *t)
   ret = smux_register (smux_sock);
   if (ret < 0)
     {
-      zlog_warn ("SMUX register message send failed: %s", strerror (errno));
+      zlog_warn ("SMUX register message send failed: %s", safe_strerror (errno));
       close (smux_sock);
       smux_sock = -1;
       if (++fail < SMUX_MAX_FAILURE)
@@ -1249,7 +1261,7 @@ smux_event (enum smux_event event, int sock)
 }
 \f
 int
-smux_str2oid (char *str, oid *oid, size_t *oid_len)
+smux_str2oid (const char *str, oid *oid, size_t *oid_len)
 {
   int len;
   int val;
@@ -1303,7 +1315,7 @@ smux_oid_dup (oid *objid, size_t objid_len)
 }
 
 int
-smux_peer_oid (struct vty *vty, char *oid_str, char *passwd_str)
+smux_peer_oid (struct vty *vty, const char *oid_str, const char *passwd_str)
 {
   int ret;
   oid oid[MAX_OID_LEN];
@@ -1316,10 +1328,14 @@ smux_peer_oid (struct vty *vty, char *oid_str, char *passwd_str)
       return CMD_WARNING;
     }
 
-  if (smux_oid && smux_oid != smux_default_oid)
-    free (smux_oid);
+  if (smux_oid)
+    {
+      free (smux_oid);
+      smux_oid = NULL;
+    }
 
-  if (smux_passwd && smux_passwd != smux_default_passwd)
+  /* careful, smux_passwd might point to string constant */
+  if (smux_passwd)
     {
       free (smux_passwd);
       smux_passwd = NULL;
@@ -1330,8 +1346,10 @@ smux_peer_oid (struct vty *vty, char *oid_str, char *passwd_str)
 
   if (passwd_str)
     smux_passwd = strdup (passwd_str);
+  else
+    smux_passwd = strdup ("");
 
-  return CMD_SUCCESS;
+  return 0;
 }
 
 int
@@ -1363,17 +1381,19 @@ smux_header_generic (struct variable *v, oid *name, size_t *length, int exact,
 int
 smux_peer_default ()
 {
-  if (smux_oid != smux_default_oid)
+  if (smux_oid)
     {
       free (smux_oid);
-      smux_oid = smux_default_oid;
-      smux_oid_len = smux_default_oid_len;
+      smux_oid = NULL;
     }
-  if (smux_passwd != smux_default_passwd)
+  
+  /* careful, smux_passwd might be pointing at string constant */
+  if (smux_passwd)
     {
       free (smux_passwd);
-      smux_passwd = smux_default_passwd;
+      smux_passwd = NULL;
     }
+
   return CMD_SUCCESS;
 }
 
@@ -1384,7 +1404,13 @@ DEFUN (smux_peer,
        "SNMP MUX peer settings\n"
        "Object ID used in SMUX peering\n")
 {
-  return smux_peer_oid (vty, argv[0], NULL);
+  if (smux_peer_oid (vty, argv[0], NULL) == 0)
+    {
+      smux_start();
+      return CMD_SUCCESS;
+    }
+  else
+    return CMD_WARNING;
 }
 
 DEFUN (smux_peer_password,
@@ -1395,39 +1421,50 @@ DEFUN (smux_peer_password,
        "SMUX peering object ID\n"
        "SMUX peering password\n")
 {
-  return smux_peer_oid (vty, argv[0], argv[1]);
+  if (smux_peer_oid (vty, argv[0], argv[1]) == 0)
+    {
+      smux_start();
+      return CMD_SUCCESS;
+    }
+  else
+    return CMD_WARNING;
 }
 
 DEFUN (no_smux_peer,
        no_smux_peer_cmd,
-       "no smux peer OID",
+       "no smux peer",
        NO_STR
        "SNMP MUX protocol settings\n"
-       "SNMP MUX peer settings\n"
-       "Object ID used in SMUX peering\n")
+       "SNMP MUX peer settings\n")
 {
+  smux_stop();
   return smux_peer_default ();
 }
 
-DEFUN (no_smux_peer_password,
-       no_smux_peer_password_cmd,
+ALIAS (no_smux_peer,
+       no_smux_peer_oid_cmd,
+       "no smux peer OID",
+       NO_STR
+       "SNMP MUX protocol settings\n"
+       "SNMP MUX peer settings\n"
+       "SMUX peering object ID\n")
+
+ALIAS (no_smux_peer,
+       no_smux_peer_oid_password_cmd,
        "no smux peer OID PASSWORD",
        NO_STR
        "SNMP MUX protocol settings\n"
        "SNMP MUX peer settings\n"
        "SMUX peering object ID\n"
        "SMUX peering password\n")
-{
-  return smux_peer_default ();
-}
 
 int
 config_write_smux (struct vty *vty)
 {
   int first = 1;
-  int i;
+  unsigned int i;
 
-  if (smux_oid != smux_default_oid || smux_passwd != smux_default_passwd)
+  if (smux_oid)
     {
       vty_out (vty, "smux peer ");
       for (i = 0; i < smux_oid_len; i++)
@@ -1442,7 +1479,8 @@ config_write_smux (struct vty *vty)
 
 /* Register subtree to smux master tree. */
 void
-smux_register_mib (char *descr, struct variable *var, size_t width, int num, 
+smux_register_mib (const char *descr, struct variable *var, 
+                   size_t width, int num, 
                   oid name[], size_t namelen)
 {
   struct subtree *tree;
@@ -1474,16 +1512,8 @@ smux_tree_cmp(struct subtree *tree1, struct subtree *tree2)
 
 /* Initialize some values then schedule first SMUX connection. */
 void
-smux_init (struct thread_master *tm, oid defoid[], size_t defoid_len)
+smux_init (struct thread_master *tm)
 {
-  /* Set default SMUX oid. */
-  smux_default_oid = defoid;
-  smux_default_oid_len = defoid_len;
-
-  smux_oid = smux_default_oid;
-  smux_oid_len = smux_default_oid_len;
-  smux_passwd = smux_default_passwd;
-
   /* copy callers thread master */
   master = tm;
   
@@ -1497,7 +1527,8 @@ smux_init (struct thread_master *tm, oid defoid[], size_t defoid_len)
   install_element (CONFIG_NODE, &smux_peer_cmd);
   install_element (CONFIG_NODE, &smux_peer_password_cmd);
   install_element (CONFIG_NODE, &no_smux_peer_cmd);
-  install_element (CONFIG_NODE, &no_smux_peer_password_cmd);
+  install_element (CONFIG_NODE, &no_smux_peer_oid_cmd);
+  install_element (CONFIG_NODE, &no_smux_peer_oid_password_cmd);
 }
 
 void