extern int id_main(int argc, char **argv) { struct passwd *p; uid_t uid; gid_t gid; unsigned long flags; short status; #ifdef CONFIG_SELINUX int is_flask_enabled_flag = is_flask_enabled(); #endif 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(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 { bb_printf("%u\n",(flags & JUST_USER) ? uid : gid); } /* exit */ bb_fflush_stdout_and_exit(EXIT_SUCCESS); } /* 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'); #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"); bb_printf(" context=%s", context); } #endif putchar('\n'); bb_fflush_stdout_and_exit(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"); if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP)) || (argc > optind + 1) ) { bb_show_usage(); } 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); } my_getgrgid(group, gid); pwnam=my_getpwnam(user); grnam=my_getgrnam(group); 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); } else printf("\n"); #else printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group); #endif } bb_fflush_stdout_and_exit(0); }