|
[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 |