2012-01-08 9 views
6

Voglio cambiare proprietario e gruppo di un file in c. lo google, ma se trova solo qualche codice che usa il comando system() e chmod o le relative funzioni. c'è un modo per farlo senza le funzioni system() e i comandi bash?Cambia proprietario e gruppo in c

grazie a tutti. ma nuovo problema! : c'è un modo per ottenere un utente uid e gid senza usare il comando "id -u username" in c? analizzare/etc/passwd? o meglio?

risposta

6

È possibile utilizzare le chiamate di sistema chmod, fchmodat e/o fchmod. Tutti e tre si trovano in <sys/stat.h>.

Per la proprietà, c'è chown e fchownat, entrambi in <unistd.h>.

+0

grazie, ma un altro! c'è un modo per ottenere un utente uid e gid senza usare il comando "id -u username" in c? analizzare/etc/passwd? o meglio? –

+0

Cerca getuid/geteuid/getgid/getpwent/... e guarda le relative funzioni nei documenti '* pwent'. Anche 'getlogin' e' getpwnam'. – Mat

+0

oh, molte grazie :) –

1

Prova man 2 chown e man 2 chmod.

Vedere anche la documentazione here e here.

+0

Sì, e più in generale il poster originale dovrebbe leggere sulla programmazione Posix o Unix e leggere le pagine man di introduzione (2) e syscalls (2). –

+0

La pagina man per chown (almeno la mia) non ti dice come trasformare i nomi di utenti e gruppi in ID di interi. – Pulseczar

1

C'è una funzione chown nella maggior parte delle librerie C:

#include <sys/types.h> 
#include <unistd.h> 

int chown(const char *path, uid_t owner, gid_t group); 
4

Per completare la risposta, su Linux il seguente può essere utilizzato (ho testato su Ubuntu):

#include <sys/types.h> 
#include <pwd.h> 

void do_chown (const char *file_path, 
       const char *user_name, 
       const char *group_name) 
{ 
    uid_t   uid; 
    gid_t   gid; 
    struct passwd *pwd; 
    struct group *grp; 

    pwd = getpwnam(user_name); 
    if (pwd == NULL) { 
     die("Failed to get uid"); 
    } 
    uid = pwd->pw_uid; 

    grp = getgrnam(group_name); 
    if (grp == NULL) { 
     die("Failed to get gid"); 
    } 
    gid = grp->gr_gid; 

    if (chown(file_path, uid, gid) == -1) { 
     die("chown fail"); 
    } 
} 
Problemi correlati