--- agent/mibgroup/mibII/vacm_conf.c.org	2010-10-16 21:54:18.000000000 +0200
+++ agent/mibgroup/mibII/vacm_conf.c	2010-10-16 22:10:22.000000000 +0200
@@ -10,6 +10,9 @@
  * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
  * Use is subject to license terms specified in the COPYING file
  * distributed with the Net-SNMP package.
+ *
+ * XXX: test with
+ * agent/snmpd -f -c c:/usr/etc/snmp/snmpd.conf -Le -Dauthcomm,com2sec,rw,ro,netsnmp_udp
  */
 
 #include <net-snmp/net-snmp-config.h>
@@ -115,20 +118,20 @@
 init_vacm_snmpd_easy_tokens(void) {
 #if !defined(NETSNMP_DISABLE_SNMPV1) || !defined(NETSNMP_DISABLE_SNMPV2C)
     snmpd_register_config_handler("rwcommunity", vacm_parse_rwcommunity, NULL,
-                                  "community [default|hostname|network/bits [oid]]");
+                                  "community [default|hostname|network/bits [oid|-V view [context]]]");
     snmpd_register_config_handler("rocommunity", vacm_parse_rocommunity, NULL,
-                                  "community [default|hostname|network/bits [oid]]");
+                                  "community [default|hostname|network/bits [oid|-V view [context]]]");
 #ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
     snmpd_register_config_handler("rwcommunity6", vacm_parse_rwcommunity6, NULL,
-                                  "community [default|hostname|network/bits [oid]]");
+                                  "community [default|hostname|network/bits [oid|-V view [context]]]");
     snmpd_register_config_handler("rocommunity6", vacm_parse_rocommunity6, NULL,
-                                  "community [default|hostname|network/bits [oid]]");
+                                  "community [default|hostname|network/bits [oid|-V view [context]]]");
 #endif
 #endif /* support for community based SNMP */
     snmpd_register_config_handler("rwuser", vacm_parse_rwuser, NULL,
-                                  "user [noauth|auth|priv [oid]]");
+                                  "user [noauth|auth|priv [oid|-V view [context]]]");
     snmpd_register_config_handler("rouser", vacm_parse_rouser, NULL,
-                                  "user [noauth|auth|priv [oid]]");
+                                  "user [noauth|auth|priv [oid|-V view [context]]]");
 }
 
 void
@@ -710,12 +713,13 @@
                  const char *publishtoken,
                  void (*parser)(const char *, char *),
                  char *secname, size_t secname_len,
-                 char *viewname, size_t viewname_len, int version)
+                 char *viewname, size_t viewname_len, int version,
+                 const char *context)
 {
     char            line[SPRINT_MAX_LEN];
 
     /*
-     * com2sec6|comsec anonymousSecNameNUM    ADDRESS  COMMUNITY 
+     * com2sec6|com2sec [-Cn CONTEXT] secName address[/netmask] community
      */
     snprintf(secname, secname_len-1, "comm%d", commcount);
     secname[secname_len-1] = '\0';
@@ -723,8 +727,8 @@
         snprintf(viewname, viewname_len-1, "viewComm%d", commcount);
         viewname[viewname_len-1] = '\0';
     }
-    snprintf(line, sizeof(line), "%s %s '%s'",
-             secname, addressname, community);
+    snprintf(line, sizeof(line), "-Cn %s %s %s '%s'",
+             context, secname, addressname, community);  // XXX
     line[ sizeof(line)-1 ] = 0;
     DEBUGMSGTL((publishtoken, "passing: %s %s\n", publishtoken, line));
     (*parser)(publishtoken, line);
@@ -884,6 +888,7 @@
             if (cp)
                 cp = copy_nword(cp, community, sizeof(community));
         }
+        DEBUGMSGTL((token, "community: \"%s\"\n", community));
         /*
          * source address 
          */
@@ -892,6 +897,7 @@
         } else {
             strcpy(addressname, "default");
         }
+        DEBUGMSGTL((token, "setting addressname: \"%s\"\n", addressname));
         /*
          * authlevel has to be noauth 
          */
@@ -910,6 +916,7 @@
         } else {
              cp = copy_nword(cp, theoid, sizeof(theoid));
         }
+        DEBUGMSGTL((token, "setting viewname: \"%s\"\n", viewname));
     } else {
         strcpy(theoid, ".1");
         strcpy(viewname, "_all_");
@@ -935,7 +942,10 @@
              */
             ctxprefix = 0;
         }
+    } else {
+        strcpy(context, "\"\"");    // default context FIXME: or '*'
     }
+    DEBUGMSGTL((token, "setting context: \"%s\"\n", context));
 
     if (viewtypes & VACM_VIEW_WRITE_BIT)
         rw = viewname;
@@ -949,14 +959,16 @@
         vacm_gen_com2sec(commcount, community, addressname,
                          "com2sec", &netsnmp_udp_parse_security,
                          secname, sizeof(secname),
-                         view_ptr, sizeof(viewname), commversion);
+                         view_ptr, sizeof(viewname), commversion,
+                         context[0] ? context : "\"\"");
     }
 #endif
 
 #ifdef NETSNMP_TRANSPORT_UNIX_DOMAIN
     if (parsetype == VACM_CREATE_SIMPLE_COMUNIX ||
         parsetype == VACM_CREATE_SIMPLE_COM) {
-        snprintf(line, sizeof(line), "%s %s '%s'",
+        snprintf(line, sizeof(line), "-Cn %s %s %s '%s'",
+                 context[0] ? context : "\"\"", // FIXME: not checked! ck
                  secname, addressname, community);
         line[ sizeof(line)-1 ] = 0;
         DEBUGMSGTL((token, "passing: %s %s\n", "com2secunix", line));
@@ -970,7 +982,8 @@
         vacm_gen_com2sec(commcount, community, addressname,
                          "com2sec6", &netsnmp_udp6_parse_security,
                          secname, sizeof(secname),
-                         view_ptr, sizeof(viewname), commversion);
+                         view_ptr, sizeof(viewname), commversion,
+                         context[0] ? context : "\"\"");   // FIXME: not checked! ck
     }
 #endif
 #endif /* support for community based SNMP */
@@ -1432,11 +1445,12 @@
         return VACM_NOGROUP;
     }
     DEBUGMSG(("mibII/vacm_vars", ", gn=%s", gp->groupName));
+    DEBUGMSGTL(("mibII/vacm_vars", ", ctxt=\"%s\"", contextNameIndex)); // XXX
 
     ap = vacm_getAccessEntry(gp->groupName, contextNameIndex,
                              pdu->securityModel, pdu->securityLevel);
     if (ap == NULL) {
-        DEBUGMSG(("mibII/vacm_vars", "\n"));
+        DEBUGMSG(("mibII/vacm_vars", " no AccessEntry\n"));
         return VACM_NOACCESS;
     }
 
@@ -1460,7 +1474,7 @@
     vp = vacm_getViewEntry(vn, name, namelen, VACM_MODE_FIND);
 
     if (vp == NULL) {
-        DEBUGMSG(("mibII/vacm_vars", "\n"));
+        DEBUGMSG(("mibII/vacm_vars", " no ViewEntry\n"));
         return VACM_NOVIEW;
     }
     DEBUGMSG(("mibII/vacm_vars", ", vt=%d\n", vp->viewType));
