CHANGES: snmpd: FEATURES: 1019429: Set supplementary groups via initgroups(3)


git-svn-id: file:///home/hardaker/lib/sf-bkups/net-snmp-convert-svnrepo/trunk@16437 06827809-a52a-0410-b366-d66718629ded
diff --git a/agent/snmpd.c b/agent/snmpd.c
index 2ab395d..bc115f5 100644
--- a/agent/snmpd.c
+++ b/agent/snmpd.c
@@ -429,6 +429,9 @@
     int fd;
     FILE           *PID;
 #endif
+#if HAVE_GETPWNAM && HAVE_PWD_H
+    struct passwd  *info;
+#endif
 
 #ifndef WIN32
     /*
@@ -735,7 +738,6 @@
                 uid = strtoul(optarg, &ecp, 10);
                 if (*ecp) {
 #if HAVE_GETPWNAM && HAVE_PWD_H
-                    struct passwd  *info;
                     info = getpwnam(optarg);
                     if (info) {
                         uid = info->pw_uid;
@@ -980,6 +982,19 @@
                 exit(1);
             }
         }
+#if HAVE_GETPWNAM && HAVE_PWD_H && HAVE_INITGROUPS
+        info = getpwuid(uid);
+        if (info) {
+            DEBUGMSGTL(("snmpd/main", "Supplementary groups for %s.\n", info->pw_name));
+            if (initgroups(info->pw_name, (gid != 0 ? gid : info->pw_gid)) == -1) {
+                snmp_log_perror("initgroups failed");
+                if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
+                                            NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
+                    exit(1);
+                }
+            }
+        }
+#endif
     }
 #endif
 #endif