0

ディレクトリからファイルを読み取り、各ファイルの名前、ユーザー、グループ、およびサイズを検出するプログラムを C で作成しようとしています。各ファイルの情報は構造体配列に格納され、qsort を使用してファイル名で並べ替えられます。次に、ソートされたファイルが画面に出力されます。このプログラムは、readdir_r、getpwuid_r、および getgrgid_r を使用する必要があります。これらの関数の「_r」バージョンに指定する必要がある複数の引数を、目標を達成するためにどのように実装する必要があるかわかりません。また、いくつかの「構造体または共用体ではないメンバー 'name' の要求」エラーも受け取ります ('size'、'user'、および 'group' に対しても発生します)。

この状況で「_r」関数を適切に利用する方法を理解できる人はいますか? マニュアルページは、私が理解できるほど明確ではありませんでした。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <stddef.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>

int main(int argc, char* argv[])
{

DIR *mydir;
struct dirent *myfile;
struct stat mystat;
struct passwd  *pwd;
struct group   *grp;
struct dirent *result;


struct entry
{
    char *name;
    char *user;
    char *group;
    int size;
};

struct entry entries[1024];

if(argc != 2)
{
    perror("must supply a directory");
    return -1;
}

mydir = opendir(argv[1]);
if(mydir==NULL)
{
    perror("Cannot find directory");
    return -1;
}

char buf[1024];
while((myfile = readdir_r(mydir, myfile, )) != NULL)
{
    entries.name = myfile->d_name;
    stat(buf, &mystat);
    entries.size = mystat.st_size;

    /* store owner's name in struct if it is found using getpwuid_r(). */
    if ((pwd = getpwuid_r(mystat.st_uid, , , , ,)) != NULL)
            entries.user = pwd->pw_name;
    else
         perror("user not found");


    /* store group name in struct if it is found using getgrgid_r(). */
    if ((grp = getgrgid_r(mystat.st_gid, , , , ,)) != NULL)
             entries.group = grp->gr_name;
    else
             perror("group not found");


 }

 int cmpfunc( const void *a, const void *b)
 {
     char const *aa = (char const *)a;
     char const *bb = (char const *)b;

     return strcmp(aa, bb);
 }

 qsort(entries, 4, sizeof(int), cmpfunc);

 int i = 0;
 for(int i; i < sizeOf(entries); i++)
 {
        printf("%s %s %llu %s\n", entries.user, entries.group,
        entries.size, entries.name);
 }

        closedir(mydir);

        return 0;
}
4

1 に答える 1