]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/pwdutils: add xgetgrnam
authorMatthew Harm Bekkema <id@mbekkema.name>
Wed, 15 Apr 2020 12:49:54 +0000 (22:49 +1000)
committerMatthew Harm Bekkema <id@mbekkema.name>
Wed, 15 Apr 2020 12:50:59 +0000 (22:50 +1000)
Signed-off-by: Matthew Harm Bekkema <id@mbekkema.name>
include/pwdutils.h
lib/pwdutils.c

index bea46e57e3b04d4267b3e4fa25b23939b0c41f48..b58268d775499a7d776d048ddc42e9e11523eb60 100644 (file)
@@ -3,8 +3,10 @@
 
 #include <sys/types.h>
 #include <pwd.h>
+#include <grp.h>
 
 extern struct passwd *xgetpwnam(const char *username, char **pwdbuf);
+extern struct group *xgetgrnam(const char *groupname, char **grpbuf);
 extern struct passwd *xgetpwuid(uid_t uid, char **pwdbuf);
 extern char *xgetlogin(void);
 
index d54458d65da6fd539e81df23a3c7b099883267c1..d5f4d2e232ddde8abae274b0dcf831f63f85af57 100644 (file)
@@ -36,6 +36,38 @@ failed:
        return NULL;
 }
 
+/* Returns allocated group and allocated grpbuf to store group strings
+ * fields. In case of error returns NULL and set errno, for unknown group set
+ * errno to EINVAL
+ */
+struct group *xgetgrnam(const char *groupname, char **grpbuf)
+{
+       struct group *grp = NULL, *res = NULL;
+       int rc;
+
+       if (!grpbuf || !groupname)
+               return NULL;
+
+       *grpbuf = xmalloc(UL_GETPW_BUFSIZ);
+       grp = xcalloc(1, sizeof(struct group));
+
+       errno = 0;
+       rc = getgrnam_r(groupname, grp, *grpbuf, UL_GETPW_BUFSIZ, &res);
+       if (rc != 0) {
+               errno = rc;
+               goto failed;
+       }
+       if (!res) {
+               errno = EINVAL;
+               goto failed;
+       }
+       return grp;
+failed:
+       free(grp);
+       free(*grpbuf);
+       return NULL;
+}
+
 struct passwd *xgetpwuid(uid_t uid, char **pwdbuf)
 {
        struct passwd *pwd = NULL, *res = NULL;