diff --git a/include/grp.h b/include/grp.h new file mode 100644 index 00000000000..a0b52a9c3c1 --- /dev/null +++ b/include/grp.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * include/grp.h + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __INCLUDE_GRP_H +#define __INCLUDE_GRP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Type Definitions + ****************************************************************************/ + +struct group +{ + FAR char *gr_name; + FAR char *gr_passwd; + gid_t gr_gid; + FAR char **gr_mem; +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +FAR struct group *getgrnam(FAR const char *name); +FAR struct group *getgrgid(gid_t gid); +int getgrnam_r(FAR const char *name, FAR struct group *grp, FAR char *buf, + size_t buflen, FAR struct group **result); +int getgrgid_r(gid_t gid, FAR struct group *grp, FAR char *buf, size_t buflen, + FAR struct group **result); +int initgroups(FAR const char *user, gid_t group); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __INCLUDE_GRP_H */ diff --git a/libs/libc/Makefile b/libs/libc/Makefile index 47a6c0dc115..2cc61c68674 100644 --- a/libs/libc/Makefile +++ b/libs/libc/Makefile @@ -59,6 +59,7 @@ include dirent/Make.defs include dlfcn/Make.defs include endian/Make.defs include fixedmath/Make.defs +include grp/Make.defs include hex2bin/Make.defs include inttypes/Make.defs include libgen/Make.defs diff --git a/libs/libc/README.txt b/libs/libc/README.txt index 28896dd81f5..f7db05e64ac 100644 --- a/libs/libc/README.txt +++ b/libs/libc/README.txt @@ -36,6 +36,7 @@ we have: locale - locale.h lzf - lzf.h fixedmath - fixedmath.h + grp - grp.h inttypes - inttypes.h machine - Various architecture-specific implementations. math - math.h diff --git a/libs/libc/grp/Make.defs b/libs/libc/grp/Make.defs new file mode 100644 index 00000000000..ae17e581611 --- /dev/null +++ b/libs/libc/grp/Make.defs @@ -0,0 +1,44 @@ +############################################################################ +# libs/libc/grp/Make.defs +# +# Copyright (C) 2011-2012, 2019 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name NuttX nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +# Add the grp C files to the build + +CSRCS += lib_getgrgid.c lib_getgrgidr.c lib_getgrnam.c lib_getgrnamr.c +CSRCS += lib_grp.c lib_initgroups.c + +# Add the grp directory to the build + +DEPPATH += --dep-path grp +VPATH += :grp diff --git a/libs/libc/grp/lib_getgrgid.c b/libs/libc/grp/lib_getgrgid.c new file mode 100644 index 00000000000..25767ef8411 --- /dev/null +++ b/libs/libc/grp/lib_getgrgid.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * libs/libc/grp/lib_getgrgid.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "grp/lib_grp.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: getgrgid + * + * Description: + * The getgrgid() function searches the group database for an entry with + * a matching gid. + * + * Input Parameters: + * gid - The gid to return a group structure for + * + * Returned Value: + * A pointer to a statically allocated group structure, or NULL if no + * matching entry is found or an error occurs. Applications wishing to + * check for error situations should set errno to 0 before calling + * getgrgid(). If getgrgid() returns a null pointer and errno is set to + * non-zero, an error occurred. + * + ****************************************************************************/ + +FAR struct group *getgrgid(gid_t gid) +{ + if (gid != ROOT_GID) + { + return NULL; + } + + return getgrbuf(ROOT_GID, ROOT_NAME, ROOT_PASSWD); +} diff --git a/libs/libc/grp/lib_getgrgidr.c b/libs/libc/grp/lib_getgrgidr.c new file mode 100644 index 00000000000..953dee2a653 --- /dev/null +++ b/libs/libc/grp/lib_getgrgidr.c @@ -0,0 +1,87 @@ +/**************************************************************************** + * libs/libc/grp/lib_getgrgidr.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "grp/lib_grp.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: getgrgid_r + * + * Description: + * The getgrgid_r() function searches the group database for an entry with + * a matching gid and stores the retrieved group structure in the space + * pointed to by grp. + * + * Input Parameters: + * gid - The gid to return a group structure for. + * grp - Pointer to the space to store the retrieved group structure in. + * buf - The string fields pointed to by the group struct are stored here. + * buflen - The length of buf in bytes. + * result - Pointer to the resulting group struct, or NULL in case of fail. + * + * Returned Value: + * On success getgrgid_r returns 0 and sets *result to grp. If no match + * is found, 0 is returned and *result is set to NULL. In case of failure + * an error number is returned. + * + ****************************************************************************/ + +int getgrgid_r(gid_t gid, FAR struct group *grp, FAR char *buf, size_t buflen, + FAR struct group **result) +{ + if (gid != ROOT_GID) + { + /* The only known group is 'root', which has a gid of 0. Thus, report + * back that no match was found. + */ + + *result = NULL; + return 0; + } + + return getgrbuf_r(ROOT_GID, ROOT_NAME, ROOT_PASSWD, grp, buf, buflen, + result); +} diff --git a/libs/libc/grp/lib_getgrnam.c b/libs/libc/grp/lib_getgrnam.c new file mode 100644 index 00000000000..4c2f0da61ee --- /dev/null +++ b/libs/libc/grp/lib_getgrnam.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * libs/libc/grp/lib_getgrnam.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "grp/lib_grp.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: getgrnam + * + * Description: + * The getgrnam() function searches the group database for an entry with + * a matching name. + * + * Input Parameters: + * name - The group name to return a group structure for + * + * Returned Value: + * A pointer to a statically allocated group structure, or NULL if no + * matching entry is found or an error occurs. Applications wishing to + * check for error situations should set errno to 0 before calling + * getgrnam(). If getgrnam() returns a null pointer and errno is set to + * non-zero, an error occurred. + * + ****************************************************************************/ + +FAR struct group *getgrnam(FAR const char *name) +{ + if (strcmp(name, "root")) + { + return NULL; + } + + return getgrbuf(ROOT_GID, ROOT_NAME, ROOT_PASSWD); +} diff --git a/libs/libc/grp/lib_getgrnamr.c b/libs/libc/grp/lib_getgrnamr.c new file mode 100644 index 00000000000..7b84c1f153c --- /dev/null +++ b/libs/libc/grp/lib_getgrnamr.c @@ -0,0 +1,88 @@ +/**************************************************************************** + * libs/libc/grp/lib_getgrnamr.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "grp/lib_grp.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: getgrnam_r + * + * Description: + * The getgrnam_r() function searches the group database for an entry with + * a matching name and stores the retrieved group structure in the space + * pointed to by grp. + * + * Input Parameters: + * name - The name of the group to return a group structure for. + * grp - Pointer to the space to store the retrieved group structure in. + * buf - The string fields pointed to by the group struct are stored here. + * buflen - The length of buf in bytes. + * result - Pointer to the resulting group struct, or NULL in case of fail. + * + * Returned Value: + * On success getgrnam_r returns 0 and sets *result to grp. If no match + * is found, 0 is returned and *result is set to NULL. In case of failure + * an error number is returned. + * + ****************************************************************************/ + +int getgrnam_r(FAR const char *name, FAR struct group *grp, FAR char *buf, + size_t buflen, FAR struct group **result) +{ + if (strcmp(name, ROOT_NAME)) + { + /* The only known group is 'root', which has a gid of 0. Thus, report + * back that no match was found. + */ + + *result = NULL; + return 0; + } + + return getgrbuf_r(ROOT_GID, ROOT_NAME, ROOT_PASSWD, grp, buf, buflen, + result); +} diff --git a/libs/libc/grp/lib_grp.c b/libs/libc/grp/lib_grp.c new file mode 100644 index 00000000000..88f5e3c165a --- /dev/null +++ b/libs/libc/grp/lib_grp.c @@ -0,0 +1,186 @@ +/**************************************************************************** + * libs/libc/grp/lib_grp.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include "grp/lib_grp.h" + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static FAR char *g_buf; +static FAR struct group *g_grp; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: getgrbuf + * + * Description: + * libc/grp internal helper function for getgrgid and getgrnam to allocate + * and setup a group structure once a matching entry has been found. + * + * Input Parameters: + * gid - Value to set the group structure's gr_gid field to. + * name - Value to set the group structure's gr_name field to. + * passwd - Value to set the group structure's passwd field to. + * + * Returned Value: + * A pointer to a statically allocated group structure, or NULL if an + * error occurs, in which case errno is set appropriately. + * + ****************************************************************************/ + +FAR struct group *getgrbuf(gid_t gid, FAR const char *name, + FAR const char *passwd) +{ + FAR struct group *result; + FAR char *newbuf; + size_t buflen; + int err; + + buflen = sizeof(FAR char **) + strlen(name) + 1 + strlen(passwd) + 1; + + newbuf = (FAR char *)realloc(g_buf, buflen); + + if (!newbuf) + { + err = ENOMEM; + goto error; + } + + g_buf = newbuf; + + if (!g_grp) + { + g_grp = (FAR struct group *)malloc(sizeof(struct group)); + } + + if (!g_grp) + { + err = ENOMEM; + goto error; + } + + err = getgrbuf_r(gid, name, passwd, g_grp, g_buf, buflen, &result); + + if (err) + { + goto error; + } + + return result; + +error: + free(g_grp); + free(g_buf); + g_grp = NULL; + g_buf = NULL; + set_errno(err); + + return NULL; +} + +/**************************************************************************** + * Name: getgrbuf_r + * + * Description: + * libc/grp internal helper function for getgrgid_r and getgrnam_r to setup + * the caller supplied 'grp' and 'buf' buffers once a matching entry has + * been found. + * + * Input Parameters: + * gid - Value to set grp->gr_gid to. + * name - Value to set grp->gr_name to. + * passwd - Value to set grp->passwd to. + * grp - Pointer to the space to store the retrieved group structure in. + * buf - String fields pointed to by the group struct are stored here. + * buflen - The length of buf in bytes. + * result - Pointer to the resulting group struct, or NULL in case of fail. + * + * Returned Value: + * On success getgrgid_r returns 0 and sets *result to grp. In case of + * failure an error number is returned. + * + ****************************************************************************/ + +int getgrbuf_r(gid_t gid, FAR const char *name, FAR const char *passwd, + FAR struct group *grp, FAR char *buf, size_t buflen, + FAR struct group **result) +{ + size_t reqdlen; + size_t padlen; + + /* In 'buf' a NULL pointer value will be stored, which must be naturally + * aligned, followed by the null terminated group name string and the null + * terminated passwd string 'x' (indicating 'no password'). Make sure + * sufficient buffer space was supplied by the caller. + */ + + padlen = sizeof(FAR void *) - ((unsigned)buf % sizeof(FAR char *)); + reqdlen = sizeof(FAR void *) + strlen(name) + 1 + strlen(passwd) + 1; + + if (buflen < padlen + reqdlen) + { + /* Insufficient buffer space supplied. */ + + *result = NULL; + return ERANGE; + } + + grp->gr_mem = (FAR char **)&buf[padlen]; + grp->gr_name = &buf[padlen + sizeof(FAR char *)]; + grp->gr_passwd = &buf[padlen + sizeof(FAR char *) + strlen(name) + 1]; + + strcpy(grp->gr_name, name); + strcpy(grp->gr_passwd, passwd); + grp->gr_gid = gid; + *grp->gr_mem = NULL; + + *result = grp; + return 0; +} diff --git a/libs/libc/grp/lib_grp.h b/libs/libc/grp/lib_grp.h new file mode 100644 index 00000000000..1980f67b2b1 --- /dev/null +++ b/libs/libc/grp/lib_grp.h @@ -0,0 +1,82 @@ +/**************************************************************************** + * libs/libc/grp/lib_grp.h + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __LIBS_LIBC_GRP_LIB_GRP_H +#define __LIBS_LIBC_GRP_LIB_GRP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define ROOT_GID 0 +#define ROOT_NAME "root" +#define ROOT_PASSWD "x" + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +FAR struct group *getgrbuf(gid_t gid, FAR const char *name, + FAR const char *passwd); +int getgrbuf_r(gid_t gid, FAR const char *name, FAR const char *passwd, + FAR struct group *grp, FAR char *buf, size_t buflen, + FAR struct group **result); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* __LIBS_LIBC_GRP_LIB_GRP_H */ diff --git a/libs/libc/grp/lib_initgroups.c b/libs/libc/grp/lib_initgroups.c new file mode 100644 index 00000000000..db281c5a16a --- /dev/null +++ b/libs/libc/grp/lib_initgroups.c @@ -0,0 +1,74 @@ +/**************************************************************************** + * libs/libc/grp/lib_initgroups.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: initgroups + * + * Description: + * The group database /etc/group is read to determine all groups of which + * user is a member. The additional group group is also added to this set, + * which is then used to set the supplementary group IDs of the calling + * process. + * + * Input Parameters: + * user - Name of the user to query the /etc/group database for. + * group - Additional gid to add to the list of group IDs. + * + * Returned Value: + * The initgroups() function returns zero if successful, and -1 in case of + * failure, in which case errno is set appropriately. + * + ****************************************************************************/ + +int initgroups(FAR const char *user, gid_t group) +{ + /* There currently is no support for supplementary group IDs in NuttX. + * Thus, just ignore this request silently and report success. + */ + + return 0; +}