New gr_add function to provide a clean and safe method to append a new member

into an existing group.

Submitted by:	db
This commit is contained in:
Baptiste Daroussin 2012-12-27 14:30:19 +00:00
parent 98e79fb122
commit be49c83011
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=244736
2 changed files with 42 additions and 0 deletions

View File

@ -478,6 +478,46 @@ gr_dup(const struct group *gr)
return (&gs->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.
*/

View File

@ -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);