This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 9704481224a libc/unistd: add getgroups()
9704481224a is described below

commit 9704481224a199506bfb74702c2b3638081d8474
Author: Xiang Xiao <[email protected]>
AuthorDate: Sun Jun 21 01:48:17 2026 +0800

    libc/unistd: add getgroups()
    
    Add getgroups() to the C library.  NuttX has no supplementary group
    IDs, so it reports a single group, the effective group ID, and follows
    POSIX for the gidsetsize == 0 and short-buffer (EINVAL) cases.
    
    Signed-off-by: Xiang Xiao <[email protected]>
---
 Documentation/standards/posix.rst |  2 +-
 include/unistd.h                  |  2 +
 libs/libc/unistd/CMakeLists.txt   |  1 +
 libs/libc/unistd/Make.defs        |  2 +-
 libs/libc/unistd/lib_getgroups.c  | 85 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 90 insertions(+), 2 deletions(-)

diff --git a/Documentation/standards/posix.rst 
b/Documentation/standards/posix.rst
index 577abf16ce5..cdca6eb748e 100644
--- a/Documentation/standards/posix.rst
+++ b/Documentation/standards/posix.rst
@@ -1972,7 +1972,7 @@ User and Group:
 +--------------------------------+---------+
 | :c:func:`getgid`               | Yes     |
 +--------------------------------+---------+
-| getgroups()                    | No      |
+| :c:func:`getgroups`            | Yes     |
 +--------------------------------+---------+
 | getlogin()                     | No      |
 +--------------------------------+---------+
diff --git a/include/unistd.h b/include/unistd.h
index 6c7f7d1bcf3..63ded5444ac 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -494,6 +494,8 @@ gid_t   getegid(void);
 int     setreuid(uid_t ruid, uid_t euid);
 int     setregid(gid_t rgid, gid_t egid);
 
+int     getgroups(int, gid_t[]);
+
 int     getentropy(FAR void *buffer, size_t length);
 
 void    sync(void);
diff --git a/libs/libc/unistd/CMakeLists.txt b/libs/libc/unistd/CMakeLists.txt
index 797ff8aba9e..eb4ca8e5e93 100644
--- a/libs/libc/unistd/CMakeLists.txt
+++ b/libs/libc/unistd/CMakeLists.txt
@@ -65,6 +65,7 @@ set(SRCS
     lib_getpgrp.c
     lib_getpgid.c
     lib_getsid.c
+    lib_getgroups.c
     lib_setpgid.c
     lib_setsid.c
     lib_lockf.c
diff --git a/libs/libc/unistd/Make.defs b/libs/libc/unistd/Make.defs
index e7852230ad7..e3e5ed3a214 100644
--- a/libs/libc/unistd/Make.defs
+++ b/libs/libc/unistd/Make.defs
@@ -32,7 +32,7 @@ CSRCS += lib_setrlimit.c lib_getrlimit.c lib_setpriority.c 
lib_getpriority.c
 CSRCS += lib_futimes.c lib_lutimes.c lib_gethostname.c lib_sethostname.c
 CSRCS += lib_fchownat.c lib_linkat.c lib_readlinkat.c lib_symlinkat.c
 CSRCS += lib_unlinkat.c lib_usleep.c lib_getpgrp.c lib_getpgid.c
-CSRCS += lib_getsid.c lib_setpgid.c lib_setsid.c
+CSRCS += lib_getsid.c lib_getgroups.c lib_setpgid.c lib_setsid.c
 CSRCS += lib_lockf.c lib_flock.c lib_getpass.c
 CSRCS += lib_chdir.c lib_fchdir.c lib_confstr.c lib_ulimit.c
 
diff --git a/libs/libc/unistd/lib_getgroups.c b/libs/libc/unistd/lib_getgroups.c
new file mode 100644
index 00000000000..53cbc11ba82
--- /dev/null
+++ b/libs/libc/unistd/lib_getgroups.c
@@ -0,0 +1,85 @@
+/****************************************************************************
+ * libs/libc/unistd/lib_getgroups.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <unistd.h>
+#include <errno.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: getgroups
+ *
+ * Description:
+ *   The getgroups() function returns the supplementary group IDs of the
+ *   calling process in the array grouplist.  NuttX does not support
+ *   supplementary group IDs, so the calling process is treated as belonging
+ *   to a single group: its effective group ID.
+ *
+ * Input Parameters:
+ *   gidsetsize - The number of elements available in grouplist.
+ *   grouplist  - The buffer used to return the group IDs.
+ *
+ * Returned Value:
+ *   On success, the number of group IDs is returned.  If gidsetsize is zero,
+ *   the total number of group IDs is returned without modifying grouplist.
+ *   On failure, -1 is returned and errno is set appropriately.
+ *
+ ****************************************************************************/
+
+int getgroups(int gidsetsize, gid_t grouplist[])
+{
+  if (gidsetsize < 0)
+    {
+      set_errno(EINVAL);
+      return -1;
+    }
+
+  /* If gidsetsize is zero, return the number of group IDs without touching
+   * grouplist.
+   */
+
+  if (gidsetsize == 0)
+    {
+      return 1;
+    }
+
+  if (grouplist == NULL)
+    {
+      set_errno(EFAULT);
+      return -1;
+    }
+
+  /* NuttX has no notion of supplementary group IDs.  Report the single
+   * effective group ID of the calling process.
+   */
+
+  grouplist[0] = getegid();
+  return 1;
+}

Reply via email to