auto_node.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 705 行 · 第 1/2 页

C
705
字号
	dirp = opendir(name);	if (dirp == NULL) 		return (0);	while (d = readdir(dirp)) {		if (strcmp(d->d_name, ".") == 0)			continue;		if (strcmp(d->d_name, "..") == 0)			continue;		break;	}	(void) closedir(dirp);	if (d)		return (0);	return (1);}loaddirect_file(map, opts)	char *map, *opts;{	FILE *fp;	int done = 0;	char *line, *p1, *p2;	extern char *get_line();	char linebuf[1024];	if ((fp = fopen(map, "r")) == NULL) {		return -1;	}	while ((line = get_line(fp, linebuf, sizeof linebuf)) != NULL) {		p1 = line;		while (*p1 && isspace(*p1)) p1++;		if (*p1 == '\0')			continue;		p2 = p1;		while (*p2 && !isspace(*p2)) p2++;		*p2 = '\0';		if (*p1 == '+')			(void) loaddirect_yp(p1+1, map, opts);		else			dirinit(p1, map, opts, 1);		done++;	}		(void) fclose(fp);	return done;}loaddirect_yp(ypmap, localmap, opts)	char *ypmap, *localmap, *opts;{	int first, err;	char *key, *nkey, *val;	int kl, nkl, vl;	char dir[100];	first = 1;	key  = NULL; kl  = 0;	nkey = NULL; nkl = 0;	val  = NULL; vl  = 0;	for (;;) {		if (first) {			first = 0;			err = yp_first(mydomain, ypmap, &nkey, &nkl, &val, &vl);		} else {			err = yp_next(mydomain, ypmap, key, kl, &nkey, &nkl,				&val, &vl);		}		if (err) {			if (err != YPERR_NOMORE && err != YPERR_MAP)				syslog(LOG_ERR, "%s: %s",					ypmap, yperr_string(err));			return;		}		if (key)			free(key);		key = nkey;		kl = nkl;		if (kl < 2 || kl >= 100)			continue;		if (isspace(*key) || *key == '#')			continue;		(void) strncpy(dir, key, kl);		dir[kl] = '\0';		dirinit(dir, localmap, opts, 1);		free(val);	}}struct link *makelink(dir, name, fs, linkpath)	struct autodir *dir;	char *name;	struct filsys *fs;	char *linkpath;{	struct link *link;	char *malloc();	register fattr *fa;	link = findlink(dir, name);	if (link == NULL) {		link = (struct link *)malloc(sizeof *link);		if (link == NULL)			goto alloc_failed;		link->link_name = strdup(name);		if (link->link_name == NULL) {			free((char *)link);			goto alloc_failed;		}		INSQUE(dir->dir_head, link);		link->link_fs = NULL;		link->link_path = NULL;		new_fh(&link->link_vnode);		link->link_vnode.vn_data = (char *)link;		link->link_vnode.vn_type = VN_LINK;	}	link->link_dir = dir;	link->link_fs = NULL;	if (link->link_path) {		free(link->link_path);		link->link_path = NULL;	}	if (fs) {		link->link_fs = fs;		fs->fs_rootfs->fs_death = time_now + max_link_time;	}	if (linkpath) {		link->link_path = strdup(linkpath);		if (link->link_path == NULL) {			REMQUE(link->link_dir->dir_head, link);			if (link->link_name)				free(link->link_name);			free((char *)link);			goto alloc_failed;		}	}	link->link_death = time_now + max_link_time;	fa = &link->link_vnode.vn_fattr;	fa->type = NFLNK;	fa->mode = NFSMODE_LNK + 0777;	fa->nlink = 1;	fa->uid = 0;	fa->gid = 0;	fa->size = strlen(linkpath);/* 	if (fs) 		fa->size += strlen(fs->fs_dir) + 1;*/	fa->blocksize = 512;	fa->rdev = 0;	fa->blocks = 1;	fa->fsid = 0;	fa->fileid = fileid(&link->link_vnode);	(void) gettimeofday((struct timeval *)&fa->atime, (struct timezone *)0);	fa->mtime = fa->atime;	fa->ctime = fa->atime;	return (link);alloc_failed:	syslog(LOG_ERR, "Memory allocation failed: %m");	return (NULL);}zero_link(link)	struct link *link;{	link->link_death = 0;	link->link_fs = (struct filsys *)0;}free_link(link)	struct link *link;{	/* Don't remove a direct link - just zero it */	if (link->link_dir->dir_vnode.vn_type == VN_LINK) {		zero_link(link);		return;	}	REMQUE(link->link_dir->dir_head, link);	free_fh(&link->link_vnode);	if (link->link_name)		free(link->link_name);	if (link->link_path)		free(link->link_path);	free((char *)link);}struct link *findlink(dir, name)	struct autodir *dir;	char *name;{	struct link *link;	for (link = HEAD(struct link, dir->dir_head); link;	    link = NEXT(struct link, link))		if (strcmp(name, link->link_name) == 0)			return (link);	return ((struct link *)0);}free_filsys(fs)	struct filsys *fs;{	REMQUE(fs_q, fs);	free(fs->fs_host);	free(fs->fs_dir);	free(fs->fs_mntpnt);	if (fs->fs_opts)		free(fs->fs_opts);}struct filsys *alloc_fs(host, dir, mntpnt, opts)	char *host, *dir, *mntpnt, *opts;{	struct filsys *fs;	fs = (struct filsys *)malloc(sizeof *fs);	if (fs == NULL)		goto alloc_failed;	bzero((char *)fs, sizeof *fs);	fs->fs_rootfs = fs;	fs->fs_host = strdup(host);	if (fs->fs_host == NULL) {		free((char *)fs);		goto alloc_failed;	}	fs->fs_dir = strdup(dir);	if (fs->fs_dir == NULL) {		free(fs->fs_host);		free((char *)fs);		goto alloc_failed;	}	fs->fs_mntpnt = strdup(mntpnt);	if (fs->fs_mntpnt == NULL) {		free(fs->fs_dir);		free(fs->fs_host);		free((char *)fs);		goto alloc_failed;	}	if (opts != NULL) {		fs->fs_opts = strdup(opts);		if (fs->fs_opts == NULL) {			free(fs->fs_mntpnt);			free(fs->fs_dir);			free(fs->fs_host);			free((char *)fs);			goto alloc_failed;		}	} else		fs->fs_opts = NULL;	INSQUE(fs_q, fs);	return (fs);alloc_failed:	syslog(LOG_ERR, "Memory allocation failed: %m");	return (NULL);}my_insque(head, item)	struct queue *head, *item;{	item->q_next = head->q_head;	item->q_prev = NULL;	head->q_head = item;	if (item->q_next)		item->q_next->q_prev = item;	if (head->q_tail == NULL)		head->q_tail = item;}my_remque(head, item)	struct queue *head, *item;{	if (item->q_prev)		item->q_prev->q_next = item->q_next;	else		head->q_head = item->q_next;	if (item->q_next)		item->q_next->q_prev = item->q_prev;	else		head->q_tail = item->q_prev;	item->q_next = item->q_prev = NULL;}do_timeouts(){	struct autodir *dir;	struct link *link, *nextlink;	struct filsys *fs, *nextfs;	extern int trace;	if (trace > 1)		fprintf(stderr, "do_timeouts: enter\n");	for (dir = HEAD(struct autodir, dir_q); dir;	    dir = NEXT(struct autodir, dir)) {		for (link = HEAD(struct link, dir->dir_head); link;			link = nextlink) {			nextlink = NEXT(struct link, link);			if (link->link_death && link->link_death <= time_now) {				zero_link(link);			}		}	}	for (fs = HEAD(struct filsys, fs_q); fs; fs = nextfs) {		nextfs = NEXT(struct filsys, fs);		if (fs->fs_mine) {			if (fs != fs->fs_rootfs)				continue;			if (fs->fs_death > time_now)				continue;			if (!do_unmount(fs))				fs->fs_death = time_now + max_link_time;		}	}	if (trace > 1)		fprintf(stderr, "do_timeouts: exit\n");}flush_links(fs)	struct filsys *fs;{	struct link *link;	struct vnode *vnode;	int i;	for (i = 0; i < FH_HASH_SIZE; i++) {		vnode = HEAD(struct vnode, fh_q_hash[i]);		for (; vnode; vnode = NEXT(struct vnode, vnode)) {			if (vnode->vn_type != VN_LINK)				continue;			link = (struct link *)vnode->vn_data;			if (link->link_fs == fs)				zero_link(link);		}	}}

⌨️ 快捷键说明

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