Réponses:
Vous devrez rechercher <limits.h>(ou l'un des fichiers qu'il contient, par exemple, sys/syslimits.hsur OS X) pour le #defineof 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.defsindique que dans ce contexte, UID_MAXne 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 Usignifie unsigned(cela peut aussi être Spour signed) et 32est 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' caseactiver cette valeur).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.hou 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 idcommande 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 idse termineraient à zéro avec 65'536(si l'UID 16 bits) et / 4'294'967'296ou 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-utilsutilisés(uid_t)-1pour trouver la valeur maximale de l'UID.