diff --git a/coreutils/id.c b/coreutils/id.c index db8afc585..76331e48f 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -21,90 +21,121 @@ */ /* BB_AUDIT SUSv3 _NOT_ compliant -- option -G is not currently supported. */ +/* Hacked by Tito Ragusa (C) 2004 to handle usernames of whatever length and to + * be more similar to GNU id. + */ #include "busybox.h" +#include "grp_.h" +#include "pwd_.h" #include #include #include #include #include + #ifdef CONFIG_SELINUX #include #include #endif -#define JUST_USER 1 -#define JUST_GROUP 2 -#define PRINT_REAL 4 -#define NAME_NOT_NUMBER 8 +#define PRINT_REAL 1 +#define NAME_NOT_NUMBER 2 +#define JUST_USER 4 +#define JUST_GROUP 8 + +void printf_full(unsigned int id, char *arg, char prefix) +{ + printf("%cid=%u",prefix, id); + if(arg) + printf("(%s) ", arg); +} extern int id_main(int argc, char **argv) { - char user[32], group[32]; - long pwnam, grnam; - int uid, gid; + struct passwd *p; + char *user; + char *group; + uid_t uid; + gid_t gid; int flags; #ifdef CONFIG_SELINUX int is_flask_enabled_flag = is_flask_enabled(); #endif - flags = bb_getopt_ulflags(argc, argv, "ugrn"); + bb_opt_complementaly = "u~g:g~u"; + flags = bb_getopt_ulflags(argc, argv, "rnug"); - if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP)) - || (argc > optind + 1) - ) { + if ((flags & 0x80000000UL) + /* Don't allow -n -r -nr */ + || (flags <= 3 && flags > 0) + || (argc > optind + 1)) bb_show_usage(); + + /* This values could be overwritten later */ + uid = geteuid(); + gid = getegid(); + if (flags & PRINT_REAL) { + uid = getuid(); + gid = getgid(); } + + if(argv[optind]) + { - if (argv[optind] == NULL) { - if (flags & PRINT_REAL) { - uid = getuid(); - gid = getgid(); - } else { - uid = geteuid(); - gid = getegid(); - } - my_getpwuid(user, uid, sizeof(user)); - } else { - safe_strncpy(user, argv[optind], sizeof(user)); - gid = my_getpwnamegid(user); + p=getpwnam(argv[optind]); + /* this is needed because it exits on failure */ + uid = my_getpwnam(argv[optind]); + gid = p->pw_gid; + /* in this case PRINT_REAL is the same */ } - my_getgrgid(group, gid, sizeof(group)); + + user=my_getpwuid(NULL, uid, (flags & JUST_USER) ? -1 : 0); - pwnam=my_getpwnam(user); - grnam=my_getgrnam(group); + if(flags & JUST_USER) + { + gid=uid; + group=user; + goto PRINT; + } + + group=my_getgrgid(NULL, gid, (flags & JUST_GROUP) ? -1 : 0); - if (flags & (JUST_GROUP | JUST_USER)) { - char *s = group; - if (flags & JUST_USER) { - s = user; - grnam = pwnam; - } - if (flags & NAME_NOT_NUMBER) { - puts(s); - } else { - printf("%ld\n", grnam); - } - } else { -#ifdef CONFIG_SELINUX - printf("uid=%ld(%s) gid=%ld(%s)", pwnam, user, grnam, group); - if(is_flask_enabled_flag) - { - security_id_t mysid = getsecsid(); - char context[80]; - int len = sizeof(context); - context[0] = '\0'; - if(security_sid_to_context(mysid, context, &len)) - strcpy(context, "unknown"); - printf(" context=%s\n", context); - } + if(flags & JUST_GROUP) + { +PRINT: + if(flags & NAME_NOT_NUMBER) + puts(group); else - printf("\n"); -#else - printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group); -#endif - + printf ("%u\n", gid); + bb_fflush_stdout_and_exit(EXIT_SUCCESS); } - - bb_fflush_stdout_and_exit(0); + + /* Print full info like GNU id */ + printf_full(uid, user, 'u'); + printf_full(gid, group, 'g'); +#ifdef CONFIG_SELINUX + if(is_flask_enabled_flag) + { + security_id_t mysid = getsecsid(); + char context[80]; + int len = sizeof(context); + context[0] = '\0'; + if(security_sid_to_context(mysid, context, &len)) + strcpy(context, "unknown"); + printf("context=%s", context); + } +#endif + puts(""); + bb_fflush_stdout_and_exit((user && group) ? EXIT_SUCCESS : EXIT_FAILURE); } + +/* END CODE */ +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/ + diff --git a/coreutils/whoami.c b/coreutils/whoami.c index c979b0dd9..6a6e2eec9 100644 --- a/coreutils/whoami.c +++ b/coreutils/whoami.c @@ -26,21 +26,13 @@ #include #include #include "busybox.h" -#include "pwd_.h" -#include "grp_.h" extern int whoami_main(int argc, char **argv) { - struct passwd *p; - uid_t uid; - if (argc > 1) bb_show_usage(); - uid = geteuid(); - if((p = getpwuid(uid))!=NULL) { - puts(p->pw_name); - bb_fflush_stdout_and_exit(EXIT_SUCCESS); - } - bb_error_msg_and_die("cannot find username for UID %u", (unsigned) uid); + puts(my_getpwuid(NULL, geteuid(), -1)); + /* exits on error */ + bb_fflush_stdout_and_exit(EXIT_SUCCESS); } diff --git a/include/libbb.h b/include/libbb.h index 78b9711e8..51afd1e9d 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -232,7 +232,6 @@ extern long my_getpwnam(const char *name); extern long my_getgrnam(const char *name); extern char * my_getpwuid(char *name, long uid, int bufsize); extern char * my_getgrgid(char *group, long gid, int bufsize); -extern long my_getpwnamegid(const char *name); extern char *bb_askpass(int timeout, const char * prompt); extern int device_open(const char *device, int mode); diff --git a/libbb/Makefile.in b/libbb/Makefile.in index f993b21ea..26ed5b132 100644 --- a/libbb/Makefile.in +++ b/libbb/Makefile.in @@ -34,7 +34,7 @@ LIBBB_SRC:= \ human_readable.c inet_common.c inode_hash.c interface.c isdirectory.c \ kernel_version.c last_char_is.c llist_add_to.c login.c loop.c \ make_directory.c mode_string.c module_syscalls.c mtab.c mtab_file.c \ - my_getgrgid.c my_getgrnam.c my_getpwnam.c my_getpwnamegid.c \ + my_getgrgid.c my_getgrnam.c my_getpwnam.c \ my_getpwuid.c obscure.c parse_mode.c parse_number.c perror_msg.c \ perror_msg_and_die.c print_file.c get_console.c \ process_escape_sequence.c procps.c pwd2spwd.c pw_encrypt.c qmodule.c \ diff --git a/libbb/my_getgrgid.c b/libbb/my_getgrgid.c index e6b877687..8c530964c 100644 --- a/libbb/my_getgrgid.c +++ b/libbb/my_getgrgid.c @@ -19,8 +19,23 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + /* Hacked by Tito Ragusa (c) 2004 to make it more + * flexible : + * + * if bufsize is > 0 char *group cannot be set to NULL + * on success groupname is written on static allocated buffer + * on failure gid as string is written to buffer and NULL is returned + * if bufsize is = 0 char *group can be set to NULL + * on success groupname is returned + * on failure NULL is returned + * if bufsize is < 0 char *group can be set to NULL + * on success groupname is returned + * on failure an error message is printed and the program exits + */ + #include #include +#include #include "libbb.h" #include "pwd_.h" #include "grp_.h" @@ -33,10 +48,21 @@ char * my_getgrgid(char *group, long gid, int bufsize) mygroup = getgrgid(gid); if (mygroup==NULL) { - snprintf(group, bufsize, "%ld", gid); + if(bufsize > 0) { + assert(group != NULL); + snprintf(group, bufsize, "%ld", (long)gid); + } + if( bufsize < 0 ) { + bb_error_msg_and_die("unknown gid %ld", (long)gid); + } return NULL; } else { - return safe_strncpy(group, mygroup->gr_name, bufsize); + if(bufsize > 0) + { + assert(group != NULL); + return safe_strncpy(group, mygroup->gr_name, bufsize); + } + return mygroup->gr_name; } } diff --git a/libbb/my_getpwuid.c b/libbb/my_getpwuid.c index 53f6c77ee..1e8b11a09 100644 --- a/libbb/my_getpwuid.c +++ b/libbb/my_getpwuid.c @@ -19,8 +19,23 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + /* Hacked by Tito Ragusa (c) 2004 to make it more + * flexible : + * + * if bufsize is > 0 char *user can not be set to NULL + * on success username is written on static allocated buffer + * on failure uid as string is written to buffer and NULL is returned + * if bufsize is = 0 char *user can be set to NULL + * on success username is returned + * on failure NULL is returned + * if bufsize is < 0 char *user can be set to NULL + * on success username is returned + * on failure an error message is printed and the program exits + */ + #include #include +#include #include "libbb.h" #include "pwd_.h" #include "grp_.h" @@ -34,10 +49,21 @@ char * my_getpwuid(char *name, long uid, int bufsize) myuser = getpwuid(uid); if (myuser==NULL) { - snprintf(name, bufsize, "%ld", (long)uid); + if(bufsize > 0) { + assert(name != NULL); + snprintf(name, bufsize, "%ld", (long)uid); + } + if (bufsize < 0 ) { + bb_error_msg_and_die("unknown uid %ld", (long)uid); + } return NULL; } else { - return safe_strncpy(name, myuser->pw_name, bufsize); + if(bufsize > 0 ) + { + assert(name != NULL); + return safe_strncpy(name, myuser->pw_name, bufsize); + } + return myuser->pw_name; } } diff --git a/loginutils/passwd.c b/loginutils/passwd.c index d0b2afc19..400ddb9a5 100644 --- a/loginutils/passwd.c +++ b/loginutils/passwd.c @@ -145,7 +145,6 @@ extern int passwd_main(int argc, char **argv) int uflg = 0; /* -u - unlock account */ int dflg = 0; /* -d - delete password */ const struct passwd *pw; - unsigned short ruid; #ifdef CONFIG_FEATURE_SHADOWPASSWDS const struct spwd *sp; @@ -170,12 +169,8 @@ extern int passwd_main(int argc, char **argv) bb_show_usage(); } } - ruid = getuid(); - pw = (struct passwd *) getpwuid(ruid); - if (!pw) { - bb_error_msg_and_die("Cannot determine your user name."); - } - myname = (char *) bb_xstrdup(pw->pw_name); + myname = (char *) bb_xstrdup(my_getpwuid(NULL, getuid(), -1)); + /* exits on error */ if (optind < argc) { name = argv[optind]; } else {