X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fid.c;h=66874a71e68b3fe243316411492c9cd37b44a20a;hb=d686a045c8134d3a42fa5cc6b2e09118e08d603f;hp=db8afc58575a3493e7199786aee7878715627957;hpb=52499cb9ae01a67187c65ea43a48140b147968cf;p=oweals%2Fbusybox.git diff --git a/coreutils/id.c b/coreutils/id.c index db8afc585..66874a71e 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -4,107 +4,108 @@ * * Copyright (C) 2000 by Randolph Chung * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ /* 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 #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[32], group[32]; - 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; } + 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, sizeof(user)); - } 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 */ + opt_complementary = "?1:?:u--g:g--u:r?ug:n?ug"; + flags = getopt32(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, sizeof(group)); - 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; - } + /* JUST_GROUP and JUST_USER are mutually exclusive */ if (flags & NAME_NOT_NUMBER) { - puts(s); + /* 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); + printf("%u\n", (flags & JUST_USER) ? uid : gid); } - } else { + /* exit */ + 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); + } + printf(" context=%s", context); } +#endif - bb_fflush_stdout_and_exit(0); + putchar('\n'); + fflush_stdout_and_exit(status); }