/*
* Mini id implementation for busybox
*
- *
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
*
* This program is free software; you can redistribute it and/or modify
*
*/
-#include "internal.h"
+/* BB_AUDIT SUSv3 _NOT_ compliant -- option -G is not currently supported. */
+
+#include "busybox.h"
#include <stdio.h>
#include <unistd.h>
-#include <pwd.h>
-#include <grp.h>
+#include <getopt.h>
+#include <string.h>
#include <sys/types.h>
-
-static const char id_usage[] =
- "id [OPTIONS]... [USERNAME]\n"
-#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nPrint information for USERNAME or the current user\n\n"
- "Options:\n"
- "\t-g\tprints only the group ID\n"
- "\t-u\tprints only the user ID\n"
- "\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n"
+#ifdef CONFIG_SELINUX
+#include <proc_secure.h>
+#include <flask_util.h>
#endif
- ;
+
+#define JUST_USER 1
+#define JUST_GROUP 2
+#define PRINT_REAL 4
+#define NAME_NOT_NUMBER 8
extern int id_main(int argc, char **argv)
{
- int no_user = 0, no_group = 0, print_real = 0;
- char *cp, *user, *group;
- gid_t gid;
+ 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
- cp = user = group = NULL;
+ flags = bb_getopt_ulflags(argc, argv, "ugrn");
- argc--; argv++;
+ if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP))
+ || (argc > optind + 1)
+ ) {
+ bb_show_usage();
+ }
- while (argc > 0) {
- cp = *argv;
- if (*cp == '-') {
- switch (*++cp) {
- case 'u': no_group = 1; break;
- case 'g': no_user = 1; break;
- case 'r': print_real = 1; break;
- default: usage(id_usage);
- }
+ if (argv[optind] == NULL) {
+ if (flags & PRINT_REAL) {
+ uid = getuid();
+ gid = getgid();
} else {
- user = cp;
+ uid = geteuid();
+ gid = getegid();
}
- argc--; argv++;
+ my_getpwuid(user, uid);
+ } else {
+ safe_strncpy(user, argv[optind], sizeof(user));
+ gid = my_getpwnamegid(user);
}
+ my_getgrgid(group, gid);
- if (no_user && no_group) usage(id_usage);
+ pwnam=my_getpwnam(user);
+ grnam=my_getgrnam(group);
- if (user == NULL) {
- user = xmalloc(9);
- group = xmalloc(9);
- if (print_real) {
- my_getpwuid(user, getuid());
- my_getgrgid(group, getgid());
+ 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 {
- my_getpwuid(user, geteuid());
- my_getgrgid(group, getegid());
+ printf("%ld\n", grnam);
}
} else {
- group = xmalloc(9);
- gid = my_getpwnamegid(user);
- my_getgrgid(group, gid);
- }
+#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
- if (no_group) printf("%u\n", my_getpwnam(user));
- else if (no_user) printf("%u\n", my_getgrnam(group));
- else
- printf("uid=%u(%s) gid=%u(%s)\n",
- my_getpwnam(user), user, my_getgrnam(group), group);
-
+ }
- exit(0);
+ bb_fflush_stdout_and_exit(0);
}
-
-
-/* END CODE */