getuid
o geteuid
sarebbero le scelte più ovvie.
getuid
controlla le credenziali dell'utente effettivo.
Il e
aggiunto in geteuid
sta per effective
. Controlla le credenziali effettive.
Solo per esempio, se usi sudo
per eseguire un programma come root (superutente), le tue credenziali effettive sono ancora il tuo account, ma le tue credenziali effettive sono quelle dell'account root (o un membro del gruppo Wheel, ecc.)
Ad esempio, considera un codice come questo:
#include <unistd.h>
#include <iostream>
int main() {
auto me = getuid();
auto myprivs = geteuid();
if (me == myprivs)
std::cout << "Running as self\n";
else
std::cout << "Running as somebody else\n";
}
Se lo esegui normalmente, getuid()
e geteuid()
restituirà lo stesso valore, quindi dirà "in esecuzione come sé". Se esegui sudo ./a.out
invece, getuid()
restituirà comunque il tuo ID utente, ma geteuid()
restituirà le credenziali per root o wheel, quindi dirà "Esecuzione come qualcun altro".
Consiglierei NON apportando questa modifica, migliorando invece il messaggio di errore. È dubbio che la tua applicazione debba effettivamente "essere root"; ha invece bisogno di determinati privilegi che ha root, ma che i sistemi operativi con controlli di sicurezza granulari potrebbero essere in grado di concedere all'applicazione senza concederle l'accesso root completo. Anche se ciò non è possibile ora, potrebbe esserlo tra 6 mesi o 2 anni e gli utenti si irriteranno se il tuo programma si rifiuta di essere eseguito sulla base di ipotesi precedenti sul modello di autorizzazione anziché limitarsi a verificare che riesca a funzionare le operazioni privilegiate di cui ha bisogno.
#include <unistd.h> // getuid
#include <stdio.h> // printf
int main()
{
if (getuid()) printf("%s", "You are not root!\n");
else printf("%s", "OK, you are root.\n");
return 0;
}