<div dir="ltr"><div>the version of toybox checked in to AOSP works just fine already:</div><div><br></div><div>$ adb shell toybox id -u</div><div>0</div><div>$ adb shell toybox id -g</div><div>0</div><div>$ adb unroot<br></div><div>restarting adbd as non root</div><div>$ adb shell toybox id -u</div><div>2000</div><div>$ adb shell toybox id -g</div><div>2000</div><div>$ </div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 19, 2015 at 7:08 PM, hhm <span dir="ltr"><<a href="mailto:heehooman@gmail.com" target="_blank">heehooman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The toybox implementation of `id` shouldn't error out when no<br>
/etc/passwd or /etc/group is present (other implementations, for<br>
example busybox, didn't error when tested).<br>
<br>
Currently, doing `id -u` (or `id -g` etc.) will error out, even though<br>
no data from the above files is necessary; all the information can be<br>
gotten from the syscalls. This is because pw->pw_uid and grp->gr_gid<br>
are used while only the values of getuid() and getgid() are required.<br>
<br>
Therefore, these commands will error out on stock android, where none<br>
of these files are present in their standard locations.<br>
<br>
This can easily be remedied by just using the values returned by the<br>
syscalls, which are in fact already stored in variables in the present<br>
implementation, for -u and -g, when -n is not used and no [user] is<br>
provided on the command line (in which case those files need to be<br>
queried anyway).<br>
<br>
<br>
diff --git a/toys/posix/id.c b/toys/posix/id.c<br>
index a5a94a5..950b02b 100644<br>
--- a/toys/posix/id.c<br>
+++ b/toys/posix/id.c<br>
@@ -86,8 +86,8 @@ void do_id(char *username)<br>
   int flags, i, ngroups;<br>
   struct passwd *pw;<br>
   struct group *grp;<br>
-  uid_t uid = getuid(), euid = geteuid();<br>
-  gid_t gid = getgid(), egid = getegid(), *groups;<br>
+  uid_t uid = getuid(), euid = geteuid(), iuid;<br>
+  gid_t gid = getgid(), egid = getegid(), *groups, igid;<br>
<br>
   flags = toys.optflags;<br>
<br>
@@ -100,66 +100,77 @@ void do_id(char *username)<br>
   }<br>
<br>
   i = flags & FLAG_r;<br>
-  pw = xgetpwuid(i ? uid : euid);<br>
-  if (TT.do_u) s_or_u(pw->pw_name, pw->pw_uid, 1);<br>
-<br>
-  grp = xgetgrgid(i ? gid : egid);<br>
-  if (flags & FLAG_g) s_or_u(grp->gr_name, grp->gr_gid, 1);<br>
+  iuid = i ? uid : euid;<br>
+  igid = i ? gid : egid;<br>
+<br>
+  if ((!TT.do_n) && (TT.do_u || (flags & FLAG_g))) {<br>
+    if (TT.do_u) {<br>
+      s_or_u("", iuid, 1);<br>
+    } else {<br>
+      s_or_u("", igid, 1);<br>
+    }<br>
+  } else {<br>
+    pw = xgetpwuid(iuid);<br>
+    if (TT.do_u) s_or_u(pw->pw_name, pw->pw_uid, 1);<br>
+<br>
+    grp = xgetgrgid(igid);<br>
+    if (flags & FLAG_g) s_or_u(grp->gr_name, grp->gr_gid, 1);<br>
+<br>
+    if (!TT.do_G && !TT.do_Z) {<br>
+      showid("uid=", pw->pw_uid, pw->pw_name);<br>
+      showid(" gid=", grp->gr_gid, grp->gr_name);<br>
+<br>
+      if (!i) {<br>
+        if (uid != euid) {<br>
+          pw = xgetpwuid(euid);<br>
+          showid(" euid=", pw->pw_uid, pw->pw_name);<br>
+        }<br>
+        if (gid != egid) {<br>
+          grp = xgetgrgid(egid);<br>
+          showid(" egid=", grp->gr_gid, grp->gr_name);<br>
+        }<br>
+      }<br>
<br>
-  if (!TT.do_G && !TT.do_Z) {<br>
-    showid("uid=", pw->pw_uid, pw->pw_name);<br>
-    showid(" gid=", grp->gr_gid, grp->gr_name);<br>
+      showid(" groups=", grp->gr_gid, grp->gr_name);<br>
+    }<br>
<br>
-    if (!i) {<br>
-      if (uid != euid) {<br>
-        pw = xgetpwuid(euid);<br>
-        showid(" euid=", pw->pw_uid, pw->pw_name);<br>
+    if (!TT.do_Z) {<br>
+      groups = (gid_t *)toybuf;<br>
+      i = sizeof(toybuf)/sizeof(gid_t);<br>
+      ngroups = username ? getgrouplist(username, gid, groups, &i)<br>
+        : getgroups(i, groups);<br>
+      if (ngroups<0) perror_exit(0);<br>
+<br>
+      int show_separator = !TT.do_G;<br>
+      for (i = 0; i<ngroups; i++) {<br>
+        if (show_separator) xputc(TT.do_G ? ' ' : ',');<br>
+        show_separator = 1;<br>
+        if (!(grp = getgrgid(groups[i]))) perror_msg(0);<br>
+        else if (TT.do_G) s_or_u(grp->gr_name, grp->gr_gid, 0);<br>
+        else if (grp->gr_gid != egid) showid("", grp->gr_gid, grp->gr_name);<br>
+        else show_separator = 0; // Because we didn't show anything this time.<br>
       }<br>
-      if (gid != egid) {<br>
-        grp = xgetgrgid(egid);<br>
-        showid(" egid=", grp->gr_gid, grp->gr_name);<br>
+      if (TT.do_G) {<br>
+        xputc('\n');<br>
+        exit(0);<br>
       }<br>
     }<br>
<br>
-    showid(" groups=", grp->gr_gid, grp->gr_name);<br>
-  }<br>
+    if (CFG_TOYBOX_SELINUX) {<br>
+      char *context = NULL;<br>
<br>
-  if (!TT.do_Z) {<br>
-    groups = (gid_t *)toybuf;<br>
-    i = sizeof(toybuf)/sizeof(gid_t);<br>
-    ngroups = username ? getgrouplist(username, gid, groups, &i)<br>
-      : getgroups(i, groups);<br>
-    if (ngroups<0) perror_exit(0);<br>
-<br>
-    int show_separator = !TT.do_G;<br>
-    for (i = 0; i<ngroups; i++) {<br>
-      if (show_separator) xputc(TT.do_G ? ' ' : ',');<br>
-      show_separator = 1;<br>
-      if (!(grp = getgrgid(groups[i]))) perror_msg(0);<br>
-      else if (TT.do_G) s_or_u(grp->gr_name, grp->gr_gid, 0);<br>
-      else if (grp->gr_gid != egid) showid("", grp->gr_gid, grp->gr_name);<br>
-      else show_separator = 0; // Because we didn't show anything this time.<br>
-    }<br>
-    if (TT.do_G) {<br>
-      xputc('\n');<br>
-      exit(0);<br>
+      if (is_selinux_enabled() < 1) {<br>
+        if (TT.do_Z)<br>
+          error_exit("SELinux disabled");<br>
+      } else if (getcon(&context) == 0) {<br>
+        if (!TT.do_Z) xputc(' ');<br>
+        printf("context=%s", context);<br>
+      }<br>
+      if (CFG_TOYBOX_FREE) free(context);<br>
     }<br>
-  }<br>
-<br>
-  if (CFG_TOYBOX_SELINUX) {<br>
-    char *context = NULL;<br>
<br>
-    if (is_selinux_enabled() < 1) {<br>
-      if (TT.do_Z)<br>
-        error_exit("SELinux disabled");<br>
-    } else if (getcon(&context) == 0) {<br>
-      if (!TT.do_Z) xputc(' ');<br>
-      printf("context=%s", context);<br>
-    }<br>
-    if (CFG_TOYBOX_FREE) free(context);<br>
+    xputc('\n');<br>
   }<br>
-<br>
-  xputc('\n');<br>
 }<br>
<br>
 void id_main(void)<br>
_______________________________________________<br>
Toybox mailing list<br>
<a href="mailto:Toybox@lists.landley.net">Toybox@lists.landley.net</a><br>
<a href="http://lists.landley.net/listinfo.cgi/toybox-landley.net" target="_blank">http://lists.landley.net/listinfo.cgi/toybox-landley.net</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Elliott Hughes - <a href="http://who/enh">http://who/enh</a> - <a href="http://jessies.org/~enh/">http://jessies.org/~enh/</a><br>Android native code/tools questions? Mail me/drop by/add me as a reviewer.</div>
</div>