データ構造 | |
struct | dir_buf |
関数 | |
DIR * | opendir (const char *dname) |
dirent * | readdir (DIR *dir) |
long | telldir (DIR *dir) |
void | seekdir (DIR *dir, long ofs) |
void | rewinddir (DIR *dir) |
int | closedir (DIR *dir) |
int | dirfd (DIR *dir) |
DIR* opendir | ( | const char * | dname | ) |
repdir_getdents.c の 68 行で定義されています。
参照先 errno.
参照元 file_find()・main()・sys_opendir()・test_readdir_os2_delete()・wsys_opendir().
00069 { 00070 struct dir_buf *d; 00071 struct stat sb; 00072 d = malloc(sizeof(*d)); 00073 if (d == NULL) { 00074 errno = ENOMEM; 00075 return NULL; 00076 } 00077 d->fd = open(dname, O_RDONLY); 00078 if (d->fd == -1) { 00079 free(d); 00080 return NULL; 00081 } 00082 if (fstat(d->fd, &sb) < 0) { 00083 close(d->fd); 00084 free(d); 00085 return NULL; 00086 } 00087 if (!S_ISDIR(sb.st_mode)) { 00088 close(d->fd); 00089 free(d); 00090 errno = ENOTDIR; 00091 return NULL; 00092 } 00093 d->ofs = 0; 00094 d->seekpos = 0; 00095 d->nbytes = 0; 00096 return (DIR *)d; 00097 }
struct dirent* readdir | ( | DIR * | dir | ) |
repdir_getdents.c の 99 行で定義されています。
参照先 dir_buf::buf・dir_buf::fd・dir_buf::nbytes・dir_buf::ofs・dir_buf::seekpos.
参照元 main()・os2_delete()・seekdir()・solaris_list_xattr()・sys_readdir()・test_readdir_os2_delete().
00100 { 00101 struct dir_buf *d = (struct dir_buf *)dir; 00102 struct dirent *de; 00103 00104 if (d->ofs >= d->nbytes) { 00105 d->seekpos = lseek(d->fd, 0, SEEK_CUR); 00106 d->nbytes = getdents(d->fd, d->buf, DIR_BUF_SIZE); 00107 d->ofs = 0; 00108 } 00109 if (d->ofs >= d->nbytes) { 00110 return NULL; 00111 } 00112 de = (struct dirent *)&d->buf[d->ofs]; 00113 d->ofs += de->d_reclen; 00114 return de; 00115 }
long telldir | ( | DIR * | dir | ) |
repdir_getdents.c の 117 行で定義されています。
参照先 dir_buf::fd・dir_buf::nbytes・dir_buf::ofs・dir_buf::seekpos.
参照元 os2_delete()・readdirname()・sys_telldir()・vfs_readdirname().
00118 { 00119 struct dir_buf *d = (struct dir_buf *)dir; 00120 if (d->ofs >= d->nbytes) { 00121 d->seekpos = lseek(d->fd, 0, SEEK_CUR); 00122 d->ofs = 0; 00123 d->nbytes = 0; 00124 } 00125 /* this relies on seekpos always being a multiple of 00126 DIR_BUF_SIZE. Is that always true on BSD systems? */ 00127 if (d->seekpos & (DIR_BUF_SIZE-1)) { 00128 abort(); 00129 } 00130 return d->seekpos + d->ofs; 00131 }
void seekdir | ( | DIR * | dir, | |
long | ofs | |||
) |
repdir_getdents.c の 133 行で定義されています。
参照先 dir_buf::buf・dir_buf::fd・dir_buf::nbytes・dir_buf::ofs・readdir()・dir_buf::seekpos.
参照元 os2_delete()・rewinddir()・sys_seekdir().
00134 { 00135 struct dir_buf *d = (struct dir_buf *)dir; 00136 d->seekpos = lseek(d->fd, ofs & ~(DIR_BUF_SIZE-1), SEEK_SET); 00137 d->nbytes = getdents(d->fd, d->buf, DIR_BUF_SIZE); 00138 d->ofs = 0; 00139 while (d->ofs < (ofs & (DIR_BUF_SIZE-1))) { 00140 if (readdir(dir) == NULL) break; 00141 } 00142 }
void rewinddir | ( | DIR * | dir | ) |
repdir_getdents.c の 144 行で定義されています。
参照先 seekdir().
参照元 sys_rewinddir().
00145 { 00146 seekdir(dir, 0); 00147 }
int closedir | ( | DIR * | dir | ) |
repdir_getdents.c の 149 行で定義されています。
参照先 dir_buf::fd.
参照元 file_find()・main()・solaris_list_xattr()・sys_closedir()・test_readdir_os2_delete().
00150 { 00151 struct dir_buf *d = (struct dir_buf *)dir; 00152 int r = close(d->fd); 00153 if (r != 0) { 00154 return r; 00155 } 00156 free(d); 00157 return 0; 00158 }
int dirfd | ( | DIR * | dir | ) |