From 7ab546707790241ce30b376ead9bc33d1d25ea1e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Thu, 1 Oct 2009 20:15:20 +0000 Subject: [PATCH] * by Ano: make static compileable on solaris; the path needs to be allocated next to the buffer * just define the flags (which solaris doesn't) if they aren't already there. --- webcit/static.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/webcit/static.c b/webcit/static.c index 191f61b74..0b4f449c4 100644 --- a/webcit/static.c +++ b/webcit/static.c @@ -98,7 +98,7 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) StrBuf *WebDir = NULL; StrBuf *OneWebName = NULL; DIR *filedir = NULL; - struct dirent d; + struct dirent *d; struct dirent *filedir_entry; int d_type = 0; int d_namelen; @@ -110,18 +110,26 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) return 0; } + d = (struct dirent *)malloc(offsetof(struct dirent, d_name) + PATH_MAX + 1); + if (d == NULL) { + return 0; + } + Dir = NewStrBufPlain(DirName, -1); WebDir = NewStrBufPlain(RelDir, -1); istoplevel = IsEmptyStr(RelDir); OneWebName = NewStrBuf(); - while ((readdir_r(filedir, &d, &filedir_entry) == 0) && + while ((readdir_r(filedir, d, &filedir_entry) == 0) && (filedir_entry != NULL)) { char *PStart; #ifdef _DIRENT_HAVE_D_NAMELEN d_namelen = filedir_entry->d_namelen; d_type = filedir_entry->d_type; +#else + +#ifndef DT_UNKNOWN #define DT_UNKNOWN 0 #define DT_DIR 4 #define DT_REG 8 @@ -129,22 +137,12 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) #define IFTODT(mode) (((mode) & 0170000) >> 12) #define DTTOIF(dirtype) ((dirtype) << 12) - -#else +#endif d_namelen = strlen(filedir_entry->d_name); + d_type = DT_UNKNOWN; #endif d_without_ext = d_namelen; - if (d_type == DT_UNKNOWN) { - struct stat s; - char path[PATH_MAX]; - snprintf(path, PATH_MAX, "%s/%s", - DirName, filedir_entry->d_name); - if (stat(path, &s) == 0) { - d_type = IFTODT(s.st_mode); - } - } - if ((d_namelen > 1) && filedir_entry->d_name[d_namelen - 1] == '~') continue; /* Ignore backup files... */ @@ -157,6 +155,16 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) (filedir_entry->d_name[1] == '.')) continue; + if (d_type == DT_UNKNOWN) { + struct stat s; + char path[PATH_MAX]; + snprintf(path, PATH_MAX, "%s/%s", + DirName, filedir_entry->d_name); + if (stat(path, &s) == 0) { + d_type = IFTODT(s.st_mode); + } + } + switch (d_type) { case DT_DIR: @@ -200,6 +208,7 @@ int LoadStaticDir(const char *DirName, HashList *DirList, const char *RelDir) } + free(d); closedir(filedir); FreeStrBuf(&Dir); FreeStrBuf(&WebDir); -- 2.30.2