⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opendir.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "lib.h"#include <stdlib.h>#include <sys/stat.h>#include <dirent.h>#include <unistd.h>#include <errno.h>#include <string.h>#include "sys9.h"#include "dir.h"#define DBLOCKSIZE 20DIR *opendir(const char *filename){	int f;	DIR *d;	struct stat sb;	Dir *d9;	if((d9 = _dirstat(filename)) == nil){		_syserrno();		return NULL;	}	_dirtostat(&sb, d9, 0);	free(d9);	if(S_ISDIR(sb.st_mode) == 0) {		errno = ENOTDIR;		return NULL;	}	f = open(filename, O_RDONLY);	if(f < 0){		_syserrno();		return NULL;	}	_fdinfo[f].flags |= FD_CLOEXEC;	d = (DIR *)malloc(sizeof(DIR) + DBLOCKSIZE*sizeof(struct dirent));	if(!d){		errno = ENOMEM;		return NULL;	}	d->dd_buf = ((char *)d) + sizeof(DIR);	d->dd_fd = f;	d->dd_loc = 0;	d->dd_size = 0;	d->dirs = nil;	d->dirsize = 0;	d->dirloc = 0;	return d;}intclosedir(DIR *d){	if(!d){		errno = EBADF;		return -1;	}	if(close(d->dd_fd) < 0)		return -1;	free(d->dirs);	free(d);	return 0;}voidrewinddir(DIR *d){	int f;	char dname[300];	d->dd_loc = 0;	d->dd_size = 0;	d->dirsize = 0;	d->dirloc = 0;	free(d->dirs);	d->dirs = nil;	if(!d){		return;	}	if(_SEEK(d->dd_fd, 0, 0) < 0){		_syserrno();		return;	}}struct dirent *readdir(DIR *d){	int i, n;	struct dirent *dr;	Dir *dirs;	if(!d){		errno = EBADF;		return NULL;	}	if(d->dd_loc >= d->dd_size){		if(d->dirloc >= d->dirsize){			free(d->dirs);			d->dirsize = _dirread(d->dd_fd, &d->dirs);			d->dirloc = 0;		}		if(d->dirs == NULL)			return NULL;		dr = (struct dirent *)(d->dd_buf);		dirs = d->dirs;		for(i=0; i<DBLOCKSIZE && d->dirloc < d->dirsize; i++){			strncpy(dr[i].d_name, dirs[d->dirloc++].name, MAXNAMLEN);			dr[i].d_name[MAXNAMLEN] = 0;		}		d->dd_loc = 0;		d->dd_size = i*sizeof(struct dirent);	}	dr = (struct dirent*)(d->dd_buf+d->dd_loc);	d->dd_loc += sizeof(struct dirent);	return dr;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -