diff options
author | Baptiste Daroussin <bapt@FreeBSD.org> | 2012-12-27 14:30:19 +0000 |
---|---|---|
committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2012-12-27 14:30:19 +0000 |
commit | ac1681ea5c7980246ca789137e852441e10207d5 (patch) | |
tree | 53bacb93ac6e8d76ec1fb3138997050d7892ea15 /libutil | |
parent | 758c4f17afd4a148f62b0b87647f242acf074aa9 (diff) | |
download | pw-darwin-ac1681ea5c7980246ca789137e852441e10207d5.tar.gz pw-darwin-ac1681ea5c7980246ca789137e852441e10207d5.tar.zst pw-darwin-ac1681ea5c7980246ca789137e852441e10207d5.zip |
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 'libutil')
-rw-r--r-- | libutil/gr_util.c | 40 | ||||
-rw-r--r-- | libutil/libutil.h | 2 |
2 files changed, 42 insertions, 0 deletions
diff --git a/libutil/gr_util.c b/libutil/gr_util.c index 6bf102f..90062eb 100644 --- a/libutil/gr_util.c +++ b/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/libutil/libutil.h b/libutil/libutil.h index bf42766..fcd74e1 100644 --- a/libutil/libutil.h +++ b/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); |