r19017: Merge from Samba3:
authorVolker Lendecke <vlendec@samba.org>
Sun, 1 Oct 2006 20:45:46 +0000 (20:45 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:20:28 +0000 (14:20 -0500)
Attempt to fix the BSD RAW-CHKPATH failures: In Samba3 we rely on opendir
returning ENOTDIR when the file opened is not a directory. Can we merge this
back into Samba4?

This includes the tabs->spaces fix requested by Stefan.

Volker
(This used to be commit 7b9ee1171ddc89537ba3b286f20c722fb70c980b)

source4/lib/replace/repdir_getdents.c
source4/lib/replace/repdir_getdirentries.c

index 07b9568dc1a71f4b89786a444ebbc26395201cc8..6b115c4c4fbb9680c58e1dfbb67bdf57414fcee6 100644 (file)
@@ -68,6 +68,7 @@ struct dir_buf {
 DIR *opendir(const char *dname)
 {
        struct dir_buf *d;
+       struct stat sb;
        d = malloc(sizeof(*d));
        if (d == NULL) {
                errno = ENOMEM;
@@ -78,6 +79,17 @@ DIR *opendir(const char *dname)
                free(d);
                return NULL;
        }
+       if (fstat(d->fd, &sb) < 0) {
+               close(d->fd);
+               free(d);
+               return NULL;
+       }
+       if (!S_ISDIR(sb.st_mode)) {
+               close(d->fd);
+               free(d);   
+               errno = ENOTDIR;
+               return NULL;
+       }
        d->ofs = 0;
        d->seekpos = 0;
        d->nbytes = 0;
index 9e4b63145cd9edf55d935396771c8156f4ae5a65..a6026dfb5d4e904ad7c0b25e0de55a485099dffb 100644 (file)
@@ -70,6 +70,7 @@ struct dir_buf {
 DIR *opendir(const char *dname)
 {
        struct dir_buf *d;
+       struct stat sb;
        d = malloc(sizeof(*d));
        if (d == NULL) {
                errno = ENOMEM;
@@ -80,6 +81,17 @@ DIR *opendir(const char *dname)
                free(d);
                return NULL;
        }
+       if (fstat(d->fd, &sb) < 0) {
+               close(d->fd);
+               free(d);
+               return NULL;
+       }
+       if (!S_ISDIR(sb.st_mode)) {
+               close(d->fd);
+               free(d);   
+               errno = ENOTDIR;
+               return NULL;
+       }
        d->ofs = 0;
        d->seekpos = 0;
        d->nbytes = 0;