summaryrefslogtreecommitdiff
path: root/src/id.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-11-15 08:20:59 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2011-11-15 08:23:23 -0800
commit06ca3797ac89c7c16a80ae8276bd23ef5b6f6a6f (patch)
tree7dd67855e67aee7027608c346d302d663f4aecb1 /src/id.c
parent40324ca8b22a538e31aa2f9a8ac03f03f7d0537e (diff)
downloadcoreutils-06ca3797ac89c7c16a80ae8276bd23ef5b6f6a6f.tar.xz
doc: update for ISO/IEC 80000-13
* doc/coreutils.texi (Block size): IEC 60027-2 has been superseded by ISO/IEC 80000-13, so prefer the newer standard but also mention the old. The new standard specifies Zi and Yi, so they are no longer GNU extensions. Fix stale URL to BIPM. 2011-11-14 Paul Eggert <eggert@cs.ucla.edu> id: handle (uid_t) -1 more portably * src/id.c (GETID_MAY_FAIL): Remove. (main): Check for negative return values, not for -1. The old code was incorrect if uid_t was narrower than int, regardless of whether we were on a GNU or a POSIX platform. The new code is simpler and doesn't need GETID_MAY_FAIL. (print_full_info): Remove unnecessary cast to -1.
Diffstat (limited to 'src/id.c')
-rw-r--r--src/id.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/id.c b/src/id.c
index 047e40b88..b3ee437fd 100644
--- a/src/id.c
+++ b/src/id.c
@@ -38,13 +38,6 @@
proper_name ("Arnold Robbins"), \
proper_name ("David MacKenzie")
-/* Whether the functions getuid, geteuid, getgid and getegid may fail. */
-#ifdef __GNU__
-# define GETID_MAY_FAIL 1
-#else
-# define GETID_MAY_FAIL 0
-#endif
-
/* If nonzero, output only the SELinux context. -Z */
static int just_context = 0;
@@ -208,22 +201,36 @@ main (int argc, char **argv)
}
else
{
+ /* On GNU/Hurd hosts, getuid etc. can fail and return -1.
+ However, on GNU/Linux hosts, uid_t is an unsigned value and
+ getuid etc. can return the positive value (uid_t) -1. To
+ handle both cases correctly, consider getuid etc. to fail if
+ it returns a negative value (a value that is impossible on
+ GNU/Linux hosts).
+
+ GNU/Linux sysadmins should not give users the UID (uid_t) -1
+ even though uid_t is unsigned, as system calls like chown would
+ not have the desired behavior with such a UID, and other
+ coreutils applications therefore do not support such a UID.
+ However, 'id' makes a special attempt to handle this UID, to
+ help people diagnose the problem. */
+
euid = geteuid ();
- if (GETID_MAY_FAIL && euid == -1 && !use_real
+ if (euid < 0 && !use_real
&& !just_group && !just_group_list && !just_context)
error (EXIT_FAILURE, errno, _("cannot get effective UID"));
ruid = getuid ();
- if (GETID_MAY_FAIL && ruid == -1 && use_real
+ if (ruid < 0 && use_real
&& !just_group && !just_group_list && !just_context)
error (EXIT_FAILURE, errno, _("cannot get real UID"));
egid = getegid ();
- if (GETID_MAY_FAIL && egid == -1 && !use_real && !just_user)
+ if (egid < 0 && !use_real && !just_user)
error (EXIT_FAILURE, errno, _("cannot get effective GID"));
rgid = getgid ();
- if (GETID_MAY_FAIL && rgid == -1 && use_real && !just_user)
+ if (rgid < 0 && use_real && !just_user)
error (EXIT_FAILURE, errno, _("cannot get real GID"));
}
@@ -316,7 +323,7 @@ print_full_info (const char *username)
gid_t *groups;
int i;
- int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : (gid_t) -1),
+ int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : -1),
&groups);
if (n_groups < 0)
{