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