On Thursday 11 September 2008 21:43:24 Tito wrote:
> On Thursday 11 September 2008 19:26:48 Vladimir Dronnikov wrote:
> > I'd make this both FEATURED and depending on CONFIG_DESKTOP, Walter.
> > 

Hi,
just for fun here is a different approach for adding the -G switch to id.
I tested it a bit and it seems to work and to behave like the GNU id.
Maybe this code could be added to CONFIG_DESKTOP.
Size increase is:
function                                             old     new   delta
id_main                                              293     494    +201
.rodata                                           118792  118823     +31
printf_full                                           49      44      -5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 232/-5)            Total: 227 bytes


Hints, critics and improvements are as always welcome.

Ciao,
Tito 
--- include/usage_orig.h	2008-08-08 00:52:31.000000000 +0200
+++ include/usage.h	2008-09-11 22:53:26.000000000 +0200
@@ -1598,6 +1598,7 @@
 	USE_SELINUX( \
      "\n	-Z	Print the security context" \
 	) \
+     "\n	-G  Print all group IDs" \
      "\n	-g	Print group ID" \
      "\n	-u	Print user ID" \
      "\n	-n	Print name instead of a number" \
--- coreutils/id_orig.c	2008-07-05 21:07:45.000000000 +0200
+++ coreutils/id.c	2008-09-11 23:20:07.000000000 +0200
@@ -7,10 +7,11 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-/* BB_AUDIT SUSv3 _NOT_ compliant -- option -G is not currently supported. */
+/* BB_AUDIT SUSv3 compliant. */
 /* Hacked by Tito Ragusa (C) 2004 to handle usernames of whatever length and to
  * be more similar to GNU id.
  * -Z option support: by Yuichi Nakamura <[EMAIL PROTECTED]>
+ * Added -G option Tito Ragusa (C) 2008 for SUSv3.
  */
 
 #include "libbb.h"
@@ -19,17 +20,18 @@
 #define NAME_NOT_NUMBER   2
 #define JUST_USER         4
 #define JUST_GROUP        8
+#define JUST_ALL_GROUPS  16
 #if ENABLE_SELINUX
-#define JUST_CONTEXT     16
+#define JUST_CONTEXT     32
 #endif
 
-static int printf_full(unsigned int id, const char *arg, const char prefix)
+static int printf_full(unsigned int id, const char *arg, const char *prefix)
 {
-	const char *fmt = "%cid=%u";
+	const char *fmt = "%s%u";
 	int status = EXIT_FAILURE;
 
 	if (arg) {
-		fmt = "%cid=%u(%s)";
+		fmt = "%s%u(%s)";
 		status = EXIT_SUCCESS;
 	}
 	printf(fmt, prefix, id, arg);
@@ -42,6 +44,8 @@
 	struct passwd *p;
 	uid_t uid;
 	gid_t gid;
+	gid_t *groups;
+	int n;
 	unsigned long flags;
 	short status;
 #if ENABLE_SELINUX
@@ -49,8 +53,8 @@
 #endif
 	/* 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" USE_SELINUX(":u--Z:Z--u:g--Z:Z--g");
-	flags = getopt32(argv, "rnug" USE_SELINUX("Z"));
+	opt_complementary = "?1:u--g:g--u:G--u:u--G:g--G:G--g:r?ugG:n?ugG" USE_SELINUX(":u--Z:Z--u:g--Z:Z--g");
+	flags = getopt32(argv, "rnugG" USE_SELINUX("Z"));
 
 	/* This values could be overwritten later */
 	uid = geteuid();
@@ -68,6 +72,22 @@
 		/* in this case PRINT_REAL is the same */
 	}
 
+	n = getgroups(0, 0);
+	groups = (gid_t *)xmalloc(sizeof(gid_t) * n);
+	getgroups(n, (gid_t *)groups);
+
+	if (flags & (JUST_ALL_GROUPS)) {
+		while (n--) {
+			if (flags & NAME_NOT_NUMBER)
+				printf("%s", bb_getgrgid(NULL, 0, *groups++));
+			else
+				printf("%d", *groups++);
+			bb_putchar((n > 0) ? ' ' : '\n');
+		}
+		/* exit */
+		fflush_stdout_and_exit(EXIT_SUCCESS);
+	}
+
 	if (flags & (JUST_GROUP | JUST_USER USE_SELINUX(| JUST_CONTEXT))) {
 		/* JUST_GROUP and JUST_USER are mutually exclusive */
 		if (flags & NAME_NOT_NUMBER) {
@@ -101,10 +121,17 @@
 
 	/* Print full info like GNU id */
 	/* bb_getpwuid(0) doesn't exit on failure (returns NULL) */
-	status = printf_full(uid, bb_getpwuid(NULL, 0, uid), 'u');
+	status = printf_full(uid, bb_getpwuid(NULL, 0, uid), "uid=");
 	bb_putchar(' ');
-	status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), 'g');
-
+	status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), "gid=");
+	printf(" groups=");
+	while (n--) {
+		status |= printf_full(*groups, bb_getgrgid(NULL, 0, *groups), "");
+		if (n > 0)
+			bb_putchar(',');
+		groups++;
+	}
+	/* Don't free groups */
 #if ENABLE_SELINUX
 	if (is_selinux_enabled()) {
 		security_context_t mysid;
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to