Disable any buffering to stdout
[oweals/busybox.git] / coreutils / id.c
index 69dfe2658c855a5ef7c0be767ca5c3d64b6b90bd..971e7cdad6949e00bca908830992fedd414ddf25 100644 (file)
@@ -2,7 +2,6 @@
 /*
  * 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;
-       unsigned long 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("%lu\n", my_getpwnam(user));
-       else if (no_user) printf("%lu\n", my_getgrnam(group));
-       else
-               printf("uid=%lu(%s) gid=%lu(%s)\n",
-                          my_getpwnam(user), user, my_getgrnam(group), group);
-       
+       }
 
-       return(0);
+       bb_fflush_stdout_and_exit(0);
 }
-
-
-/* END CODE */