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 + -
显示快捷键?