From e3043b7dcb3eba0a34eddbc5e8477e6399ccb324 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 27 Mar 1987 15:11:06 +0000 Subject: [PATCH] minor adaption, to close filedescriptor immediatelym if possible --- lang/cem/libcc/gen/closedir.c | 4 ++-- lang/cem/libcc/gen/opendir.c | 9 +++++++-- lang/cem/libcc/gen/readdir.c | 7 ++++--- lang/cem/libcc/gen/seekdir.c | 4 ++-- lang/cem/libcc/gen/telldir.c | 4 +++- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/lang/cem/libcc/gen/closedir.c b/lang/cem/libcc/gen/closedir.c index d7f71c647..bea1b1f53 100644 --- a/lang/cem/libcc/gen/closedir.c +++ b/lang/cem/libcc/gen/closedir.c @@ -7,9 +7,9 @@ closedir(dirp) register DIR *dirp; { - close(dirp->dd_fd); + if (dirp->dd_fd >= 0) close(dirp->dd_fd); dirp->dd_fd = -1; - dirp->dd_loc = 0; + dirp->dd_loc = -1; free(dirp->dd_buf); free((char *)dirp); } diff --git a/lang/cem/libcc/gen/opendir.c b/lang/cem/libcc/gen/opendir.c index f01742819..caff6a98b 100644 --- a/lang/cem/libcc/gen/opendir.c +++ b/lang/cem/libcc/gen/opendir.c @@ -21,9 +21,14 @@ char *name; close (fd); return NULL; } - if ((int) stbuf.st_size == stbuf.st_size && + if ((unsigned) stbuf.st_size == stbuf.st_size && (dirp->dd_buf = malloc((unsigned) stbuf.st_size))) { dirp->dd_bsize = stbuf.st_size; + read(fd, dirp->dd_buf, dirp->dd_bsize); + close(fd); + dirp->dd_fd = -2; + dirp->dd_loc = 0; + return dirp; } else if (dirp->dd_buf = malloc(8*DIRBLKSIZ)) { dirp->dd_bsize = 8 * DIRBLKSIZ; @@ -37,6 +42,6 @@ char *name; return NULL; } dirp->dd_fd = fd; - dirp->dd_loc = 0; + dirp->dd_loc = -1; return dirp; } diff --git a/lang/cem/libcc/gen/readdir.c b/lang/cem/libcc/gen/readdir.c index b791038a6..6fc497e55 100644 --- a/lang/cem/libcc/gen/readdir.c +++ b/lang/cem/libcc/gen/readdir.c @@ -25,21 +25,22 @@ register DIR *dirp; static struct direct dir; for (;;) { - if (dirp->dd_loc == 0) { + if (dirp->dd_loc == -1) { dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, dirp->dd_bsize); if (dirp->dd_size <= 0) { dirp->dd_size = 0; return NULL; } + dirp->dd_loc = 0; #ifdef __BSD4_2 if (! ((struct direct *) dirp->dd_buf)->d_ino) { - dirp->dd_loc += ((struct direct *)dirp->dd_buf)->d_reclen; + dirp->dd_loc = ((struct direct *)dirp->dd_buf)->d_reclen; } #endif } if (dirp->dd_loc >= dirp->dd_size) { - dirp->dd_loc = 0; + dirp->dd_loc = -1; continue; } dp = (struct olddirect *) (dirp->dd_buf + dirp->dd_loc); diff --git a/lang/cem/libcc/gen/seekdir.c b/lang/cem/libcc/gen/seekdir.c index caaf9c7a5..3c90756a1 100644 --- a/lang/cem/libcc/gen/seekdir.c +++ b/lang/cem/libcc/gen/seekdir.c @@ -18,13 +18,13 @@ long loc; return; offset = loc % dirp->dd_bsize; base = loc - offset; - if (dirp->dd_loc != 0 && offset != 0 && + if (dirp->dd_loc != -1 && (curloc - (curloc % dirp->dd_bsize)) == base) { dirp->dd_loc = offset; return; } (void) lseek(dirp->dd_fd, base, 0); - dirp->dd_loc = 0; + dirp->dd_loc = -1; dirp->dd_size = 0; while (dirp->dd_loc < offset) { if (readdir(dirp) == (struct direct *) 0) diff --git a/lang/cem/libcc/gen/telldir.c b/lang/cem/libcc/gen/telldir.c index de5118f18..d3fb4ec47 100644 --- a/lang/cem/libcc/gen/telldir.c +++ b/lang/cem/libcc/gen/telldir.c @@ -9,5 +9,7 @@ DIR *dirp; { extern long lseek(); - return (lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc); + if (dirp->dd_fd >= 0) + return (lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc); + return dirp->dd_loc; } -- 2.34.1