diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2015-09-15 02:26:44 -0700 | 
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2016-04-08 20:33:15 -0400 | 
| commit | 4a9ea50e1b7d0d4172accd3acac46f9cb2e4d531 (patch) | |
| tree | f87159e142518c20d2474e3533e3d49ccc479a83 /lib/privs.c | |
| parent | 6d7578168127542e0cb9e17020bf9983dec18108 (diff) | |
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.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/privs.c b/lib/privs.c index ff0be2fe12..0ca8783dcc 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)  {  | 
