[PATCH 5/9] libcsupport: Split passwd/group support

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Nov 14 13:46:31 UTC 2014


---
 cpukit/libcsupport/Makefile.am    |   4 +-
 cpukit/libcsupport/src/getgrent.c |  78 ++++++++
 cpukit/libcsupport/src/getpwent.c | 385 +-------------------------------------
 cpukit/libcsupport/src/pwdgrp.c   | 346 ++++++++++++++++++++++++++++++++++
 cpukit/libcsupport/src/pwdgrp.h   |  46 +++++
 5 files changed, 476 insertions(+), 383 deletions(-)
 create mode 100644 cpukit/libcsupport/src/getgrent.c
 create mode 100644 cpukit/libcsupport/src/pwdgrp.c
 create mode 100644 cpukit/libcsupport/src/pwdgrp.h

diff --git a/cpukit/libcsupport/Makefile.am b/cpukit/libcsupport/Makefile.am
index 40e0800..74b029c 100644
--- a/cpukit/libcsupport/Makefile.am
+++ b/cpukit/libcsupport/Makefile.am
@@ -108,7 +108,9 @@ MALLOC_C_FILES = src/malloc_initialize.c src/calloc.c src/malloc.c \
     src/rtems_heap_extend.c \
     src/rtems_heap_greedy.c
 
-PASSWORD_GROUP_C_FILES = src/getpwent.c
+PASSWORD_GROUP_C_FILES = src/pwdgrp.c
+PASSWORD_GROUP_C_FILES += src/getgrent.c
+PASSWORD_GROUP_C_FILES += src/getpwent.c
 
 TERMINAL_IDENTIFICATION_C_FILES = src/ctermid.c
 ## 20 Nov 2008: Now using these from newlib's posix directory
diff --git a/cpukit/libcsupport/src/getgrent.c b/cpukit/libcsupport/src/getgrent.c
new file mode 100644
index 0000000..9b11e2e
--- /dev/null
+++ b/cpukit/libcsupport/src/getgrent.c
@@ -0,0 +1,78 @@
+/**
+ *  @file
+ *
+ *  @brief User Database Access Routines
+ *  @ingroup libcsupport
+ */
+
+/*
+ *  Copyright (c) 1999-2009 Ralf Corsepius <corsepiu at faw.uni-ulm.de>
+ *  Copyright (c) 1999-2013 Joel Sherrill <joel.sherrill at OARcorp.com>
+ *  Copyright (c) 2000-2001 Fernando Ruiz Casas <fernando.ruiz at ctv.es>
+ *  Copyright (c) 2002 Eric Norum <eric.norum at usask.ca>
+ *  Copyright (c) 2003 Till Straumann <strauman at slac.stanford.edu>
+ *  Copyright (c) 2012 Alex Ivanov <alexivanov97 at gmail.com>
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pwdgrp.h"
+
+/*
+ * Static, thread-unsafe, buffers
+ */
+static FILE *group_fp;
+static char grbuf[200];
+static struct group grent;
+
+struct group *getgrnam(
+  const char *name
+)
+{
+  struct group *p;
+
+  if(getgrnam_r(name, &grent, grbuf, sizeof grbuf, &p))
+    return NULL;
+  return p;
+}
+
+struct group *getgrgid(
+  gid_t gid
+)
+{
+  struct group *p;
+
+  if(getgrgid_r(gid, &grent, grbuf, sizeof grbuf, &p))
+    return NULL;
+  return p;
+}
+
+struct group *getgrent(void)
+{
+  if (group_fp == NULL)
+    return NULL;
+  if (!_libcsupport_scangr(group_fp, &grent, grbuf, sizeof grbuf))
+    return NULL;
+  return &grent;
+}
+
+void setgrent(void)
+{
+  _libcsupport_pwdgrp_init();
+
+  if (group_fp != NULL)
+    fclose(group_fp);
+  group_fp = fopen("/etc/group", "r");
+}
+
+void endgrent(void)
+{
+  if (group_fp != NULL)
+    fclose(group_fp);
+}
diff --git a/cpukit/libcsupport/src/getpwent.c b/cpukit/libcsupport/src/getpwent.c
index 483dd95..5a6b444 100644
--- a/cpukit/libcsupport/src/getpwent.c
+++ b/cpukit/libcsupport/src/getpwent.c
@@ -22,23 +22,7 @@
 #include "config.h"
 #endif
 
-#include <stdio.h>
-#include <sys/types.h>
-#include <pwd.h>
-#include <grp.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <ctype.h>
-
-#include <rtems/libio_.h>
-#include <rtems/seterr.h>
-
-/**
- *  POSIX 1003.1b - 9.2.2 - User Database Access Routines
- */
+#include "pwdgrp.h"
 
 /*
  * Static, thread-unsafe, buffers
@@ -46,202 +30,6 @@
 static FILE *passwd_fp;
 static char pwbuf[200];
 static struct passwd pwent;
-static FILE *group_fp;
-static char grbuf[200];
-static struct group grent;
-
-/*
- *  Prototype to avoid warning
- */
-void init_etc_passwd_group(void);
-
-/**
- *  Initialize useable but dummy databases
- */
-void init_etc_passwd_group(void)
-{
-  FILE *fp;
-  static char etc_passwd_initted = 0;
-
-  if (etc_passwd_initted)
-    return;
-  etc_passwd_initted = 1;
-  mkdir("/etc", 0777);
-
-  /*
-   *  Initialize /etc/passwd
-   */
-  if ((fp = fopen("/etc/passwd", "r")) != NULL) {
-    fclose(fp);
-  }
-  else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
-    fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
-                 "rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
-                 "tty:!:2:2:tty owner::/:/bin/false\n" );
-    fclose(fp);
-  }
-
-  /*
-   *  Initialize /etc/group
-   */
-  if ((fp = fopen("/etc/group", "r")) != NULL) {
-    fclose(fp);
-  }
-  else if ((fp = fopen("/etc/group", "w")) != NULL) {
-    fprintf( fp, "root:x:0:root\n"
-                 "rtems:x:1:rtems\n"
-                 "tty:x:2:tty\n" );
-    fclose(fp);
-  }
-}
-
-/**
- *  Extract a string value from the database
- */
-static int
-scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag)
-{
-  int c;
-
-  *name = *bufp;
-  for (;;) {
-    c = getc(fp);
-    if (c == ':') {
-        if (nlFlag)
-            return 0;
-        break;
-    }
-    if (c == '\n') {
-        if (!nlFlag)
-            return 0;
-        break;
-    }
-    if (c == EOF)
-      return 0;
-    if (*nleft < 2)
-      return 0;
-    **bufp = c;
-    ++(*bufp);
-    --(*nleft);
-  }
-  **bufp = '\0';
-  ++(*bufp);
-  --(*nleft);
-  return 1;
-}
-
-/**
- *  Extract an integer value from the database
- */
-static int
-scanInt(FILE *fp, int *val)
-{
-  int c;
-  unsigned int i = 0;
-  unsigned int limit = INT_MAX;
-  int sign = 0;
-  int d;
-
-  for (;;) {
-    c = getc(fp);
-    if (c == ':')
-      break;
-    if (sign == 0) {
-      if (c == '-') {
-        sign = -1;
-        limit++;
-        continue;
-      }
-      sign = 1;
-    }
-    if (!isdigit(c))
-      return 0;
-    d = c - '0';
-    if ((i > (limit / 10))
-     || ((i == (limit / 10)) && (d > (limit % 10))))
-      return 0;
-    i = i * 10 + d;
-  }
-  if (sign == 0)
-    return 0;
-  *val = i * sign;
-  return 1;
-}
-
-/*
- * Extract a single password record from the database
- */
-static int scanpw(
-  FILE *fp,
-  struct passwd *pwd,
-  char *buffer,
-  size_t bufsize
-)
-{
-  int pwuid, pwgid;
-
-  if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
-   || !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0)
-   || !scanInt(fp, &pwuid)
-   || !scanInt(fp, &pwgid)
-   || !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
-   || !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
-   || !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
-   || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
-    return 0;
-  pwd->pw_uid = pwuid;
-  pwd->pw_gid = pwgid;
-  return 1;
-}
-
-static int getpw_r(
-  const char     *name,
-  int             uid,
-  struct passwd  *pwd,
-  char           *buffer,
-  size_t          bufsize,
-  struct passwd **result
-)
-{
-  FILE *fp;
-  int match;
-
-  init_etc_passwd_group();
-
-  if ((fp = fopen("/etc/passwd", "r")) == NULL)
-    rtems_set_errno_and_return_minus_one( EINVAL );
-
-  for(;;) {
-    if (!scanpw(fp, pwd, buffer, bufsize))
-      goto error_einval;
-
-    if (name) {
-      match = (strcmp(pwd->pw_name, name) == 0);
-    } else {
-      match = (pwd->pw_uid == uid);
-    }
-
-    if (match) {
-      fclose(fp);
-      *result = pwd;
-      return 0;
-    }
-  }
-error_einval:
-  fclose(fp);
-  rtems_set_errno_and_return_minus_one( EINVAL );
-}
-
-int getpwnam_r(
-  const char     *name,
-  struct passwd  *pwd,
-  char           *buffer,
-  size_t          bufsize,
-  struct passwd **result
-)
-{
-  return getpw_r(name, 0, pwd, buffer, bufsize, result);
-}
 
 struct passwd *getpwnam(
   const char *name
@@ -254,17 +42,6 @@ struct passwd *getpwnam(
   return p;
 }
 
-int getpwuid_r(
-  uid_t           uid,
-  struct passwd  *pwd,
-  char           *buffer,
-  size_t          bufsize,
-  struct passwd **result
-)
-{
-  return getpw_r(NULL, uid, pwd, buffer, bufsize, result);
-}
-
 struct passwd *getpwuid(
   uid_t uid
 )
@@ -280,14 +57,14 @@ struct passwd *getpwent(void)
 {
   if (passwd_fp == NULL)
     return NULL;
-  if (!scanpw(passwd_fp, &pwent, pwbuf, sizeof pwbuf))
+  if (!_libcsupport_scanpw(passwd_fp, &pwent, pwbuf, sizeof pwbuf))
     return NULL;
   return &pwent;
 }
 
 void setpwent(void)
 {
-  init_etc_passwd_group();
+  _libcsupport_pwdgrp_init();
 
   if (passwd_fp != NULL)
     fclose(passwd_fp);
@@ -299,159 +76,3 @@ void endpwent(void)
   if (passwd_fp != NULL)
     fclose(passwd_fp);
 }
-
-/**
- *  Extract a single group record from the database
- */
-static int scangr(
-  FILE *fp,
-  struct group *grp,
-  char *buffer,
-  size_t bufsize
-)
-{
-  int grgid;
-  char *grmem, *cp;
-  int memcount;
-
-  if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
-   || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
-   || !scanInt(fp, &grgid)
-   || !scanString(fp, &grmem, &buffer, &bufsize, 1))
-    return 0;
-  grp->gr_gid = grgid;
-
-  /*
-   * Determine number of members
-   */
-  for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
-    if(*cp == ',')
-      memcount++;
-  }
-
-  /*
-   * Hack to produce (hopefully) a suitably-aligned array of pointers
-   */
-  if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
-    return 0;
-  grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
-
-  /*
-   * Fill in pointer array
-   */
-  grp->gr_mem[0] = grmem;
-  for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
-    if(*cp == ',') {
-      *cp = '\0';
-      grp->gr_mem[memcount++] = cp + 1;
-    }
-  }
-  grp->gr_mem[memcount] = NULL;
-  return 1;
-}
-
-static int getgr_r(
-  const char     *name,
-  int             gid,
-  struct group   *grp,
-  char           *buffer,
-  size_t          bufsize,
-  struct group  **result
-)
-{
-  FILE *fp;
-  int match;
-
-  init_etc_passwd_group();
-
-  if ((fp = fopen("/etc/group", "r")) == NULL)
-    rtems_set_errno_and_return_minus_one( EINVAL );
-
-  for(;;) {
-    if (!scangr(fp, grp, buffer, bufsize))
-      goto error_einval;
-
-    if (name) {
-      match = (strcmp(grp->gr_name, name) == 0);
-    } else {
-      match = (grp->gr_gid == gid);
-    }
-
-    if (match) {
-      fclose(fp);
-      *result = grp;
-      return 0;
-    }
-  }
-error_einval:
-  fclose(fp);
-  rtems_set_errno_and_return_minus_one( EINVAL );
-}
-
-int getgrnam_r(
-  const char     *name,
-  struct group   *grp,
-  char           *buffer,
-  size_t          bufsize,
-  struct group  **result
-)
-{
-  return getgr_r(name, 0, grp, buffer, bufsize, result);
-}
-
-struct group *getgrnam(
-  const char *name
-)
-{
-  struct group *p;
-
-  if(getgrnam_r(name, &grent, grbuf, sizeof grbuf, &p))
-    return NULL;
-  return p;
-}
-
-int getgrgid_r(
-  gid_t           gid,
-  struct group   *grp,
-  char           *buffer,
-  size_t          bufsize,
-  struct group  **result
-)
-{
-  return getgr_r(NULL, gid, grp, buffer, bufsize, result);
-}
-
-struct group *getgrgid(
-  gid_t gid
-)
-{
-  struct group *p;
-
-  if(getgrgid_r(gid, &grent, grbuf, sizeof grbuf, &p))
-    return NULL;
-  return p;
-}
-
-struct group *getgrent(void)
-{
-  if (group_fp == NULL)
-    return NULL;
-  if (!scangr(group_fp, &grent, grbuf, sizeof grbuf))
-    return NULL;
-  return &grent;
-}
-
-void setgrent(void)
-{
-  init_etc_passwd_group();
-
-  if (group_fp != NULL)
-    fclose(group_fp);
-  group_fp = fopen("/etc/group", "r");
-}
-
-void endgrent(void)
-{
-  if (group_fp != NULL)
-    fclose(group_fp);
-}
diff --git a/cpukit/libcsupport/src/pwdgrp.c b/cpukit/libcsupport/src/pwdgrp.c
new file mode 100644
index 0000000..d8e1947
--- /dev/null
+++ b/cpukit/libcsupport/src/pwdgrp.c
@@ -0,0 +1,346 @@
+/**
+ *  @file
+ *
+ *  @brief User Database Access Routines
+ *  @ingroup libcsupport
+ */
+
+/*
+ *  Copyright (c) 1999-2009 Ralf Corsepius <corsepiu at faw.uni-ulm.de>
+ *  Copyright (c) 1999-2013 Joel Sherrill <joel.sherrill at OARcorp.com>
+ *  Copyright (c) 2000-2001 Fernando Ruiz Casas <fernando.ruiz at ctv.es>
+ *  Copyright (c) 2002 Eric Norum <eric.norum at usask.ca>
+ *  Copyright (c) 2003 Till Straumann <strauman at slac.stanford.edu>
+ *  Copyright (c) 2012 Alex Ivanov <alexivanov97 at gmail.com>
+ *
+ *  The license and distribution terms for this file may be
+ *  found in the file LICENSE in this distribution or at
+ *  http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/stat.h>
+#include <pwd.h>
+#include <grp.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+
+#include <rtems/seterr.h>
+
+#include "pwdgrp.h"
+
+/**
+ *  Initialize useable but dummy databases
+ */
+void _libcsupport_pwdgrp_init(void)
+{
+  FILE *fp;
+  static char etc_passwd_initted = 0;
+
+  if (etc_passwd_initted)
+    return;
+  etc_passwd_initted = 1;
+  mkdir("/etc", 0777);
+
+  /*
+   *  Initialize /etc/passwd
+   */
+  if ((fp = fopen("/etc/passwd", "r")) != NULL) {
+    fclose(fp);
+  }
+  else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
+    fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
+                 "rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
+                 "tty:!:2:2:tty owner::/:/bin/false\n" );
+    fclose(fp);
+  }
+
+  /*
+   *  Initialize /etc/group
+   */
+  if ((fp = fopen("/etc/group", "r")) != NULL) {
+    fclose(fp);
+  }
+  else if ((fp = fopen("/etc/group", "w")) != NULL) {
+    fprintf( fp, "root:x:0:root\n"
+                 "rtems:x:1:rtems\n"
+                 "tty:x:2:tty\n" );
+    fclose(fp);
+  }
+}
+
+/**
+ *  Extract a string value from the database
+ */
+static int
+scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag)
+{
+  int c;
+
+  *name = *bufp;
+  for (;;) {
+    c = getc(fp);
+    if (c == ':') {
+        if (nlFlag)
+            return 0;
+        break;
+    }
+    if (c == '\n') {
+        if (!nlFlag)
+            return 0;
+        break;
+    }
+    if (c == EOF)
+      return 0;
+    if (*nleft < 2)
+      return 0;
+    **bufp = c;
+    ++(*bufp);
+    --(*nleft);
+  }
+  **bufp = '\0';
+  ++(*bufp);
+  --(*nleft);
+  return 1;
+}
+
+/**
+ *  Extract an integer value from the database
+ */
+static int
+scanInt(FILE *fp, int *val)
+{
+  int c;
+  unsigned int i = 0;
+  unsigned int limit = INT_MAX;
+  int sign = 0;
+  int d;
+
+  for (;;) {
+    c = getc(fp);
+    if (c == ':')
+      break;
+    if (sign == 0) {
+      if (c == '-') {
+        sign = -1;
+        limit++;
+        continue;
+      }
+      sign = 1;
+    }
+    if (!isdigit(c))
+      return 0;
+    d = c - '0';
+    if ((i > (limit / 10))
+     || ((i == (limit / 10)) && (d > (limit % 10))))
+      return 0;
+    i = i * 10 + d;
+  }
+  if (sign == 0)
+    return 0;
+  *val = i * sign;
+  return 1;
+}
+
+/*
+ * Extract a single password record from the database
+ */
+int _libcsupport_scanpw(
+  FILE *fp,
+  struct passwd *pwd,
+  char *buffer,
+  size_t bufsize
+)
+{
+  int pwuid, pwgid;
+
+  if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
+   || !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0)
+   || !scanInt(fp, &pwuid)
+   || !scanInt(fp, &pwgid)
+   || !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
+   || !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
+   || !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
+   || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
+    return 0;
+  pwd->pw_uid = pwuid;
+  pwd->pw_gid = pwgid;
+  return 1;
+}
+
+static int getpw_r(
+  const char     *name,
+  int             uid,
+  struct passwd  *pwd,
+  char           *buffer,
+  size_t          bufsize,
+  struct passwd **result
+)
+{
+  FILE *fp;
+  int match;
+
+  _libcsupport_pwdgrp_init();
+
+  if ((fp = fopen("/etc/passwd", "r")) == NULL)
+    rtems_set_errno_and_return_minus_one( EINVAL );
+
+  for(;;) {
+    if (!_libcsupport_scanpw(fp, pwd, buffer, bufsize))
+      goto error_einval;
+
+    if (name) {
+      match = (strcmp(pwd->pw_name, name) == 0);
+    } else {
+      match = (pwd->pw_uid == uid);
+    }
+
+    if (match) {
+      fclose(fp);
+      *result = pwd;
+      return 0;
+    }
+  }
+error_einval:
+  fclose(fp);
+  rtems_set_errno_and_return_minus_one( EINVAL );
+}
+
+int getpwnam_r(
+  const char     *name,
+  struct passwd  *pwd,
+  char           *buffer,
+  size_t          bufsize,
+  struct passwd **result
+)
+{
+  return getpw_r(name, 0, pwd, buffer, bufsize, result);
+}
+
+int getpwuid_r(
+  uid_t           uid,
+  struct passwd  *pwd,
+  char           *buffer,
+  size_t          bufsize,
+  struct passwd **result
+)
+{
+  return getpw_r(NULL, uid, pwd, buffer, bufsize, result);
+}
+
+/**
+ *  Extract a single group record from the database
+ */
+int _libcsupport_scangr(
+  FILE *fp,
+  struct group *grp,
+  char *buffer,
+  size_t bufsize
+)
+{
+  int grgid;
+  char *grmem, *cp;
+  int memcount;
+
+  if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
+   || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
+   || !scanInt(fp, &grgid)
+   || !scanString(fp, &grmem, &buffer, &bufsize, 1))
+    return 0;
+  grp->gr_gid = grgid;
+
+  /*
+   * Determine number of members
+   */
+  for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
+    if(*cp == ',')
+      memcount++;
+  }
+
+  /*
+   * Hack to produce (hopefully) a suitably-aligned array of pointers
+   */
+  if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
+    return 0;
+  grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
+
+  /*
+   * Fill in pointer array
+   */
+  grp->gr_mem[0] = grmem;
+  for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
+    if(*cp == ',') {
+      *cp = '\0';
+      grp->gr_mem[memcount++] = cp + 1;
+    }
+  }
+  grp->gr_mem[memcount] = NULL;
+  return 1;
+}
+
+static int getgr_r(
+  const char     *name,
+  int             gid,
+  struct group   *grp,
+  char           *buffer,
+  size_t          bufsize,
+  struct group  **result
+)
+{
+  FILE *fp;
+  int match;
+
+  _libcsupport_pwdgrp_init();
+
+  if ((fp = fopen("/etc/group", "r")) == NULL)
+    rtems_set_errno_and_return_minus_one( EINVAL );
+
+  for(;;) {
+    if (!_libcsupport_scangr(fp, grp, buffer, bufsize))
+      goto error_einval;
+
+    if (name) {
+      match = (strcmp(grp->gr_name, name) == 0);
+    } else {
+      match = (grp->gr_gid == gid);
+    }
+
+    if (match) {
+      fclose(fp);
+      *result = grp;
+      return 0;
+    }
+  }
+error_einval:
+  fclose(fp);
+  rtems_set_errno_and_return_minus_one( EINVAL );
+}
+
+int getgrnam_r(
+  const char     *name,
+  struct group   *grp,
+  char           *buffer,
+  size_t          bufsize,
+  struct group  **result
+)
+{
+  return getgr_r(name, 0, grp, buffer, bufsize, result);
+}
+
+int getgrgid_r(
+  gid_t           gid,
+  struct group   *grp,
+  char           *buffer,
+  size_t          bufsize,
+  struct group  **result
+)
+{
+  return getgr_r(NULL, gid, grp, buffer, bufsize, result);
+}
diff --git a/cpukit/libcsupport/src/pwdgrp.h b/cpukit/libcsupport/src/pwdgrp.h
new file mode 100644
index 0000000..505a6e5
--- /dev/null
+++ b/cpukit/libcsupport/src/pwdgrp.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _RTEMS_LIBCSUPPORT_PWDGRP_H
+#define _RTEMS_LIBCSUPPORT_PWDGRP_H
+
+#include <grp.h>
+#include <pwd.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+void _libcsupport_pwdgrp_init(void);
+
+int _libcsupport_scanpw(
+  FILE *fp,
+  struct passwd *pwd,
+  char *buffer,
+  size_t bufsize
+);
+
+int _libcsupport_scangr(
+  FILE *fp,
+  struct group *grp,
+  char *buffer,
+  size_t bufsize
+);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_LIBCSUPPORT_PWDGRP_H */
-- 
1.8.4.5




More information about the devel mailing list