summaryrefslogtreecommitdiff
path: root/src/grp
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-08-14 16:57:42 -0400
committerJakob Kaivo <jkk@ung.org>2020-08-14 16:57:42 -0400
commit4f4d04f00b768157cde2c4b457377d70c61b4692 (patch)
tree4defa420c81e39010d1fbfb8d9c6ab48ef0e8457 /src/grp
parente83323c4635dd40a0b7c4260b6cbbac12005772e (diff)
implement
Diffstat (limited to 'src/grp')
-rw-r--r--src/grp/endgrent.c6
-rw-r--r--src/grp/getgrent.c75
-rw-r--r--src/grp/getgrgid.c14
-rw-r--r--src/grp/getgrnam.c15
-rw-r--r--src/grp/setgrent.c5
5 files changed, 110 insertions, 5 deletions
diff --git a/src/grp/endgrent.c b/src/grp/endgrent.c
index f9e84d81..00e4beb1 100644
--- a/src/grp/endgrent.c
+++ b/src/grp/endgrent.c
@@ -1,7 +1,13 @@
#include <grp.h>
+#include "_grp.h"
+#include "stdio.h"
void endgrent(void)
{
+ if (__grp.db != NULL) {
+ fclose(__grp.db);
+ __grp.db = NULL;
+ }
}
/*
diff --git a/src/grp/getgrent.c b/src/grp/getgrent.c
index 228f916c..aac4e175 100644
--- a/src/grp/getgrent.c
+++ b/src/grp/getgrent.c
@@ -1,9 +1,82 @@
+#include "sys/types.h"
#include <grp.h>
#include "stddef.h"
+#include "stdio.h"
+#include "limits.h"
+#include "string.h"
+#include "_config.h"
+#include "_grp.h"
+
+#ifndef LINE_MAX
+#define LINE_MAX _POSIX2_LINE_MAX
+#endif
+
+#ifndef _XOPEN_SOURCE
+ static
+#endif
struct group * getgrent(void)
{
- return NULL;
+ static char buf[LINE_MAX + 1];
+ char *group, *password, *gid, *members, *nl;
+ int member = 0;
+
+ /* TODO: attempt first calling _GRP_CMD */
+
+ if (__grp.db == NULL) {
+ __grp.db = fopen(_GRP_DB, "r");
+ if (__grp.db == NULL) {
+ return NULL;
+ }
+ }
+
+ if (fgets(buf, sizeof(buf), __grp.db) == NULL) {
+ endgrent();
+ return NULL;
+ }
+
+ group = buf;
+ if ((password = strchr(buf, ':')) != NULL) {
+ *password = '\0';
+ password++;
+ } else {
+ return NULL;
+ }
+
+ if ((gid = strchr(password, ':')) != NULL) {
+ *gid = '\0';
+ gid++;
+ } else {
+ return NULL;
+ }
+
+ if ((members = strchr(gid, ':')) != NULL) {
+ *members = '\0';
+ members++;
+ if ((nl = strchr(members, '\n')) != NULL) {
+ *nl = '\0';
+ }
+ } else {
+ return NULL;
+ }
+
+ __grp.grp.gr_name = group;
+ __grp.grp.gr_gid = strtoul(gid, NULL, 10);
+
+ while (members && *members) {
+ __grp.members[member++] = members;
+ members = strchr(members, ',');
+ if (members) {
+ *members = '\0';
+ members++;
+ }
+ }
+
+ __grp.members[member] = NULL;
+
+ __grp.grp.gr_mem = __grp.members;
+
+ return &__grp.grp;
}
/*
diff --git a/src/grp/getgrgid.c b/src/grp/getgrgid.c
index 0d39ffc2..af10469c 100644
--- a/src/grp/getgrgid.c
+++ b/src/grp/getgrgid.c
@@ -1,10 +1,20 @@
#include "sys/types.h"
#include <grp.h>
-#include "stddef.h"
+#include "_grp.h"
struct group * getgrgid(gid_t gid)
{
- (void)gid;
+ struct group *grp = NULL;
+ setgrent();
+
+ while ((grp = getgrent()) != NULL) {
+ if (grp->gr_gid == gid) {
+ endgrent();
+ return grp;
+ }
+ }
+
+ endgrent();
return NULL;
}
diff --git a/src/grp/getgrnam.c b/src/grp/getgrnam.c
index c3598866..493a6b5a 100644
--- a/src/grp/getgrnam.c
+++ b/src/grp/getgrnam.c
@@ -1,10 +1,21 @@
#include "sys/types.h"
#include <grp.h>
-#include "stddef.h"
+#include "_grp.h"
+#include "string.h"
struct group * getgrnam(const char * name)
{
- (void)name;
+ struct group *grp = NULL;
+ setgrent();
+
+ while ((grp = getgrent()) != NULL) {
+ if (strcmp(name, grp->gr_name) == 0) {
+ endgrent();
+ return grp;
+ }
+ }
+
+ endgrent();
return NULL;
}
diff --git a/src/grp/setgrent.c b/src/grp/setgrent.c
index 17b5872b..4e445404 100644
--- a/src/grp/setgrent.c
+++ b/src/grp/setgrent.c
@@ -1,7 +1,12 @@
#include <grp.h>
+#include "_grp.h"
+#include "stdio.h"
void setgrent(void)
{
+ if (__grp.db != NULL) {
+ rewind(__grp.db);
+ }
}
/*