11 c = smalloc(sizeof(Chan));
13 /* if you get an error before associating with a dev,
14 close calls rootclose, a nop */
39 panic("cclose %#p", getcallerpc(&c));
44 devtab[c->type]->close(c);
57 wq = devtab[c->type]->walk(c, nil, nil, 0);
59 error("clone failed");
75 void cleancname(Cname*);
80 return p[0]=='.' && p[1]=='.' && p[2]=='\0';
114 n = smalloc(sizeof(Cname));
117 n->alen = i+CNAMESLOP;
118 n->s = smalloc(n->alen);
119 memmove(n->s, s, i+1);
138 addelem(Cname *n, char *s)
144 if(s[0]=='.' && s[1]=='\0')
149 new = newcname(n->s);
155 if(n->len+1+i+1 > n->alen){
156 a = n->len+1+i+1 + CNAMESLOP;
158 memmove(t, n->s, n->len+1);
163 if(n->len>0 && n->s[n->len-1]!='/' && s[0]!='/') /* don't insert extra slash if one is present */
164 n->s[n->len++] = '/';
165 memmove(n->s+n->len, s, i+1);
173 * In place, rewrite name to compress multiple /, eliminate ., and process ..
181 p = strchr(n->s, '/');
187 * The correct name is #i rather than #i/,
188 * but the correct name of #/ is #/.
190 if(strcmp(p, "/")==0 && n->s[1] != '/')
194 n->len = strlen(n->s);
200 if(c->qid.type & QTDIR)