summaryrefslogtreecommitdiffstats
path: root/lib/libutil
diff options
context:
space:
mode:
authorbapt <bapt@FreeBSD.org>2012-12-27 14:30:19 +0000
committerbapt <bapt@FreeBSD.org>2012-12-27 14:30:19 +0000
commitb63557c001769d5ed1338eaa39730ba3ae77245b (patch)
treeaa053e8a4e86f98b45a33e762c770d0c49973a35 /lib/libutil
parent925e83c0bd84aa809deda8a20cab358ea1c0780b (diff)
downloadFreeBSD-src-b63557c001769d5ed1338eaa39730ba3ae77245b.zip
FreeBSD-src-b63557c001769d5ed1338eaa39730ba3ae77245b.tar.gz
New gr_add function to provide a clean and safe method to append a new member
into an existing group. Submitted by: db
Diffstat (limited to 'lib/libutil')
-rw-r--r--lib/libutil/gr_util.c40
-rw-r--r--lib/libutil/libutil.h2
2 files changed, 42 insertions, 0 deletions
diff --git a/lib/libutil/gr_util.c b/lib/libutil/gr_util.c
index 6bf102f..90062eb 100644
--- a/lib/libutil/gr_util.c
+++ b/lib/libutil/gr_util.c
@@ -479,6 +479,46 @@ gr_dup(const struct group *gr)
}
/*
+ * Add a new member name to a struct group.
+ */
+struct group *
+gr_add(struct group *gr, const char *newmember)
+{
+ size_t mlen;
+ int num_mem=0;
+ char **members;
+ struct group *newgr;
+
+ if (newmember == NULL)
+ return(gr_dup(gr));
+
+ if (gr->gr_mem != NULL) {
+ for (num_mem = 0; gr->gr_mem[num_mem] != NULL; num_mem++) {
+ if (strcmp(gr->gr_mem[num_mem], newmember) == 0) {
+ errno = EEXIST;
+ return (NULL);
+ }
+ }
+ }
+ /* Allocate enough for current pointers + 1 more and NULL marker */
+ mlen = (num_mem + 2) * sizeof(*gr->gr_mem);
+ if ((members = calloc(1, mlen )) == NULL) {
+ errno = ENOMEM;
+ return (NULL);
+ }
+ memcpy(members, gr->gr_mem, num_mem * sizeof(*gr->gr_mem));
+ members[num_mem++] = (char *)newmember;
+ members[num_mem] = NULL;
+ gr->gr_mem = members;
+ newgr = gr_dup(gr);
+ if (newgr == NULL)
+ errno = ENOMEM;
+
+ free(members);
+ return (newgr);
+}
+
+/*
* Scan a line and place it into a group structure.
*/
static bool
diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h
index bf42766..fcd74e1 100644
--- a/lib/libutil/libutil.h
+++ b/lib/libutil/libutil.h
@@ -166,6 +166,8 @@ int gr_copy(int __ffd, int _tfd, const struct group *_gr,
struct group *_old_gr);
struct group *
gr_dup(const struct group *_gr);
+struct group *
+ gr_add(struct group *_gr, const char *_newmember);
int gr_equal(const struct group *_gr1, const struct group *_gr2);
void gr_fini(void);
int gr_init(const char *_dir, const char *_master);
OpenPOWER on IntegriCloud