X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=coreutils%2Fid.c;h=73c3c2e3bf42c69e45399c74f8dc3aa5eb5b1cee;hb=dfba741457cc81eb2ed3a9d4c074fbad74aa3249;hp=971e7cdad6949e00bca908830992fedd414ddf25;hpb=9e48045e45df7e3e205575a4eb3dc39d634b05aa;p=oweals%2Fbusybox.git diff --git a/coreutils/id.c b/coreutils/id.c index 971e7cdad..73c3c2e3b 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -21,90 +21,115 @@ */ /* 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 "pwd_.h" #include #include -#include -#include #include + #ifdef CONFIG_SELINUX -#include -#include +#include /* for is_selinux_enabled() */ #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 -extern int id_main(int argc, char **argv) +static short printf_full(unsigned int id, const char *arg, const char prefix) { - char user[9], group[9]; - long pwnam, grnam; - int uid, gid; - int flags; -#ifdef CONFIG_SELINUX - int is_flask_enabled_flag = is_flask_enabled(); -#endif - - flags = bb_getopt_ulflags(argc, argv, "ugrn"); + const char *fmt = "%cid=%u"; + short status=EXIT_FAILURE; - if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP)) - || (argc > optind + 1) - ) { - bb_show_usage(); + if(arg) { + fmt = "%cid=%u(%s)"; + status=EXIT_SUCCESS; } + bb_printf(fmt, prefix, id, arg); + return status; +} - if (argv[optind] == NULL) { - if (flags & PRINT_REAL) { - uid = getuid(); - gid = getgid(); - } else { - uid = geteuid(); - gid = getegid(); - } - my_getpwuid(user, uid); - } else { - safe_strncpy(user, argv[optind], sizeof(user)); - gid = my_getpwnamegid(user); +int id_main(int argc, char **argv) +{ + struct passwd *p; + uid_t uid; + gid_t gid; + unsigned long flags; + short status; + + /* Don't allow -n -r -nr -ug -rug -nug -rnug */ + /* Don't allow more than one username */ + bb_opt_complementally = "?1:?:u--g:g--u:r?ug:n?ug"; + flags = bb_getopt_ulflags(argc, argv, "rnug"); + + /* This values could be overwritten later */ + uid = geteuid(); + gid = getegid(); + if (flags & PRINT_REAL) { + uid = getuid(); + gid = getgid(); } - my_getgrgid(group, gid); - pwnam=my_getpwnam(user); - grnam=my_getgrnam(group); + if(argv[optind]) { + p=getpwnam(argv[optind]); + /* bb_xgetpwnam is needed because it exits on failure */ + uid = bb_xgetpwnam(argv[optind]); + gid = p->pw_gid; + /* in this case PRINT_REAL is the same */ + } - if (flags & (JUST_GROUP | JUST_USER)) { - char *s = group; - if (flags & JUST_USER) { - s = user; - grnam = pwnam; - } - if (flags & NAME_NOT_NUMBER) { - puts(s); + if(flags & (JUST_GROUP | JUST_USER)) { + /* JUST_GROUP and JUST_USER are mutually exclusive */ + if(flags & NAME_NOT_NUMBER) { + /* bb_getpwuid and bb_getgrgid exit on failure so puts cannot segfault */ + puts((flags & JUST_USER) ? bb_getpwuid(NULL, uid, -1 ) : bb_getgrgid(NULL, gid, -1 )); } else { - printf("%ld\n", grnam); + bb_printf("%u\n",(flags & JUST_USER) ? uid : gid); } - } else { + /* exit */ + bb_fflush_stdout_and_exit(EXIT_SUCCESS); + } + + /* Print full info like GNU id */ + /* bb_getpwuid doesn't exit on failure here */ + status=printf_full(uid, bb_getpwuid(NULL, uid, 0), 'u'); + putchar(' '); + /* bb_getgrgid doesn't exit on failure here */ + status|=printf_full(gid, bb_getgrgid(NULL, gid, 0), 'g'); + #ifdef CONFIG_SELINUX - printf("uid=%ld(%s) gid=%ld(%s)", pwnam, user, grnam, group); - if(is_flask_enabled_flag) - { - security_id_t mysid = getsecsid(); + if ( is_selinux_enabled() ) { + security_context_t mysid; 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); - } - else - printf("\n"); -#else - printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group); -#endif + getcon(&mysid); + context[0] = '\0'; + if (mysid) { + len = strlen(mysid)+1; + safe_strncpy(context, mysid, len); + freecon(mysid); + }else{ + safe_strncpy(context, "unknown",8); + } + bb_printf(" context=%s", context); } +#endif - bb_fflush_stdout_and_exit(0); + putchar('\n'); + bb_fflush_stdout_and_exit(status); } + +/* END CODE */ +/* +Local Variables: +c-file-style: "linux" +c-basic-offset: 4 +tab-width: 4 +End: +*/ +