2009-10-22 14 views
5

Ho fatto qualche ricerca e sto ancora lottando con la struttura passwd.Programmazione Unix. Non so come usare la struttura passwd

http://www.opengroup.org/onlinepubs/000095399/basedefs/pwd.h.html

Ho bisogno di ottenere l'ID utente tuttavia non credo che sto usando la comprensione affatto.

int getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **);

Questa chiamata metodo restituisce un punto a una struttura che conterrà tutti i dati che ho bisogno. Sono abbastanza confuso sui parametri.

struct passwd. Devo dichiararlo per primo? struct passwd passwd?

che sto appena completamente perso su come usare questo.

Infine, una volta che riempire il mio puntatore. Quali chiamate userò per ottenere i dati? Grazie per qualsiasi aiuto.

risposta

6

nella firma getpwuid_r:

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp); 

uid è un parametro di input - è l'UID dell'utente che si desidera cercare. Il resto sono essenzialmente parametri di output: la struttura puntata da pwbuf verrà riempita con le informazioni sulla password e il puntatore puntato da pwbufp verrà impostato sul valore di pwbuf se la chiamata è andata a buon fine (e NULL in caso contrario). La coppia di parametri buf e buflen specifica un buffer fornito dall'utente che verrà utilizzato per memorizzare le stringhe indicate dai membri della struttura struct passwd restituita.

Si potrebbe usarli in questo modo (questo sembra l'utente con UID 101):

struct passwd pwent; 
    struct passwd *pwentp; 
    char buf[1024]; 

    if (getpwuid_r(101, &pwent, buf, sizeof buf, &pwentp)) 
    { 
      perror("getpwuid_r"); 
    } 
    else 
    { 
      printf("Username: %s\n", pwent.pw_name); 
      printf("Real Name: %s\n", pwent.pw_gecos); 
      printf("Home Directory: %s\n", pwent.pw_dir); 
    } 

Se instread si desidera cercare un utente in base al nome di trovare il loro ID, utilizzare getpwnam_r ed esaminare la pw_uid campo della struttura restituita.

+0

Nizza, ho usato getpwuid, e utilizzato getpwuid_r. Speriamo che la risposta che l'OP sta cercando sia una di queste! – Cascabel

1

Ok, prima di tutto, non sono troppo sicuro di quello che stai cercando di realizzare - hai detto che devi ottenere l'uid, ma getpwuid è per cercare altre informazioni basate su uid. Volevi forse getpwnam, che cerca in base al nome utente? E poi hai bisogno di usare l'uid per un'altra funzione?

In ogni caso, tutto quello che dico qui di seguito vale per entrambi getpwnam e getpwuid - basta scambiare fuori l'argomento uid per l'argomento nome utente.

Hai confuso un po 'la tua documentazione. Un quasi-citazione dalla pagina man:

struct passwd *getpwuid(uid_t uid); 

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp); 

Il getpwuid() restituisce un puntatore a una struttura contenente i campi rotti-out del record nel database delle password che corrisponde al uid ID dell'utente.

La funzione getpwuid_r() ottiene le stesse informazioni, ma memorizza la struttura passwd recuperate nello spazio puntato da pwbuf.

Sembra che tu sia semplicemente un po 'confuso sui puntatori in generale. Tuttavia, non ci si deve preoccupare troppo per questo lavoro che suona come per i vostri scopi la versione più semplice potrebbe andare bene:

struct passwd * my_passwd; 
my_passwd = getpwuid(uid); 
// or: 
// my_passwd = getpwnam(username); 

if (my_passwd == NULL) { 
    // the lookup failed - handle the error! 
} else { 
    // the lookup succeeded - do your thing 
    printf("User name: %s\n", my_passwd->pw_name); 
    printf("User password: %s\n", my_passwd->pw_passwd); 
    ... 
} 

nota che in questo caso non è necessario allocare memoria per il puntatore , poiché getpwuid restituisce un puntatore alla struttura con la memoria allocata e le informazioni memorizzate.

La definizione completa della struttura (nomi di altri membri) si trova nella pagina man.

Il secondo modulo, getpwuid_r, è migliore per una gestione più accurata degli errori e della gestione della memoria, ma se tutto ciò che occorre fare è una ricerca rapida, questo dovrebbe andare bene.

+0

Apprezzo tutto l'aiuto che tutti hanno offerto. Dovrei essere ok ora. Qualcuno me lo ha spiegato in modo diverso e inizialmente ero sulla strada giusta per iniziare. Nel caso in cui ti stavi chiedendo di avere un progetto di programmazione unix che deve mostrare tutti i permessi utente per tutti i file nella sua directory. –

2

In primo luogo, se si desidera ottenere l'UID, quindi presumibilmente si ha il nome utente a portata di mano, nel qual caso si dovrebbe utilizzare getpwnam_r() invece. Questa funzione viene utilizzata esattamente come getpwuid_r(), tranne che si passa un nome (char *) come primo parametro.

In secondo luogo, non è necessario dichiarare `struct passwd'. Si dichiara quando si include pwd.h.

In terzo luogo, la firma esatto della funzione è:

int getpwnam_r(const char *name, struct passwd *pwd, 
       char *buf, size_t buflen, struct passwd **result); 

In quanto sopra, pwd è un parametro di output E 'qui che la funzione restituisce la voce della password, se si trova

..

Infine, c'è un esempio completo di come utilizzare getpwnam_r manpage nella pagina di manuale Linux getpwnam_r, accessibile here.

1: http://manpages.ubuntu.com/manpages/jaunty/en/man3/getpwnam.3.html qui

Problemi correlati