Soluzione 1:
Dovrai cercare in <limits.h>
(o uno dei file che include, ad esempio sys/syslimits.h
su OS X) per #define
di UID_MAX
.
I sistemi operativi più recenti (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) possono gestire fino a due miliardi (2^31-2
), quindi lo presumo e creo una soluzione alternativa per i sistemi più oscuri che non lo fanno.
Soluzione 2:
glibc fornisce definizioni per tutti questi tipi di sistema.
Puoi selezionare /usr/include/bits/typesizes.h
:
% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE __U32_TYPE
Poi guardi in /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. Dal momento che hai bisogno della dimensione in byte, la tua migliore opzione è analizzare il nome typedef secondo la specifica 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 una riga:
% 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
(può anche essere S
per signed
) e 32
è la dimensione (cercala nell'elenco sopra; penso che la maggior parte delle volte puoi presumere che sia già la dimensione in byte, ma se vuoi che il tuo script sia completamente portabile potrebbe essere meglio fare case
attiva questo valore).
Soluzione 3:
In questo collegamento viene posta la domanda e un risponditore utilizza un metodo di prova ed errore per determinare che il sistema in questione utilizza un long int 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:
Soluzione 4:
Questa è una domanda interessante. Sarei sorpreso se esistesse un metodo portatile standard per determinarlo.
Non ho una macchina Linux a portata di mano, ma il id
comando su FreeBSD 8.0 ritorna a zero:
# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
Sono sicuro che questo è un comportamento indefinito, ma scommetto che la maggior parte delle versioni di id
andrebbe a capo a zero con 65'536
(se UID a 16 bit) e 4'294'967'296
o errore se sei andato oltre il limite di sistema.