Risposte:
Dovrai cercare <limits.h>
(o uno dei file che include, ad esempio, sys/syslimits.h
su OS X) per il #define
di UID_MAX
.
I sistemi operativi più recenti (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) sono in grado di gestire fino a due miliardi ( 2^31-2
), quindi lo presumo e farei una soluzione alternativa per i sistemi più oscuri che don 't.
login.defs
indica che in quel contesto UID_MAX
controlla solo il massimo uid che verrà automaticamente assegnato ai nuovi utenti creati con useradd
.
glibc fornisce le definizioni per tutti quei tipi di sistema.
Puoi controllare /usr/include/bits/typesizes.h
:
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
Successivamente si esamina /usr/include/bits/types.h
:
% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE unsigned int
Questo ti permette di scoprire il tipo C. Dato che hai bisogno della dimensione in byte, la tua migliore opzione è analizzare il nome del typedef in base alle specifiche in 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
Quindi, ecco un one-liner:
% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32
Qui U
significa unsigned
(questo può essere anche S
per signed
) ed 32
è la dimensione (cercala nell'elenco sopra; Penso, la maggior parte delle volte puoi presumere che sia già dimensione in byte, ma se vuoi che il tuo script sia completamente portatile potrebbe essere meglio case
attivare questo valore).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
o in alternativa:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
Questa è una domanda interessante. Sarei sorpreso se ci fosse un metodo portatile standard per determinarlo.
Non ho una Linux box a portata di mano, ma il id
comando su FreeBSD 8.0 torna a zero:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Sono sicuro che si tratta di un comportamento indefinito, ma scommetterei che la maggior parte delle versioni id
andrebbero a zero con 65'536
(se UID a 16 bit) 4'294'967'296
o errore se andassi oltre il limite di sistema.
In questo collegamento viene posta la domanda e un responder utilizza un metodo di prova ed errore per determinare il sistema in questione utilizza un int long con segno, lasciando 31 bit per memorizzare il valore, con un massimo di 2.147.483.647.
# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
UID_MAX
. Ad esempio, strumenti dashadow-utils
utilizzare(uid_t)-1
per scoprire il valore massimo per l'UID.