[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 2/3] lib/posix-user: Implement getgrnam() and getgrnam_r() functions
Reviewed-by: Stefan Teodorescu <stefanl.teodorescu@xxxxxxxxx> On Wed, Nov 27, 2019 at 1:26 PM Costin Lupu <costin.lupu@xxxxxxxxx> wrote: > > This patch reuses and completes the definition of our only supported group. > > Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> > --- > lib/posix-user/user.c | 99 ++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 88 insertions(+), 11 deletions(-) > > diff --git a/lib/posix-user/user.c b/lib/posix-user/user.c > index ca7e9ee7..5e2fc9f3 100644 > --- a/lib/posix-user/user.c > +++ b/lib/posix-user/user.c > @@ -37,12 +37,19 @@ > #include <grp.h> > #include <pwd.h> > #include <string.h> > +#include <errno.h> > #include <sys/types.h> > #include <uk/essentials.h> > #include <uk/list.h> > #include <uk/print.h> > #include <uk/user.h> > > +#define UK_DEFAULT_UID 0 > +#define UK_DEFAULT_GID 0 > +#define UK_DEFAULT_USER "root" > +#define UK_DEFAULT_GROUP "root" > +#define UK_DEFAULT_PASS "x" > + > static struct passwd_entry { > struct passwd *passwd; > > @@ -57,11 +64,11 @@ void __constructor init_ukunistd() > { > static struct passwd_entry p1; > static struct passwd passwd = { > - .pw_name = "root", > - .pw_passwd = "password", > - .pw_uid = 0, > - .pw_gid = 0, > - .pw_gecos = "root", > + .pw_name = UK_DEFAULT_USER, > + .pw_passwd = UK_DEFAULT_PASS, > + .pw_uid = UK_DEFAULT_UID, > + .pw_gid = UK_DEFAULT_GID, > + .pw_gecos = UK_DEFAULT_USER, > .pw_dir = "/", > .pw_shell = NULL, > }; > @@ -223,12 +230,82 @@ int setgroups(size_t size __unused, const gid_t *list > __unused) > return 0; > } > > -struct group *getgrnam(const char *name __unused) > +/* Group members */ > +static char *g_members__[] = { UK_DEFAULT_USER, NULL }; > + > +/* Group entry */ > +static struct group g__ = { > + .gr_name = UK_DEFAULT_GROUP, > + .gr_passwd = UK_DEFAULT_PASS, > + .gr_gid = UK_DEFAULT_GID, > + .gr_mem = g_members__, > +}; > + > +struct group *getgrnam(const char *name) > { > - static struct group g__ = { > - .gr_gid = 0 > - }; > + struct group *res; > + > + if (name && !strcmp(name, g__.gr_name)) > + res = &g__; > + else { > + res = NULL; > + errno = ENOENT; > + } > > - WARN_STUBBED(); > - return &g__; > + return res; > +} > + > +int getgrnam_r(const char *name, struct group *grp, > + char *buf, size_t buflen, struct group **result) > +{ > + size_t needed; > + int i, members; > + > + if (!name || strcmp(name, g__.gr_name)) { > + *result = NULL; > + return 0; > + } > + > + /* check if provided buffer is big enough */ > + needed = strlen(g__.gr_name) + 1 > + + strlen(g__.gr_passwd) + 1 > + + sizeof(g__.gr_gid); > + i = 0; > + while (g__.gr_mem[i]) > + needed += strlen(g__.gr_mem[i++]) + 1; > + members = i; > + > + if (buflen < needed) { > + *result = NULL; > + return ERANGE; > + } > + > + /* set name */ > + strlcpy(buf, g__.gr_name, strlen(g__.gr_name) + 1); > + grp->gr_name = buf; > + buf += strlen(g__.gr_name) + 1; > + > + /* set passwd */ > + strlcpy(buf, g__.gr_passwd, strlen(g__.gr_passwd) + 1); > + grp->gr_passwd = buf; > + buf += strlen(g__.gr_passwd) + 1; > + > + /* set gid */ > + grp->gr_gid = g__.gr_gid; > + > + /* set members */ > + i = 0; > + grp->gr_mem = (char **) buf; > + buf += (members + 1) * sizeof(char *); > + while (g__.gr_mem[i]) { > + strlcpy(buf, g__.gr_mem[i], strlen(g__.gr_mem[i]) + 1); > + grp->gr_mem[i] = buf; > + buf += strlen(g__.gr_mem[i]) + 1; > + i++; > + } > + grp->gr_mem[i] = NULL; > + > + *result = grp; > + > + return 0; > } > -- > 2.20.1 > _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |