From ccb13cfe7c506159412f124b17e1bba61a035913 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 9 Aug 2001 22:11:19 +0000 Subject: 2001-08-09 Fernando-Ruiz Casas * libc/getgrent.c, libc/getpwent.c: the 'ls' and more related command previous failed after a chroot(). (unknown user & group) --- c/src/lib/ChangeLog | 5 +++++ c/src/lib/libc/getgrent.c | 17 +++++++++++++++++ c/src/lib/libc/getpwent.c | 19 +++++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) (limited to 'c/src/lib') diff --git a/c/src/lib/ChangeLog b/c/src/lib/ChangeLog index ac0322b7bf..a4d4064130 100644 --- a/c/src/lib/ChangeLog +++ b/c/src/lib/ChangeLog @@ -1,3 +1,8 @@ +2001-08-09 Fernando-Ruiz Casas + + * libc/getgrent.c, libc/getpwent.c: the 'ls' and more related command + previous failed after a chroot(). (unknown user & group) + 2001-08-03 Joel Sherrill * libc/libio_sockets.c (rtems_bsdnet_fdToSocket): Per bug diff --git a/c/src/lib/libc/getgrent.c b/c/src/lib/libc/getgrent.c index e4fc0fe474..104b0a317f 100644 --- a/c/src/lib/libc/getgrent.c +++ b/c/src/lib/libc/getgrent.c @@ -21,6 +21,9 @@ #include #include +#include + + static struct group gr_group; /* password structure */ static FILE *group_fp; @@ -47,11 +50,14 @@ int getgrnam_r( ) { FILE *fp; + rtems_user_env_t * aux=rtems_current_user_env; /* save */ init_etc_passwd_group(); + rtems_current_user_env=&rtems_global_user_env; /* set root */ if ((fp = fopen ("/etc/group", "r")) == NULL) { errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -66,11 +72,13 @@ int getgrnam_r( if (!strcmp (groupname, name)) { fclose (fp); *result = grp; + rtems_current_user_env=aux; /* restore */ return 0; } } fclose (fp); errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -96,11 +104,15 @@ int getgrgid_r( ) { FILE *fp; + rtems_user_env_t * aux=rtems_current_user_env; /* save */ + init_etc_passwd_group(); + rtems_current_user_env=&rtems_global_user_env; /* set root */ if ((fp = fopen ("/etc/group", "r")) == NULL) { errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -116,11 +128,13 @@ int getgrgid_r( if (gid == gr_group.gr_gid) { fclose (fp); *result = grp; + rtems_current_user_env=aux; /* restore */ return 0; } } fclose (fp); errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -160,12 +174,15 @@ struct group *getgrent( void ) void setgrent () { + rtems_user_env_t * aux=rtems_current_user_env; /* save */ init_etc_passwd_group(); + rtems_current_user_env=&rtems_global_user_env; /* set root */ if (group_fp != NULL) fclose (group_fp); group_fp = fopen ("/etc/group", "r"); + rtems_current_user_env=aux; /* restore */ } void diff --git a/c/src/lib/libc/getpwent.c b/c/src/lib/libc/getpwent.c index 7b56e26228..91b6550f59 100644 --- a/c/src/lib/libc/getpwent.c +++ b/c/src/lib/libc/getpwent.c @@ -23,6 +23,8 @@ #include #include +#include + static struct passwd pw_passwd; /* password structure */ static FILE *passwd_fp; @@ -56,7 +58,7 @@ void init_etc_passwd_group(void) if ( etc_passwd_initted ) return; etc_passwd_initted = 1; - + (void) mkdir( "/etc", 0777); /* @@ -80,7 +82,7 @@ void init_etc_passwd_group(void) return; fprintf( fp, "root:x:0:root\n" - "rtems:x:1:rtems\n" + "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose( fp ); @@ -95,11 +97,14 @@ int getpwnam_r( ) { FILE *fp; + rtems_user_env_t * aux=rtems_current_user_env; /* save */ init_etc_passwd_group(); + rtems_current_user_env=&rtems_global_user_env; /* set root */ if ((fp = fopen ("/etc/passwd", "r")) == NULL) { errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -118,11 +123,13 @@ int getpwnam_r( if (!strcmp (logname, name)) { fclose (fp); *result = pwd; + rtems_current_user_env=aux; /* restore */ return 0; } } fclose (fp); errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -148,11 +155,14 @@ int getpwuid_r( ) { FILE *fp; + rtems_user_env_t * aux=rtems_current_user_env; /* save */ init_etc_passwd_group(); + rtems_current_user_env=&rtems_global_user_env; /* set root */ if ((fp = fopen ("/etc/passwd", "r")) == NULL) { errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -171,11 +181,13 @@ int getpwuid_r( if (uid == pwd->pw_uid) { fclose (fp); *result = pwd; + rtems_current_user_env=aux; /* restore */ return 0; } } fclose (fp); errno = EINVAL; + rtems_current_user_env=aux; /* restore */ return -1; } @@ -218,12 +230,15 @@ struct passwd *getpwent() void setpwent( void ) { + rtems_user_env_t * aux=rtems_current_user_env; /* save */ init_etc_passwd_group(); + rtems_current_user_env=&rtems_global_user_env; /* set root */ if (passwd_fp != NULL) fclose (passwd_fp); passwd_fp = fopen ("/etc/passwd", "r"); + rtems_current_user_env=aux; /* restore */ } void endpwent( void ) -- cgit v1.2.3