of bytes per block, or it can be @code{human-readable} or @code{si} to
select a human-readable format. Integers may be followed by suffixes
that are upward compatible with the
-@uref{http://www.bipm.fr/enus/3_SI/si-prefixes.html, SI prefixes}
+@uref{http://www.bipm.org/en/si/si_brochure/chapter3/prefixes.html, SI prefixes}
for decimal multiples and with the
-@uref{http://physics.nist.gov/cuu/Units/binary.html, IEC 60027-2
-prefixes for binary multiples}.
+@uref{http://physics.nist.gov/cuu/Units/binary.html, ISO/IEC 80000-13
+(formerly IEC 60027-2) prefixes} for binary multiples.
With human-readable formats, output sizes are followed by a size letter
such as @samp{M} for megabytes. @code{BLOCK_SIZE=human-readable} uses
@itemx KiB
@cindex kibibyte, definition of
kibibyte: @math{2^{10} = 1024}. @samp{K} is special: the SI prefix is
-@samp{k} and the IEC 60027-2 prefix is @samp{Ki}, but tradition and
+@samp{k} and the ISO/IEC 80000-13 prefix is @samp{Ki}, but tradition and
@acronym{POSIX} use @samp{k} to mean @samp{KiB}.
@item MB
@cindex megabyte, definition of
@item Z
@itemx ZiB
@math{2^{70} = 1,180,591,620,717,411,303,424}.
-(@samp{Zi} is a @acronym{GNU} extension to IEC 60027-2.)
@item YB
@cindex yottabyte, definition of
yottabyte: @math{10^{24} = 1,000,000,000,000,000,000,000,000}.
@item Y
@itemx YiB
@math{2^{80} = 1,208,925,819,614,629,174,706,176}.
-(@samp{Yi} is a @acronym{GNU} extension to IEC 60027-2.)
@end table
@opindex -k
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;
}
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"));
}
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)
{