diff options
| author | Eric Andersen <andersen@codepoet.org> | 2003-11-02 21:55:06 +0000 | 
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 2003-11-02 21:55:06 +0000 | 
| commit | dae4f33e486b80e3d957e35355ca0a63cd90f4bd (patch) | |
| tree | b4c96edde14b9ae4e3da83d979d3e41c4f894dd6 | |
| parent | ded0e9aba41f65618cc4b329cdad753f01f9875a (diff) | |
Additional passwd and group tests
| -rw-r--r-- | test/pwd_grp/.cvsignore | 11 | ||||
| -rw-r--r-- | test/pwd_grp/Makefile | 33 | ||||
| -rw-r--r-- | test/pwd_grp/getgroups.c | 108 | ||||
| -rw-r--r-- | test/pwd_grp/grcat.c | 33 | ||||
| -rw-r--r-- | test/pwd_grp/pwcat.c | 18 | 
5 files changed, 157 insertions, 46 deletions
| diff --git a/test/pwd_grp/.cvsignore b/test/pwd_grp/.cvsignore index 208dd67ee..702ed42e9 100644 --- a/test/pwd_grp/.cvsignore +++ b/test/pwd_grp/.cvsignore @@ -1,23 +1,20 @@  test_grp -test_grp.o  test_grp.out  test_grp_glibc -test_grp_glibc.o  test_grp_glibc.out  test_pwd  test_pwd.out  test_pwd_glibc  test_pwd_glibc.out  pwcat -pwcat.o  pwcat.out  pwcat_glibc -pwcat_glibc.o  pwcat_glibc.out  grcat -grcat.o  grcat.out  grcat_glibc -grcat_glibc.o  grcat_glibc.out - +getgroups +getgroups.out +getgroups_glibc +getgroups_glibc.out diff --git a/test/pwd_grp/Makefile b/test/pwd_grp/Makefile index c4242715d..cee133bff 100644 --- a/test/pwd_grp/Makefile +++ b/test/pwd_grp/Makefile @@ -24,7 +24,8 @@ TARGETS=test_pwd test_pwd_glibc  TARGETS+=test_grp test_grp_glibc  TARGETS+=pwcat pwcat_glibc  TARGETS+=grcat grcat_glibc -TARGETS+=test_pwd_diff test_grp_diff pwcat_diff grcat_diff +TARGETS+=getgroups getgroups_glibc +TARGETS+=test_pwd_diff test_grp_diff pwcat_diff grcat_diff getgroups_diff  all: $(TARGETS) @@ -116,6 +117,28 @@ grcat_glibc: grcat.c Makefile  	-./$@ 2>&1 >grcat_glibc.out  	-@ echo " " +getgroups: getgroups.c Makefile $(TESTDIR)/Config $(TESTDIR)/Rules.mak $(CC) +	-@ echo "-------" +	-@ echo " " +	-@ echo "Compiling vs uClibc: " +	-@ echo " " +	$(CC) $(CFLAGS) -c $< -o $@.o +	$(CC) $(LDFLAGS) $@.o -o $@ $(EXTRA_LIBS) +	$(STRIPTOOL) -x -R .note -R .comment $@ +	-./$@ 2>&1 >getgroups.out +	-@ echo " " + +getgroups_glibc: getgroups.c Makefile +	-@ echo "-------" +	-@ echo " " +	-@ echo "Compiling vs GNU libc: " +	-@ echo " " +	$(HOSTCC) $(GLIBC_CFLAGS) -c $< -o $@.o +	$(HOSTCC) $(GLIBC_LDFLAGS) $@.o -o $@ +	$(STRIPTOOL) -x -R .note -R .comment $@ +	-./$@ 2>&1 >getgroups_glibc.out +	-@ echo " " +  test_pwd_diff: test_pwd_glibc test_pwd  	-@ echo "-------"  	-@ echo " " @@ -148,6 +171,14 @@ grcat_diff: grcat_glibc grcat  	-diff -u grcat_glibc.out grcat.out  	-@ echo " " +getgroups_diff: getgroups_glibc getgroups +	-@ echo "-------" +	-@ echo " " +	-@ echo "Diffing output: " +	-@ echo " " +	-diff -u getgroups_glibc.out getgroups.out +	-@ echo " " +  clean:  	$(RM) *.[oa] *~ core $(TARGETS) *.out diff --git a/test/pwd_grp/getgroups.c b/test/pwd_grp/getgroups.c new file mode 100644 index 000000000..ea31b5829 --- /dev/null +++ b/test/pwd_grp/getgroups.c @@ -0,0 +1,108 @@ +/* This test was ripped out of GNU 'id' from coreutils-5.0 + * by Erik Andersen.   + * + * + * id is Copyright (C) 1989-2003 Free Software Foundation, Inc. + * and licensed under the GPL v2 or later, and was written by  + * Arnold Robbins, with a major rewrite by David MacKenzie, + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#include <grp.h> +#include <err.h> + +/* The number of errors encountered so far. */ +static int problems = 0; + +/* Print the name or value of group ID GID. */ +static void +print_group (gid_t gid) +{ +    struct group *grp = NULL; + +    grp = getgrgid (gid); +    if (grp == NULL) +    { +	warn("cannot find name for group ID %u", gid); +	problems++; +    } + +    if (grp == NULL) +	printf ("%u", (unsigned) gid); +    else +	printf ("%s", grp->gr_name); +} + +static int +xgetgroups (gid_t gid, int *n_groups, gid_t **groups) +{ +    int max_n_groups; +    int ng; +    gid_t *g; +    int fail = 0; + +    max_n_groups = getgroups (0, NULL); + +    /* Add 1 just in case max_n_groups is zero.  */ +    g = (gid_t *) malloc (max_n_groups * sizeof (gid_t) + 1); +    if (g==NULL) +	err(EXIT_FAILURE, "out of memory"); +    ng = getgroups (max_n_groups, g); + +    if (ng < 0) +    { +	warn("cannot get supplemental group list"); +	++fail; +	free (groups); +    } +    if (!fail) +    { +	*n_groups = ng; +	*groups = g; +    } +    return fail; +} + +/* Print all of the distinct groups the user is in. */ +int main (int argc, char **argv) +{ +    struct passwd *pwd; + +    pwd = getpwuid (getuid()); +    if (pwd == NULL) +	problems++; + +    print_group (getgid()); +    if (getegid() != getgid()) +    { +	putchar (' '); +	print_group (getegid()); +    } + +    { +	int n_groups; +	gid_t *groups; +	register int i; + +	if (xgetgroups ((pwd ? pwd->pw_gid : (gid_t) -1), +		    &n_groups, &groups)) +	{ +	    return ++problems; +	} + +	for (i = 0; i < n_groups; i++) +	    if (groups[i] != getgid() && groups[i] != getegid()) +	    { +		putchar (' '); +		print_group (groups[i]); +	    } +	free (groups); +    } +    putchar('\n'); +    return (problems != 0); +} + diff --git a/test/pwd_grp/grcat.c b/test/pwd_grp/grcat.c index 835671422..a89614025 100644 --- a/test/pwd_grp/grcat.c +++ b/test/pwd_grp/grcat.c @@ -8,40 +8,25 @@   * Public Domain   */ -/* For OS/2, do nothing. */ -#if HAVE_CONFIG_H -#include <config.h> -#endif - -#if defined (STDC_HEADERS)  #include <stdlib.h> -#endif - -#ifndef HAVE_GETGRENT -int main() { return 0; } -#else  #include <stdio.h>  #include <grp.h> -int -main(argc, argv) -int argc; -char **argv; +int main(int argc, char **argv)  {      struct group *g;      int i;      while ((g = getgrent()) != NULL) { -        printf("%s:%s:%ld:", g->gr_name, g->gr_passwd, -                                     (long) g->gr_gid); -        for (i = 0; g->gr_mem[i] != NULL; i++) { -            printf("%s", g->gr_mem[i]); -            if (g->gr_mem[i+1] != NULL) -                putchar(','); -        } -        putchar('\n'); +	printf("%s:%s:%ld:", g->gr_name, g->gr_passwd, +		(long) g->gr_gid); +	for (i = 0; g->gr_mem[i] != NULL; i++) { +	    printf("%s", g->gr_mem[i]); +	    if (g->gr_mem[i+1] != NULL) +		putchar(','); +	} +	putchar('\n');      }      endgrent();      return 0;  } -#endif /* HAVE_GETGRENT */ diff --git a/test/pwd_grp/pwcat.c b/test/pwd_grp/pwcat.c index d6ad0b64b..afad8e18b 100644 --- a/test/pwd_grp/pwcat.c +++ b/test/pwd_grp/pwcat.c @@ -8,28 +8,18 @@   * Public Domain   */ -#if HAVE_CONFIG_H -#include <config.h> -#endif -  #include <stdio.h>  #include <pwd.h> - -#if defined (STDC_HEADERS)  #include <stdlib.h> -#endif -int -main(argc, argv) -int argc; -char **argv; +int main(int argc, char **argv)  {      struct passwd *p;      while ((p = getpwent()) != NULL) -        printf("%s:%s:%ld:%ld:%s:%s:%s\n", -            p->pw_name, p->pw_passwd, (long) p->pw_uid, -            (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell); +	printf("%s:%s:%ld:%ld:%s:%s:%s\n", +		p->pw_name, p->pw_passwd, (long) p->pw_uid, +		(long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);      endpwent();      return 0; | 
