2012-01-08 3 views
6

cでファイルの所有者とグループを変更したい。私はそれをGoogleのが、システム()とchmodコマンドまたは相対的な機能を使用するいくつかのコードを見つける場合。 system()関数とbashコマンドなしでこれを行う方法はありますか?オーナーとグループをcで変更する

ありがとうございます。しかし、新しい問題! : cで "id -u username"コマンドを使用せずにユーザーuidとgidを取得する方法はありますか?/etc/passwdの解析?またはより良い方法ですか?

答えて

6

chmod,および/またはfchmodシステムコールを使用できます。 3つはすべて<sys/stat.h>にあります。

chownfchownatの両方が<unistd.h>にあります。

+0

ありがとうございますが、もう1つ! cで "id -u username"コマンドを使用せずにユーザーuidとgidを取得する方法はありますか?/etc/passwdの解析?またはより良い方法ですか? –

+0

getuid/geteuid/getgid/getpwent/...を検索し、関連する関数を '* pwent'docsで見てください。 'getlogin'と' getpwnam'です。 – Mat

+0

ああ、ありがとうございます:) –

1

man 2 chownman 2 chmodを試してください。

herehereも参照してください。

+0

もっと一般的に、元のポスターは、PosixやUnixプログラミングについて読んで、intro(2)とsyscalls(2)のマニュアルページを読んでください。 –

+0

chown(少なくとも、私の)のmanページは、ユーザーIDとグループ名を整数IDに変換する方法を教えてくれません。 – Pulseczar

1

ほとんどのCライブラリでchown機能があります:

#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"); 
    } 
} 
関連する問題