readdir & lstat

Все о программировании под *nix
Anonymous

readdir & lstat

Сообщение Anonymous »

nado oboiti vse katalogi.
problema v tom, chto lstat nehochet prinimat' v kachsteve pervogo parametra znachenie iz stucturi, obyavlennoi dlya readdir.
help!



ps: mojet u kogo est' ftw.h?

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

в голову приходит простой, грязный, но рабочий хак

Код: Выделить всё

popen("find . -type d -print", "r");
сорри, нет времени проверить поведение readdir, lstat
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Гость

Сообщение Гость »

[uNIx]mend0za писал(а):в голову приходит простой, грязный, но рабочий хак

Код: Выделить всё

popen("find . -type d -print", "r");
сорри, нет времени проверить поведение readdir, lstat
hm... neplohoi variant, no predpochtitel'nee sdet' cherez lstat.

vot prototipi:

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

int stat(const char *path, struct stat *sb);
int lstat(const char *path, struct stat *sb);

struct stat {
dev_t st_dev; /* inode's device */
ino_t st_ino; /* inode's number */
mode_t st_mode; /* inode protection mode */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of the file's owner */
gid_t st_gid; /* group ID of the file's group */
dev_t st_rdev; /* device type */
..
}



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

DIR *opendir(const char *filename);
struct dirent *readdir(DIR *dirp);

struct dirent {
__uint32_t d_fileno; /* file number of entry */
__uint16_t d_reclen; /* length of this record */
__uint8_t d_type; /* file type, see below */
__uint8_t d_namlen; /* length of string in d_name */

#ifdef _POSIX_SOURCE
char d_name[255 + 1]; /* name must be no longer than
this */
#else
#define MAXNAMLEN 255
char d_name[MAXNAMLEN + 1]; /* name must be no longer than
this */
#endif
};


vot kak ya delau:


struct dirent *readdir (DIR *dirptr);
void rewinddir (DIR *dirptr);
int fileDir(char *);

int double_ls_dir(const char *name)
{
struct dirent *d;
int i;

DIR *dp;
if ((dp = opendir(name)) == NULL) return(1);
while (d = readdir(dp))
{
if (strcmp(d->d_name, "file.txt") == 0) //
{
printf("%s\n", name);
exit(1);
}

if ((i = fileDir(d->d_name)) == 1)
{
printf("--- DIR ---\n");
}
else
if (i == 2)
{
printf("--- FILE ---\n");
}

}
closedir(dp);
return(0);
}

int fileDir(char *name)
{
struct stat info;
extern int errno;
int err;
char *s;
if ((err = lstat(name, &info)) == -1)
{
printf("error: %s\n",strerror(errno));
exit(1);
};

if (S_ISDIR(info.st_mode))
{
return (1);
//chdir(d->d_name); //rekursivnii obhod
//double_ls_dir(d->d_name);
}
else
{
return (0);
}

}

struct dirent *readdir (DIR *dirptr);
void rewinddir (DIR *dirptr);
int fileDir(char *);


// ???????? ??????????? ????????

int double_ls_dir(const char *name)
{
struct dirent *d;
int i;

DIR *dp;
if ((dp = opendir(name)) == NULL) return(1);
while (d = readdir(dp))
{
if (strcmp(d->d_name, "file.txt") == 0) // ?????? ???? ?????
????? ?? ???? "file.txt"
{
printf("%s\n", name);
exit(1);
}


// ??? ???????????? ?????? ???? ????????? ?????????? ?????????? ????????
?? ???? ?????????
// ? ????????? fileDir ?????????? ??? ????? d->d_name ? ???????????? 1
???? ??????? ? 0 ???? ?? ???????

if ((i = fileDir(d->d_name)) == 1)
{
printf("--- DIR ---\n");
}
else
if (i == 2)
{
printf("--- FILE ---\n");
}

}
closedir(dp);
return(0);
}


int main (void)
{
char path[100];
int i;

double_ls_dir("/");

return(0);
}

int fileDir(char *name)
{
struct stat info;
extern int errno;
int err;
char *s;

if ((err = lstat(name, &info)) == -1)
{
printf("error: %s\n",strerror(errno));
exit(1);
};

if (S_ISDIR(info.st_mode))
{
return (1);

//chdir(d->d_name);
//double_ls_dir(d->d_name);

}
else
{
return (0);
}

}

Anonymous

Сообщение Anonymous »

Replace following your code

Код: Выделить всё

int double_ls_dir(const char *name)
{

    ........ /* skipped by awn */

    while (d = readdir(dp))
    {
        if (strcmp(d->d_name, "file.txt") == 0)  // 
        {
            printf("%s\n", name);
            exit(1);
        }

       if ((i = fileDir(d->d_name)) == 1)
       {
           printf("--- DIR ---\n");
       }

    ........ /* skipped by awn */
    }

    closedir(dp);
    return(0); 
}
by something like

Код: Выделить всё

int double_ls_dir(const char *name)
{

    ........ /* skipped by awn */

    while (d = readdir(dp))
    {
        size_t fullname_buff_len = strlen(name)+strlen(d->d_name)+2;
        char* fullname = malloc(fullname_buff_len);
        assert(fullname);
        snprintf(fullname, fullname_buff_len, "%s/%s", name, d->d_name);

        if (strcmp(fullname, "file.txt") == 0)  // 
        {
            printf("%s\n", fullname);
            free(fullname);
            exit(1);
        }

       if ((i = fileDir(fullname)) == 1)
       {
           printf("--- DIR ---\n");
       }

        ........ /* skipped by awn */

        free(fullname);
    }

    closedir(dp);
    return(0); 
}


Ответить