Blame


1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
3 d3df3087 2003-12-06 devnull
4 d3df3087 2003-12-06 devnull #include <u.h>
5 d3df3087 2003-12-06 devnull #include <libc.h>
6 d3df3087 2003-12-06 devnull #include <fcall.h>
7 d3df3087 2003-12-06 devnull #include <fs.h>
8 d3df3087 2003-12-06 devnull #include "fsimpl.h"
9 d3df3087 2003-12-06 devnull
10 d3df3087 2003-12-06 devnull Fid*
11 d3df3087 2003-12-06 devnull fswalk(Fid *fid, char *oname)
12 d3df3087 2003-12-06 devnull {
13 d3df3087 2003-12-06 devnull char *freep, *name;
14 d3df3087 2003-12-06 devnull int i, nwalk;
15 d3df3087 2003-12-06 devnull char *p;
16 d3df3087 2003-12-06 devnull Fid *wfid;
17 d3df3087 2003-12-06 devnull Fcall tx, rx;
18 d3df3087 2003-12-06 devnull
19 d3df3087 2003-12-06 devnull freep = nil;
20 d3df3087 2003-12-06 devnull name = oname;
21 d3df3087 2003-12-06 devnull if(name){
22 d3df3087 2003-12-06 devnull freep = malloc(strlen(name)+1);
23 d3df3087 2003-12-06 devnull if(freep == nil)
24 d3df3087 2003-12-06 devnull return nil;
25 d3df3087 2003-12-06 devnull strcpy(freep, name);
26 d3df3087 2003-12-06 devnull name = freep;
27 d3df3087 2003-12-06 devnull }
28 d3df3087 2003-12-06 devnull
29 d3df3087 2003-12-06 devnull if((wfid = _fsgetfid(fid->fs)) == nil){
30 d3df3087 2003-12-06 devnull free(freep);
31 d3df3087 2003-12-06 devnull return nil;
32 d3df3087 2003-12-06 devnull }
33 d3df3087 2003-12-06 devnull
34 d3df3087 2003-12-06 devnull nwalk = 0;
35 d3df3087 2003-12-06 devnull do{
36 d3df3087 2003-12-06 devnull /* collect names */
37 d3df3087 2003-12-06 devnull for(i=0; name && *name && i < MAXWELEM; ){
38 d3df3087 2003-12-06 devnull p = name;
39 d3df3087 2003-12-06 devnull name = strchr(name, '/');
40 d3df3087 2003-12-06 devnull if(name)
41 d3df3087 2003-12-06 devnull *name++ = 0;
42 d3df3087 2003-12-06 devnull if(*p == 0)
43 d3df3087 2003-12-06 devnull continue;
44 d3df3087 2003-12-06 devnull tx.wname[i++] = p;
45 d3df3087 2003-12-06 devnull }
46 d3df3087 2003-12-06 devnull
47 d3df3087 2003-12-06 devnull /* do a walk */
48 d3df3087 2003-12-06 devnull tx.type = Twalk;
49 d3df3087 2003-12-06 devnull tx.fid = nwalk ? wfid->fid : fid->fid;
50 d3df3087 2003-12-06 devnull tx.newfid = wfid->fid;
51 d3df3087 2003-12-06 devnull tx.nwname = i;
52 d3df3087 2003-12-06 devnull if(fsrpc(fid->fs, &tx, &rx, 0) < 0){
53 d3df3087 2003-12-06 devnull Error:
54 d3df3087 2003-12-06 devnull free(freep);
55 d3df3087 2003-12-06 devnull if(nwalk)
56 d3df3087 2003-12-06 devnull fsclose(wfid);
57 d3df3087 2003-12-06 devnull else
58 d3df3087 2003-12-06 devnull _fsputfid(wfid);
59 d3df3087 2003-12-06 devnull return nil;
60 d3df3087 2003-12-06 devnull }
61 d3df3087 2003-12-06 devnull if(rx.nwqid != tx.nwname){
62 d3df3087 2003-12-06 devnull /* XXX lame error */
63 d3df3087 2003-12-06 devnull werrstr("file '%s' not found", oname);
64 d3df3087 2003-12-06 devnull goto Error;
65 d3df3087 2003-12-06 devnull }
66 d3df3087 2003-12-06 devnull if(rx.nwqid == 0)
67 d3df3087 2003-12-06 devnull wfid->qid = fid->qid;
68 d3df3087 2003-12-06 devnull else
69 d3df3087 2003-12-06 devnull wfid->qid = rx.wqid[rx.nwqid-1];
70 d3df3087 2003-12-06 devnull nwalk++;
71 d3df3087 2003-12-06 devnull }while(name && *name);
72 d3df3087 2003-12-06 devnull return wfid;
73 d3df3087 2003-12-06 devnull }