00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef lint
00038 static char sccsid[] = "@(#)dirent.c 5.1 (Berkeley) 3/7/91";
00039 #endif
00040
00041 #include "shell.h"
00042
00043 #if ! DIRENT
00044
00045 #include <errno.h>
00046 #include <sys/types.h>
00047 #include <sys/stat.h>
00048 #include <fcntl.h>
00049 #include <dirent.h>
00050
00051 #ifndef S_ISDIR
00052 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
00053 #endif
00054
00055 #ifdef BSD
00056
00057 #ifdef __STDC__
00058 int stat(char *, struct stat *);
00059 #else
00060 int stat();
00061 #endif
00062
00063
00064
00065
00066
00067
00068
00069 #undef opendir
00070
00071 DIR *
00072 myopendir(dirname)
00073 char *dirname;
00074 {
00075 struct stat statb;
00076
00077 if (stat(dirname, &statb) != 0 || ! S_ISDIR(statb.st_mode)) {
00078 errno = ENOTDIR;
00079 return NULL;
00080 }
00081 return opendir(dirname);
00082 }
00083
00084 #else
00085
00086
00087
00088
00089
00090 #ifdef __STDC__
00091 pointer malloc(unsigned);
00092 void free(pointer);
00093 int open(char *, int, ...);
00094 int close(int);
00095 int fstat(int, struct stat *);
00096 #else
00097 pointer malloc();
00098 void free();
00099 int open();
00100 int close();
00101 int fstat();
00102 #endif
00103
00104
00105 DIR *
00106 opendir(dirname)
00107 char *dirname;
00108 {
00109 register DIR *dirp;
00110 register int fd;
00111 struct stat statb;
00112
00113 #ifdef O_NDELAY
00114 fd = open(dirname, O_RDONLY|O_NDELAY);
00115 #else
00116 fd = open(dirname, O_RDONLY);
00117 #endif
00118 if (fd < 0)
00119 return NULL;
00120
00121 if (fstat(fd, &statb) != 0 || !S_ISDIR(statb.st_mode)) {
00122 (void)close(fd);
00123 errno = ENOTDIR;
00124 return NULL;
00125 }
00126
00127 if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
00128 (void)close(fd);
00129 errno = ENOMEM;
00130 return NULL;
00131 }
00132
00133 dirp->dd_fd = fd;
00134 dirp->dd_nleft = 0;
00135
00136 return dirp;
00137 }
00138
00139
00140
00141 int
00142 closedir(dirp)
00143 register DIR *dirp;
00144 {
00145 register int fd;
00146
00147 if (dirp == NULL) {
00148 errno = EFAULT;
00149 return -1;
00150 }
00151
00152 fd = dirp->dd_fd;
00153 free((pointer)dirp);
00154 return close(fd);
00155 }
00156
00157
00158
00159 struct dirent *
00160 readdir(dirp)
00161 register DIR *dirp;
00162 {
00163 register struct direct *dp;
00164 register char *p, *q;
00165 register int i;
00166
00167 do {
00168 if ((dirp->dd_nleft -= sizeof (struct direct)) < 0) {
00169 if ((i = read(dirp->dd_fd,
00170 (char *)dirp->dd_buf,
00171 DIRBUFENT*sizeof(struct direct))) <= 0) {
00172 if (i == 0)
00173 errno = 0;
00174 return NULL;
00175 }
00176 dirp->dd_loc = dirp->dd_buf;
00177 dirp->dd_nleft = i - sizeof (struct direct);
00178 }
00179 dp = dirp->dd_loc++;
00180 } while (dp->d_ino == 0);
00181 dirp->dd_entry.d_ino = dp->d_ino;
00182
00183
00184 p = dp->d_name;
00185 q = dirp->dd_entry.d_name;
00186 i = DIRSIZ;
00187 while (--i >= 0 && *p != '\0')
00188 *q++ = *p++;
00189 *q = '\0';
00190 return &dirp->dd_entry;
00191 }
00192
00193 #endif
00194 #endif