/* userspec.c -- Parse a user and group string.
- Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
+ Copyright (C) 1989-1992, 1997, 1998 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
-\f
-#ifdef HAVE_CONFIG_H
-#if defined (CONFIG_BROKETS)
-/* We use <config.h> instead of "config.h" so that a compilation
- using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
- (which it would do because it found this file in $srcdir). */
-#include <config.h>
-#else
-#include "config.h"
-#endif
+
+#if HAVE_CONFIG_H
+# include <config.h>
#endif
-/* FIXME: include alloca junk. */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ # pragma alloca
+# else
+char *alloca ();
+# endif
+# endif
+#endif
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
-#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
-#include <string.h>
-#ifndef index
-#define index strchr
-#endif
+#if HAVE_STRING_H
+# include <string.h>
#else
-#include <strings.h>
+# include <strings.h>
+# ifndef strchr
+# define strchr index
+# endif
#endif
-#ifdef STDC_HEADERS
-#include <stdlib.h>
+#if STDC_HEADERS
+# include <stdlib.h>
#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
#endif
#ifndef _POSIX_VERSION
struct group *getgrgid ();
#endif
-#ifdef _POSIX_SOURCE
-#define endpwent()
-#define endgrent()
+#ifndef HAVE_ENDGRENT
+# define endgrent() ((void) 0)
+#endif
+
+#ifndef HAVE_ENDPWENT
+# define endpwent() ((void) 0)
#endif
/* Perform the equivalent of the statement `dest = strdup (src);',
#define isdigit(c) ((c) >= '0' && (c) <= '9')
+#ifndef strdup
char *strdup ();
+#endif
/* Return nonzero if STR represents an unsigned decimal integer,
otherwise return 0. */
static int
-isnumber (str)
- const char *str;
+is_number (const char *str)
{
for (; *str; str++)
if (!isdigit (*str))
Return NULL if successful, a static error message string if not. */
const char *
-parse_user_spec (spec_arg, uid, gid, username_arg, groupname_arg)
- const char *spec_arg;
- uid_t *uid;
- gid_t *gid;
- char **username_arg, **groupname_arg;
+parse_user_spec (const char *spec_arg, uid_t *uid, gid_t *gid,
+ char **username_arg, char **groupname_arg)
{
static const char *tired = "virtual memory exhausted";
const char *error_msg;
char *spec; /* A copy we can write on. */
struct passwd *pwd;
struct group *grp;
- int spec_len;
char *g, *u, *separator;
char *groupname;
*username_arg = *groupname_arg = NULL;
groupname = NULL;
- /* FIXME: use this instead: V_STRDUP (spec, spec_arg); */
- spec_len = strlen (spec_arg);
- spec = (char *) alloca (strlen (spec_arg) + 1);
- strcpy (spec, spec_arg);
+ V_STRDUP (spec, spec_arg);
/* Find the separator if there is one. */
- separator = index (spec, ':');
+ separator = strchr (spec, ':');
if (separator == NULL)
- separator = index (spec, '.');
+ separator = strchr (spec, '.');
/* Replace separator with a NUL. */
if (separator != NULL)
if (u == NULL && g == NULL)
return "can not omit both user and group";
+#ifdef __DJGPP__
+ /* Pretend that we are the user U whose group is G. This makes
+ pwd and grp functions ``know'' about the UID and GID of these. */
+ if (u && !is_number (u))
+ setenv ("USER", u, 1);
+ if (g && !is_number (g))
+ setenv ("GROUP", g, 1);
+#endif
+
if (u != NULL)
{
pwd = getpwnam (u);
if (pwd == NULL)
{
- if (!isnumber (u))
+ if (!is_number (u))
error_msg = "invalid user";
else
{
grp = getgrnam (g);
if (grp == NULL)
{
- if (!isnumber (g))
+ if (!is_number (g))
error_msg = "invalid group";
else
*gid = atoi (g);
return error_msg;
}
-#ifdef TESTING
+#ifdef TEST
-#define NULL_CHECK(s) ((s) == NULL ? "(null)" : (s))
+# define NULL_CHECK(s) ((s) == NULL ? "(null)" : (s))
int
main (int argc, char **argv)