lib/replace/repdir_getdents.c

ソースコードを見る。

データ構造

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.c68 行で定義されています。

参照先 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.c99 行で定義されています。

参照先 dir_buf::bufdir_buf::fddir_buf::nbytesdir_buf::ofsdir_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.c117 行で定義されています。

参照先 dir_buf::fddir_buf::nbytesdir_buf::ofsdir_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.c133 行で定義されています。

参照先 dir_buf::bufdir_buf::fddir_buf::nbytesdir_buf::ofsreaddir()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.c144 行で定義されています。

参照先 seekdir().

参照元 sys_rewinddir().

00145 {
00146         seekdir(dir, 0);
00147 }

int closedir ( DIR *  dir  ) 

repdir_getdents.c149 行で定義されています。

参照先 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  ) 

repdir_getdents.c162 行で定義されています。

参照先 dir_buf::fd.

00163 {
00164         struct dir_buf *d = (struct dir_buf *)dir;
00165         return d->fd;
00166 }


Sambaに対してSat Aug 29 21:23:36 2009に生成されました。  doxygen 1.4.7