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

📄 unlnfs.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include <libsec.h>enum{	ENCLEN = 26,};typedef struct Name Name;struct Name {	char	shortname[ENCLEN + 1];	char*	longname;	Name*	next;};Name *names;void rename(char*, char*, char*);void renamedir(char*);void readnames(char*);voidmain(int argc, char **argv){	char lnfile[256], *d;	d = ".";	if(argc > 1)		d = argv[1];	snprint(lnfile, sizeof(lnfile), "%s/.longnames", d);	readnames(lnfile);	renamedir(d);}voidrenamedir(char *d){	int n;	Dir *dir;	char *sub;	int fd, i;	Name *na;	fd = open(d, OREAD);	if (fd == -1)		return;	while((n = dirread(fd, &dir)) > 0){		for(i = 0; i < n; i++){			if(dir[i].mode & DMDIR){				sub = malloc(strlen(d) + 1 + strlen(dir[i].name) + 1);				sprint(sub, "%s/%s", d, dir[i].name);				renamedir(sub);				free(sub);			}			if(strlen(dir[i].name) != ENCLEN)				continue;			for (na = names; na != nil; na = na->next){				if (strcmp(na->shortname, dir[i].name) == 0){					rename(d, dir[i].name, na->longname);					break;				}			}		}		free(dir);	}	close(fd);}voidrename(char *d, char *old, char *new){	char *p;	Dir dir;	p = malloc(strlen(d) + 1 + strlen(old) + 1);	sprint(p, "%s/%s", d, old);	nulldir(&dir);	dir.name = new;	if(dirwstat(p, &dir) == -1)		fprint(2, "unlnfs: cannot rename %s to %s: %r\n", p, new);	free(p);}	voidlong2short(char shortname[ENCLEN+1], char *longname){	uchar digest[MD5dlen];	md5((uchar*)longname, strlen(longname), digest, nil);	enc32(shortname, ENCLEN+1, digest, MD5dlen);}voidreadnames(char *lnfile){	Biobuf *bio;	char *f;	Name *n;	bio = Bopen(lnfile, OREAD);	if(bio == nil){		fprint(2, "unlnfs: cannot open %s: %r\n", lnfile);		exits("error");	}	while((f = Brdstr(bio, '\n', 1)) != nil){		n = malloc(sizeof(Name));		n->longname = f;		long2short(n->shortname, f);		n->next = names;		names = n;	}	Bterm(bio);}

⌨️ 快捷键说明

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