Réponses:
Vous devrez rechercher <limits.h>
(ou l'un des fichiers qu'il contient, par exemple, sys/syslimits.h
sur OS X) pour le #define
of UID_MAX
.
Les systèmes d'exploitation les plus récents (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) peuvent gérer jusqu'à deux milliards ( 2^31-2
), donc je suppose que cela et contourner les systèmes les plus obscurs qui ne 't.
login.defs
indique que dans ce contexte, UID_MAX
ne contrôle que l'uid le plus élevé qui sera automatiquement attribué aux nouveaux utilisateurs créés avec useradd
.
la glibc fournit des définitions pour tous ces types de systèmes.
Vous pouvez vérifier /usr/include/bits/typesizes.h
:
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
Ensuite, vous examinez /usr/include/bits/types.h
:
% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE unsigned int
Cela vous permet de découvrir le type C. Étant donné que vous avez besoin de la taille en octets, votre meilleure option consiste à analyser le nom de typedef conformément aux spécifications de types.h
:
We define __S<SIZE>_TYPE and __U<SIZE>_TYPE for the signed and unsigned
variants of each of the following integer types on this machine.
16 -- "natural" 16-bit type (always short)
32 -- "natural" 32-bit type (always int)
64 -- "natural" 64-bit type (long or long long)
LONG32 -- 32-bit type, traditionally long
QUAD -- 64-bit type, always long long
WORD -- natural type of __WORDSIZE bits (int or long)
LONGWORD -- type of __WORDSIZE bits, traditionally long
Alors, voici un one-liner:
% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32
Ici, cela U
signifie unsigned
(cela peut aussi être S
pour signed
) et 32
est la taille (recherchez-la dans la liste ci-dessus; je pense, la plupart du temps, vous pouvez supposer que c'est déjà la taille en octets, mais si vous voulez que votre script soit entièrement portable, il il serait peut-être préférable d' case
activer cette valeur).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
ou alternativement:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
Voilà une question intéressante. Je serais surpris s'il existait une méthode standard et portable pour le déterminer.
Je n'ai pas de boîte Linux à portée de main, mais la id
commande sur FreeBSD 8.0 revient à zéro:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Je suis sûr que c'est un comportement indéfini, mais je parierais que la plupart des versions de id
se termineraient à zéro avec 65'536
(si l'UID 16 bits) et / 4'294'967'296
ou une erreur si vous alliez au-delà de la limite du système.
Dans ce lien, la question est posée et un répondeur utilise une méthode d'essai et d'erreur pour déterminer que le système en question utilise un entier long signé, laissant 31 bits pour stocker la valeur, avec un maximum de 2147483647.
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
UID_MAX
. Par exemple, des outilsshadow-utils
utilisés(uid_t)-1
pour trouver la valeur maximale de l'UID.