stat fs-unabhaengig (xfs, ext3, etc.) S_ISREG und S_ISDIR macros

15/11/2009 - 11:55 von Yoshi Rokuko | Report spam
Hallo, uebe mich gerade im implementieren von so etwas wie tree, find etc.
(brauche nur einen teil der funktionalitaet).
die dirent struktur wird ja nicht bei allen dateisystemen mit dem typ
DT_REG bzw DT_DIR gefuellt, so sind unter xfs extra stat aufrufe notwendig (?)
hier kann ich dann testen ob es sich um eine regulaere datei, ordner oder
etwas ganz anderes handelt. habe das einmal mit macros und einmal ohne
probiert (auskommentiert) beides entdeckt bei mir die ordner nicht, was
mache ich denn falsch? zudem werden manche ordner, bzw. dateien einfach
uebersprungen (auf xfs).

hier mal der quellcode:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

void dirprint(char *dir, char *name);
void dirread(char *dir);
void regprint(char *name);

void
dirprint(char *dir, char *name) {
char buf[1024];

printf("%s/", name);
sprintf(buf, "%s/%s", dir, name);
dirread(buf);
}

void
dirread(char *dir) {
DIR *d;
struct dirent *e;
struct stat st;

d = opendir(dir);
while((e = readdir(d)) != NULL) {
if((strcmp(e->d_name, ".") == 0)
|| (strcmp(e->d_name, "..") == 0))
continue;
switch(e->d_type) {
case DT_REG:
regprint(e->d_name);
break;
case DT_DIR:
dirprint(dir, e->d_name);
break;
case DT_UNKNOWN:
stat(e->d_name, &st);
if(S_ISREG(st.st_mode))
regprint(e->d_name);
if(S_ISDIR(st.st_mode))
dirprint(dir, e->d_name);
/*
switch(st.st_mode & S_IFMT) {
case S_IFREG:
printf("ifreg:");
regprint(e->d_name);
break;
case S_IFDIR:
dirprint(dir, e->d_name);
break;
default:
break;
}
*/
break;
default:
break;
}
}
closedir(d);
}

void
regprint(char *name) {
puts(name);
}

int
main(int argc, char *argv[]) {
dirread(argv[1]);
return 0;
}

ich versuche das gerade so einfach und leicht verstaendlich wie moeglich
zu implementieren fuer jegliche hinweise bin ich dankbar.

gruss yoshi
 

Lesen sie die antworten

#1 Erich Fruehstueck
15/11/2009 - 12:22 | Warnen spam
Am Sun, 15 Nov 2009 10:55:27 +0000 schrieb Yoshi Rokuko:

Hallo, uebe mich gerade im implementieren von so etwas wie tree, find
etc. (brauche nur einen teil der funktionalitaet). die dirent struktur
wird ja nicht bei allen dateisystemen mit dem typ DT_REG bzw DT_DIR
gefuellt, so sind unter xfs extra stat aufrufe notwendig (?) hier kann
ich dann testen ob es sich um eine regulaere datei, ordner oder etwas
ganz anderes handelt. habe das einmal mit macros und einmal ohne
probiert (auskommentiert) beides entdeckt bei mir die ordner nicht, was
mache ich denn falsch? zudem werden manche ordner, bzw. dateien einfach
uebersprungen (auf xfs).



Die Komponente d_name enthàlt nur den Basisnamen der Datei, nicht den
Pfad. Du must dir also zuvor den Pfad zusammenstellen, ewta mit

snprintf(buf, sizeof buf, "%s/%s", dir, e->d_name);

PS: sprintf kann einen Bufferüberlauf verursachen.

Grüße Erich

EFEU 3.2 is released!
Get the open source from http://efeu.cybertec.at.

Ähnliche fragen