summaryrefslogtreecommitdiffstats
path: root/lib/privs.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2015-09-15 11:26:44 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2016-04-09 02:33:15 +0200
commit4a9ea50e1b7d0d4172accd3acac46f9cb2e4d531 (patch)
treef87159e142518c20d2474e3533e3d49ccc479a83 /lib/privs.c
parentprivs: fix privilege dropping to use system defined groups (diff)
downloadfrr-4a9ea50e1b7d0d4172accd3acac46f9cb2e4d531.tar.xz
frr-4a9ea50e1b7d0d4172accd3acac46f9cb2e4d531.zip
lib: add getgrouplist() for Solaris
Of course Solaris doesn't have getgrouplist()... Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'lib/privs.c')
-rw-r--r--lib/privs.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/privs.c b/lib/privs.c
index ff0be2fe1..0ca8783dc 100644
--- a/lib/privs.c
+++ b/lib/privs.c
@@ -622,6 +622,41 @@ zprivs_state_null (void)
return zprivs_null_state;
}
+#ifndef HAVE_GETGROUPLIST
+/* Solaris 11 has no getgrouplist() */
+static int
+getgrouplist(const char *user, gid_t group, gid_t *groups, int *ngroups)
+{
+ struct group *grp;
+ size_t usridx;
+ int pos = 0, ret;
+
+ if (pos < *ngroups)
+ groups[pos] = group;
+ pos++;
+
+ setgrent();
+ while ((grp = getgrent()))
+ {
+ if (grp->gr_gid == group)
+ continue;
+ for (usridx = 0; grp->gr_mem[usridx] != NULL; usridx++)
+ if (!strcmp (grp->gr_mem[usridx], user))
+ {
+ if (pos < *ngroups)
+ groups[pos] = grp->gr_gid;
+ pos++;
+ break;
+ }
+ }
+ endgrent();
+
+ ret = (pos <= *ngroups) ? pos : -1;
+ *ngroups = pos;
+ return ret;
+}
+#endif /* HAVE_GETGROUPLIST */
+
void
zprivs_init(struct zebra_privs_t *zprivs)
{