xref: /plan9/sys/src/cmd/unlnfs.c (revision 7545821f6f79b0dfcecb7f99982cb85e0b144a38)
1*7c881178SDavid du Colombier #include <u.h>
2*7c881178SDavid du Colombier #include <libc.h>
3*7c881178SDavid du Colombier #include <bio.h>
4*7c881178SDavid du Colombier #include <libsec.h>
5*7c881178SDavid du Colombier 
6*7c881178SDavid du Colombier enum
7*7c881178SDavid du Colombier {
8*7c881178SDavid du Colombier 	ENCLEN = 26,
9*7c881178SDavid du Colombier };
10*7c881178SDavid du Colombier 
11*7c881178SDavid du Colombier typedef struct Name Name;
12*7c881178SDavid du Colombier struct Name {
13*7c881178SDavid du Colombier 	char	shortname[ENCLEN + 1];
14*7c881178SDavid du Colombier 	char*	longname;
15*7c881178SDavid du Colombier 	Name*	next;
16*7c881178SDavid du Colombier };
17*7c881178SDavid du Colombier 
18*7c881178SDavid du Colombier Name *names;
19*7c881178SDavid du Colombier void rename(char*, char*, char*);
20*7c881178SDavid du Colombier void renamedir(char*);
21*7c881178SDavid du Colombier void readnames(char*);
22*7c881178SDavid du Colombier 
23*7c881178SDavid du Colombier void
main(int argc,char ** argv)24*7c881178SDavid du Colombier main(int argc, char **argv)
25*7c881178SDavid du Colombier {
26*7c881178SDavid du Colombier 	char lnfile[256], *d;
27*7c881178SDavid du Colombier 	d = ".";
28*7c881178SDavid du Colombier 	if(argc > 1)
29*7c881178SDavid du Colombier 		d = argv[1];
30*7c881178SDavid du Colombier 
31*7c881178SDavid du Colombier 	snprint(lnfile, sizeof(lnfile), "%s/.longnames", d);
32*7c881178SDavid du Colombier 	readnames(lnfile);
33*7c881178SDavid du Colombier 	renamedir(d);
34*7c881178SDavid du Colombier }
35*7c881178SDavid du Colombier 
36*7c881178SDavid du Colombier void
renamedir(char * d)37*7c881178SDavid du Colombier renamedir(char *d)
38*7c881178SDavid du Colombier {
39*7c881178SDavid du Colombier 	int n;
40*7c881178SDavid du Colombier 	Dir *dir;
41*7c881178SDavid du Colombier 	char *sub;
42*7c881178SDavid du Colombier 	int fd, i;
43*7c881178SDavid du Colombier 	Name *na;
44*7c881178SDavid du Colombier 
45*7c881178SDavid du Colombier 	fd = open(d, OREAD);
46*7c881178SDavid du Colombier 	if (fd == -1)
47*7c881178SDavid du Colombier 		return;
48*7c881178SDavid du Colombier 	while((n = dirread(fd, &dir)) > 0){
49*7c881178SDavid du Colombier 		for(i = 0; i < n; i++){
50*7c881178SDavid du Colombier 			if(dir[i].mode & DMDIR){
51*7c881178SDavid du Colombier 				sub = malloc(strlen(d) + 1 + strlen(dir[i].name) + 1);
52*7c881178SDavid du Colombier 				sprint(sub, "%s/%s", d, dir[i].name);
53*7c881178SDavid du Colombier 				renamedir(sub);
54*7c881178SDavid du Colombier 				free(sub);
55*7c881178SDavid du Colombier 			}
56*7c881178SDavid du Colombier 			if(strlen(dir[i].name) != ENCLEN)
57*7c881178SDavid du Colombier 				continue;
58*7c881178SDavid du Colombier 			for (na = names; na != nil; na = na->next){
59*7c881178SDavid du Colombier 				if (strcmp(na->shortname, dir[i].name) == 0){
60*7c881178SDavid du Colombier 					rename(d, dir[i].name, na->longname);
61*7c881178SDavid du Colombier 					break;
62*7c881178SDavid du Colombier 				}
63*7c881178SDavid du Colombier 			}
64*7c881178SDavid du Colombier 		}
65*7c881178SDavid du Colombier 		free(dir);
66*7c881178SDavid du Colombier 	}
67*7c881178SDavid du Colombier 	close(fd);
68*7c881178SDavid du Colombier }
69*7c881178SDavid du Colombier 
70*7c881178SDavid du Colombier void
rename(char * d,char * old,char * new)71*7c881178SDavid du Colombier rename(char *d, char *old, char *new)
72*7c881178SDavid du Colombier {
73*7c881178SDavid du Colombier 	char *p;
74*7c881178SDavid du Colombier 	Dir dir;
75*7c881178SDavid du Colombier 	p = malloc(strlen(d) + 1 + strlen(old) + 1);
76*7c881178SDavid du Colombier 	sprint(p, "%s/%s", d, old);
77*7c881178SDavid du Colombier 	nulldir(&dir);
78*7c881178SDavid du Colombier 	dir.name = new;
79*7c881178SDavid du Colombier 	if(dirwstat(p, &dir) == -1)
80*7c881178SDavid du Colombier 		fprint(2, "unlnfs: cannot rename %s to %s: %r\n", p, new);
81*7c881178SDavid du Colombier 	free(p);
82*7c881178SDavid du Colombier }
83*7c881178SDavid du Colombier 
84*7c881178SDavid du Colombier void
long2short(char shortname[ENCLEN+1],char * longname)85*7c881178SDavid du Colombier long2short(char shortname[ENCLEN+1], char *longname)
86*7c881178SDavid du Colombier {
87*7c881178SDavid du Colombier 	uchar digest[MD5dlen];
88*7c881178SDavid du Colombier 	md5((uchar*)longname, strlen(longname), digest, nil);
89*7c881178SDavid du Colombier 	enc32(shortname, ENCLEN+1, digest, MD5dlen);
90*7c881178SDavid du Colombier }
91*7c881178SDavid du Colombier 
92*7c881178SDavid du Colombier void
readnames(char * lnfile)93*7c881178SDavid du Colombier readnames(char *lnfile)
94*7c881178SDavid du Colombier {
95*7c881178SDavid du Colombier 	Biobuf *bio;
96*7c881178SDavid du Colombier 	char *f;
97*7c881178SDavid du Colombier 	Name *n;
98*7c881178SDavid du Colombier 
99*7c881178SDavid du Colombier 	bio = Bopen(lnfile, OREAD);
100*7c881178SDavid du Colombier 	if(bio == nil){
101*7c881178SDavid du Colombier 		fprint(2, "unlnfs: cannot open %s: %r\n", lnfile);
102*7c881178SDavid du Colombier 		exits("error");
103*7c881178SDavid du Colombier 	}
104*7c881178SDavid du Colombier 	while((f = Brdstr(bio, '\n', 1)) != nil){
105*7c881178SDavid du Colombier 		n = malloc(sizeof(Name));
106*7c881178SDavid du Colombier 		n->longname = f;
107*7c881178SDavid du Colombier 		long2short(n->shortname, f);
108*7c881178SDavid du Colombier 		n->next = names;
109*7c881178SDavid du Colombier 		names = n;
110*7c881178SDavid du Colombier 	}
111*7c881178SDavid du Colombier 	Bterm(bio);
112*7c881178SDavid du Colombier }
113