X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fid.c;h=6360491688e46d7d90a84d5b511ff1c7cc55ed1d;hb=47bc802e9e8942182cd3cec1b5a6c3fb62427d16;hp=971e7cdad6949e00bca908830992fedd414ddf25;hpb=9e48045e45df7e3e205575a4eb3dc39d634b05aa;p=oweals%2Fbusybox.git diff --git a/coreutils/id.c b/coreutils/id.c index 971e7cdad..636049168 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -21,90 +21,120 @@ */ /* 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 + +static short printf_full(unsigned int id, const char *arg, const char prefix) +{ + const char *fmt = "%cid=%u"; + short status=EXIT_FAILURE; + + if(arg) { + fmt = "%cid=%u(%s)"; + status=EXIT_SUCCESS; + } + bb_printf(fmt, prefix, id, arg); + return status; +} extern int id_main(int argc, char **argv) { - 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"); + struct passwd *p; + uid_t uid; + gid_t gid; + unsigned long flags; + short status; - if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP)) - || (argc > optind + 1) - ) { + bb_opt_complementaly = "u~g:g~u"; + flags = bb_getopt_ulflags(argc, argv, "rnug"); + + if ((flags & BB_GETOPT_ERROR) + /* Don't allow -n -r -nr */ + || (flags <= 3 && flags > 0) + /* Don't allow more than one username */ + || (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]) { + p=getpwnam(argv[optind]); + /* my_getpwnam is needed because it exits on failure */ + uid = my_getpwnam(argv[optind]); + gid = p->pw_gid; + /* in this case PRINT_REAL is the same */ } - if (argv[optind] == NULL) { - if (flags & PRINT_REAL) { - uid = getuid(); - gid = getgid(); + if(flags & (JUST_GROUP | JUST_USER)) { + /* JUST_GROUP and JUST_USER are mutually exclusive */ + if(flags & NAME_NOT_NUMBER) { + /* my_getpwuid and my_getgrgid exit on failure so puts cannot segfault */ + puts((flags & JUST_USER) ? my_getpwuid(NULL, uid, -1 ) : my_getgrgid(NULL, gid, -1 )); } else { - uid = geteuid(); - gid = getegid(); + bb_printf("%u\n",(flags & JUST_USER) ? uid : gid); } - my_getpwuid(user, uid); - } else { - safe_strncpy(user, argv[optind], sizeof(user)); - gid = my_getpwnamegid(user); + /* exit */ + bb_fflush_stdout_and_exit(EXIT_SUCCESS); } - my_getgrgid(group, gid); - pwnam=my_getpwnam(user); - grnam=my_getgrnam(group); + /* Print full info like GNU id */ + /* my_getpwuid doesn't exit on failure here */ + status=printf_full(uid, my_getpwuid(NULL, uid, 0), 'u'); + putchar(' '); + /* my_getgrgid doesn't exit on failure here */ + status|=printf_full(gid, my_getgrgid(NULL, gid, 0), 'g'); - 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(); + 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: +*/ +