aboutsummaryrefslogtreecommitdiffstats
path: root/src/libnsss/nsss_grouplist_adjust.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2019-09-21 21:17:34 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2019-09-21 21:17:34 +0000
commit426039bdd70a5502d56fbc2a9dcde5817b145c1c (patch)
treed796c9013d131297819b9d7637bea628d9c117d7 /src/libnsss/nsss_grouplist_adjust.c
parentce150eb99b4af0f509e86c0e077abb5203253049 (diff)
downloadnsss-426039bdd70a5502d56fbc2a9dcde5817b145c1c.tar.gz
Add getgrouplist() support (stubbed in nsssd-nslcd)
Diffstat (limited to 'src/libnsss/nsss_grouplist_adjust.c')
-rw-r--r--src/libnsss/nsss_grouplist_adjust.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/libnsss/nsss_grouplist_adjust.c b/src/libnsss/nsss_grouplist_adjust.c
new file mode 100644
index 0000000..fda4882
--- /dev/null
+++ b/src/libnsss/nsss_grouplist_adjust.c
@@ -0,0 +1,24 @@
+/* ISC license. */
+
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+
+#include <nsss/grp-def.h>
+#include "nsss-internal.h"
+
+int nsss_grouplist_adjust (size_t n, size_t r, gid_t gid, gid_t *gids, int *ngids, int e)
+{
+ if (r > INT_MAX) return (errno = EMSGSIZE, -1) ;
+ if (r > n) return (*ngids = (int)r, errno = ENOBUFS, -1) ;
+ for (size_t i = 0 ; i < r ; i++) if (gid == gids[i]) goto ok ;
+ r++ ;
+ if (r > INT_MAX) return (errno = EMSGSIZE, -1) ;
+ if (r > n) return (*ngids = (int)r, errno = ENOBUFS, -1) ;
+ memmove(gids + 1, gids, (r-1) * sizeof(gid_t)) ;
+ gids[0] = gid ;
+ ok:
+ *ngids = (int)r ;
+ errno = e ;
+ return (int)n ;
+}