From: Vincent T. <vt...@un...> - 2010-10-30 07:14:48
|
On Fri, 29 Oct 2010, Enlightenment SVN wrote: > Log: > aaagh. dirent... bad! too many things in dirent that are not portable > - d_type for example... so put that into the direct_info struct and > handle the compat in eina. > +#ifdef _DIRENT_HAVE_D_NAMLEN wouldn't is be better to test if d_namlen or d_type are available in configure.ac ? autoconf have macro for that: http://www.gnu.org/software/autoconf/manual/autoconf.html#Particular-Headers but it is mentioned that we should not use it. So I think that we should make the tests ourselve Vincent > + length = dp->d_namlen; > +#else > length = strlen(dp->d_name); > +#endif > name = alloca(length + 2 + it->length); > > memcpy(name, it->dir, it->length); > @@ -145,7 +149,10 @@ > { > struct dirent *dp; > size_t length; > - > +#ifndef _DIRENT_HAVE_D_TYPE > + struct stat st; > +#endif > + > dp = alloca(offsetof(struct dirent, d_name) + pathconf(it->dir, _PC_NAME_MAX) + 1); > > do > @@ -155,7 +162,11 @@ > if (!dp) > return EINA_FALSE; > > +#ifdef _DIRENT_HAVE_D_NAMLEN > + length = dp->d_namlen; > +#else > length = strlen(dp->d_name); > +#endif > if (it->info.name_start + length + 1 >= PATH_MAX) > continue; > } > @@ -168,7 +179,61 @@ > it->info.path_length = it->info.name_start + length; > it->info.path[it->info.path_length] = '\0'; > it->info.dirent = dp; > - > +#ifdef _DIRENT_HAVE_D_TYPE > + switch (dp->d_type) > + { > + case DT_FIFO: > + it->info.type = EINA_FILE_FIFO; > + break; > + case DT_CHR: > + it->info.type = EINA_FILE_CHR; > + break; > + case DT_DIR: > + it->info.type = EINA_FILE_DIR; > + break; > + case DT_BLK: > + it->info.type = EINA_FILE_BLK; > + break; > + case DT_REG: > + it->info.type = EINA_FILE_REG; > + break; > + case DT_LNK: > + it->info.type = EINA_FILE_LNK; > + break; > + case DT_SOCK: > + it->info.type = EINA_FILE_SOCK; > + break; > + case DT_WHT: > + it->info.type = EINA_FILE_WHT; > + break; > + default: > + it->info.type = EINA_FILE_UNKNOWN; > + break; > + } > +#else > + if (stat(it->info.path, &st)) > + it->info.type = EINA_FILE_UNKNOWN; > + else > + { > + if (S_ISREG(st.st_mode)) > + it->info.type = EINA_FILE_REG; > + else if (S_ISDIR(st.st_mode)) > + it->info.type = EINA_FILE_DIR; > + else if (S_ISCHR(st.st_mode)) > + it->info.type = EINA_FILE_CHR; > + else if (S_ISBLK(st.st_mode)) > + it->info.type = EINA_FILE_BLK; > + else if (S_ISFIFO(st.st_mode)) > + it->info.type = EINA_FILE_FIFO; > + else if (S_ISLNK(st.st_mode)) > + it->info.type = EINA_FILE_LNK; > + else if (S_ISSOCK(st.st_mode)) > + it->info.type = EINA_FILE_SOCK; > + else > + it->info.type = EINA_FILE_UNKNOWN; > + } > +#endif > + > *data = &it->info; > return EINA_TRUE; > } > @@ -235,9 +300,13 @@ > void *data) > { > #ifndef _WIN32 > + int dlength; > struct dirent *de; > DIR *d; > - > +#ifndef _DIRENT_HAVE_D_TYPE > + struct stat st; > +#endif > + > EINA_SAFETY_ON_NULL_RETURN_VAL(cb, EINA_FALSE); > EINA_SAFETY_ON_NULL_RETURN_VAL(dir, EINA_FALSE); > EINA_SAFETY_ON_TRUE_RETURN_VAL(dir[0] == '\0', EINA_FALSE); > @@ -246,8 +315,9 @@ > if (!d) > return EINA_FALSE; > > + dlength = strlen(dir); > de = alloca(offsetof(struct dirent, d_name) + pathconf(dir, _PC_NAME_MAX) + 1); > - > + > while ((!readdir_r(d, de, &de) && de)) > { > if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) > @@ -259,30 +329,26 @@ > if (recursive == EINA_TRUE) > { > char *path; > - > - path = alloca(strlen(dir) + strlen(de->d_name) + 2); > + int length; > + > +#ifdef _DIRENT_HAVE_D_NAMLEN > + length = de->d_namlen; > +#else > + length = strlen(de->d_name); > +#endif > + path = alloca(dlength + length + 2); > strcpy(path, dir); > strcat(path, "/"); > strcat(path, de->d_name); > -#ifndef sun > - if (de->d_type == DT_UNKNOWN) > - { > -#endif > - struct stat st; > - > +#ifdef _DIRENT_HAVE_D_TYPE > + if (de->d_type != DT_DIR) > + continue; > +#else > if (stat(path, &st)) > continue; > - > if (!S_ISDIR(st.st_mode)) > continue; > - > -#ifndef sun > - } > - else if (de->d_type != DT_DIR) > - continue; > - > #endif > - > eina_file_dir_list(path, recursive, cb, data); > } > } > > > ------------------------------------------------------------------------------ > Nokia and AT&T present the 2010 Calling All Innovators-North America contest > Create new apps & games for the Nokia N8 for consumers in U.S. and Canada > $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing > Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store > http://p.sf.net/sfu/nokia-dev2dev > _______________________________________________ > enlightenment-svn mailing list > enl...@li... > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > |