DBio.c: HAVE_STRUCT_DIRENT_D_TYPE direct->d_type

This commit is contained in:
Darryl L. Miles 2024-10-17 21:15:30 +01:00 committed by R. Timothy Edwards
parent c3054f265b
commit 778201fbc2
1 changed files with 31 additions and 3 deletions

View File

@ -167,6 +167,24 @@ file_is_not_writeable(name)
return(0);
}
static int
path_is_dir(const char *dirname, const char *filename)
{
struct stat statbuf;
char path[PATH_MAX];
const char *sep = filename ? "/" : "";
if (!filename)
filename = "";
size_t n = snprintf(path, sizeof(path), "%s%s%s", dirname, sep, filename);
ASSERT(n < sizeof(path), "path");
if (n >= sizeof(path))
return -1;
int err = stat(path, &statbuf);
if (err != 0)
return 0;
return S_ISDIR(statbuf.st_mode) ? 1 : 0;
}
/* Linked string record used to hold directory contents */
typedef struct _linkedDirent {
@ -252,7 +270,12 @@ DBSearchForTech(techname, techroot, pathroot, level)
for (ld = dlist; ld; ld = ld->ld_next)
{
tdent = ld->ld_dirent;
if (tdent->d_type != DT_DIR)
#ifdef HAVE_STRUCT_DIRENT_D_TYPE
int is_dir = tdent->d_type == DT_DIR;
#else
int is_dir = path_is_dir(pathroot, tdent->d_name) > 0; /* treat error as false */
#endif
if (!is_dir)
{
if (!strcmp(tdent->d_name, techname))
{
@ -324,7 +347,12 @@ DBAddStandardCellPaths(pathptr, level)
while ((tdent = readdir(tdir)) != NULL)
{
if ((tdent->d_type == DT_DIR) &&
#ifdef HAVE_STRUCT_DIRENT_D_TYPE
int is_dir = tdent->d_type == DT_DIR;
#else
int is_dir = path_is_dir(pathptr, tdent->d_name) > 0; /* treat error as false */
#endif
if (is_dir &&
(strcmp(tdent->d_name, ".") && strcmp(tdent->d_name, "..")))
{
/* Scan the directory contents of tdir for more subdirectories */
@ -333,7 +361,7 @@ DBAddStandardCellPaths(pathptr, level)
paths += DBAddStandardCellPaths(newpath, level + 1);
freeMagic(newpath);
}
else if (tdent->d_type != DT_DIR)
else if (!is_dir)
{
/* Scan the directory contents of tdir for .mag files */
if (!strcmp(tdent->d_name + strlen(tdent->d_name) - 4, ".mag"))