[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 2/3] lib/posix-user: Implement getgrnam() and getgrnam_r() functions
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 |