2012-01-08 3 views
6

Я хочу изменить владельца и группу файла в c. i google it, но если вы найдете только некоторый код, который использует команду system() и chmod или относительные функции. есть ли способ сделать это без функций system() и команд bash?Изменение владельца и группы в c

спасибо всем. но новая проблема! : есть ли способ получить uid и gid пользователя без использования команды «id -u username» в c? синтаксический анализ/etc/passwd? или лучше?

ответ

6

Вы можете использовать системные вызовы chmod, fchmodat и/или fchmod. Все три находятся в <sys/stat.h>.

Для собственности есть chown и fchownat, как в <unistd.h>.

+0

спасибо, но другой! есть ли способ получить uid и gid пользователя без использования команды «id -u username» в c? синтаксический анализ/etc/passwd? или лучше? –

+0

Искать getuid/geteuid/getgid/getpwent/... и посмотреть связанные функции в документах '* pwent'. Также 'getlogin' и' getpwnam'. – Mat

+0

О, спасибо большое :) –

1

Пробег: man 2 chown и man 2 chmod.

Также см. Документацию here и here.

+0

Да, и в целом исходный плакат должен читать о Posix или Unix-программировании, а также читать справочные страницы ввода (2) и syscalls (2). –

+0

Страница man для chown (по крайней мере, моя) не говорит вам, как превращать имена пользователей и групп в целые идентификаторы. – Pulseczar

1

Существует chown функция в большинстве библиотек C:

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

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

Чтобы завершить ответ на Linux следующее можно использовать (я тестировал на 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"); 
    } 
} 
Смежные вопросы