Changeset 1765 in MondoRescue for branches/2.2.5/mindi-busybox/coreutils/id.c


Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/coreutils/id.c

    r821 r1765  
    1111/* Hacked by Tito Ragusa (C) 2004 to handle usernames of whatever length and to
    1212 * be more similar to GNU id.
     13 * -Z option support: by Yuichi Nakamura <ynakam@hitachisoft.jp>
    1314 */
    1415
    15 #include "busybox.h"
    16 #include "pwd_.h"
    17 #include <stdio.h>
    18 #include <unistd.h>
    19 #include <sys/types.h>
    20 
    21 #ifdef CONFIG_SELINUX
    22 #include <selinux/selinux.h>          /* for is_selinux_enabled() */
    23 #endif
     16#include "libbb.h"
    2417
    2518#define PRINT_REAL        1
     
    2720#define JUST_USER         4
    2821#define JUST_GROUP        8
     22#if ENABLE_SELINUX
     23#define JUST_CONTEXT     16
     24#endif
    2925
    30 static short printf_full(unsigned int id, const char *arg, const char prefix)
     26static int printf_full(unsigned int id, const char *arg, const char prefix)
    3127{
    3228    const char *fmt = "%cid=%u";
    33     short status=EXIT_FAILURE;
     29    int status = EXIT_FAILURE;
    3430
    35     if(arg) {
     31    if (arg) {
    3632        fmt = "%cid=%u(%s)";
    37         status=EXIT_SUCCESS;
     33        status = EXIT_SUCCESS;
    3834    }
    39     bb_printf(fmt, prefix, id, arg);
     35    printf(fmt, prefix, id, arg);
    4036    return status;
    4137}
    4238
     39int id_main(int argc, char **argv);
    4340int id_main(int argc, char **argv)
    4441{
     
    4845    unsigned long flags;
    4946    short status;
    50 
     47#if ENABLE_SELINUX
     48    security_context_t scontext;
     49#endif
    5150    /* Don't allow -n -r -nr -ug -rug -nug -rnug */
    5251    /* Don't allow more than one username */
    53     bb_opt_complementally = "?1:?:u--g:g--u:r?ug:n?ug";
    54     flags = bb_getopt_ulflags(argc, argv, "rnug");
     52    opt_complementary = "?1:u--g:g--u:r?ug:n?ug" USE_SELINUX(":u--Z:Z--u:g--Z:Z--g");
     53    flags = getopt32(argv, "rnug" USE_SELINUX("Z"));
    5554
    5655    /* This values could be overwritten later */
     
    6261    }
    6362
    64     if(argv[optind]) {
    65         p=getpwnam(argv[optind]);
    66         /* bb_xgetpwnam is needed because it exits on failure */
    67         uid = bb_xgetpwnam(argv[optind]);
     63    if (argv[optind]) {
     64        p = getpwnam(argv[optind]);
     65        /* xuname2uid is needed because it exits on failure */
     66        uid = xuname2uid(argv[optind]);
    6867        gid = p->pw_gid;
    6968        /* in this case PRINT_REAL is the same */
    7069    }
    7170
    72     if(flags & (JUST_GROUP | JUST_USER)) {
     71    if (flags & (JUST_GROUP | JUST_USER USE_SELINUX(| JUST_CONTEXT))) {
    7372        /* JUST_GROUP and JUST_USER are mutually exclusive */
    74         if(flags & NAME_NOT_NUMBER) {
    75             /* bb_getpwuid and bb_getgrgid exit on failure so puts cannot segfault */
    76             puts((flags & JUST_USER) ? bb_getpwuid(NULL, uid, -1 ) : bb_getgrgid(NULL, gid, -1 ));
     73        if (flags & NAME_NOT_NUMBER) {
     74            /* bb_getXXXid(-1) exit on failure, puts cannot segfault */
     75            puts((flags & JUST_USER) ? bb_getpwuid(NULL, -1, uid) : bb_getgrgid(NULL, -1, gid));
    7776        } else {
    78             bb_printf("%u\n",(flags & JUST_USER) ? uid : gid);
     77            if (flags & JUST_USER) {
     78                printf("%u\n", uid);
     79            }
     80            if (flags & JUST_GROUP) {
     81                printf("%u\n", gid);
     82            }
    7983        }
     84
     85#if ENABLE_SELINUX
     86        if (flags & JUST_CONTEXT) {
     87            selinux_or_die();
     88            if (argc - optind == 1) {
     89                bb_error_msg_and_die("user name can't be passed with -Z");
     90            }
     91
     92            if (getcon(&scontext)) {
     93                bb_error_msg_and_die("can't get process context");
     94            }
     95            printf("%s\n", scontext);
     96        }
     97#endif
    8098        /* exit */
    81         bb_fflush_stdout_and_exit(EXIT_SUCCESS);
     99        fflush_stdout_and_exit(EXIT_SUCCESS);
    82100    }
    83101
    84102    /* Print full info like GNU id */
    85     /* bb_getpwuid doesn't exit on failure here */
    86     status=printf_full(uid, bb_getpwuid(NULL, uid, 0), 'u');
     103    /* bb_getpwuid(0) doesn't exit on failure (returns NULL) */
     104    status = printf_full(uid, bb_getpwuid(NULL, 0, uid), 'u');
    87105    putchar(' ');
    88     /* bb_getgrgid doesn't exit on failure here */
    89     status|=printf_full(gid, bb_getgrgid(NULL, gid, 0), 'g');
     106    status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), 'g');
    90107
    91 #ifdef CONFIG_SELINUX
    92     if ( is_selinux_enabled() ) {
    93             security_context_t mysid;
    94             char context[80];
    95             int len = sizeof(context);
     108#if ENABLE_SELINUX
     109    if (is_selinux_enabled()) {
     110        security_context_t mysid;
     111        const char *context;
    96112
    97             getcon(&mysid);
    98             context[0] = '\0';
    99             if (mysid) {
    100                     len = strlen(mysid)+1;
    101                     safe_strncpy(context, mysid, len);
    102                     freecon(mysid);
    103             }else{
    104                     safe_strncpy(context, "unknown",8);
    105             }
    106         bb_printf(" context=%s", context);
     113        context = "unknown";
     114        getcon(&mysid);
     115        if (mysid) {
     116            context = alloca(strlen(mysid) + 1);
     117            strcpy((char*)context, mysid);
     118            freecon(mysid);
     119        }
     120        printf(" context=%s", context);
    107121    }
    108122#endif
    109123
    110124    putchar('\n');
    111     bb_fflush_stdout_and_exit(status);
     125    fflush_stdout_and_exit(status);
    112126}
Note: See TracChangeset for help on using the changeset viewer.