Blame


1 46f79934 2005-01-04 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 46f79934 2005-01-04 devnull /* See COPYRIGHT */
3 46f79934 2005-01-04 devnull
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"
9 46f79934 2005-01-04 devnull
10 46f79934 2005-01-04 devnull CFid*
11 73a5509a 2006-07-23 devnull fswalk(CFid *fid, char *oname)
12 46f79934 2005-01-04 devnull {
13 46f79934 2005-01-04 devnull char *freep, *name;
14 46f79934 2005-01-04 devnull int i, nwalk;
15 46f79934 2005-01-04 devnull char *p;
16 46f79934 2005-01-04 devnull CFid *wfid;
17 46f79934 2005-01-04 devnull Fcall tx, rx;
18 46f79934 2005-01-04 devnull
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;
27 46f79934 2005-01-04 devnull }
28 46f79934 2005-01-04 devnull
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;
32 46f79934 2005-01-04 devnull }
33 46f79934 2005-01-04 devnull
34 46f79934 2005-01-04 devnull nwalk = 0;
35 46f79934 2005-01-04 devnull do{
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, '/');
40 46f79934 2005-01-04 devnull if(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;
45 46f79934 2005-01-04 devnull }
46 46f79934 2005-01-04 devnull
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){
53 46f79934 2005-01-04 devnull Error:
54 46f79934 2005-01-04 devnull free(freep);
55 46f79934 2005-01-04 devnull if(nwalk)
56 46f79934 2005-01-04 devnull fsclose(wfid);
57 46f79934 2005-01-04 devnull else
58 46f79934 2005-01-04 devnull _fsputfid(wfid);
59 46f79934 2005-01-04 devnull return nil;
60 46f79934 2005-01-04 devnull }
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;
65 46f79934 2005-01-04 devnull }
66 46f79934 2005-01-04 devnull if(rx.nwqid == 0)
67 46f79934 2005-01-04 devnull wfid->qid = fid->qid;
68 46f79934 2005-01-04 devnull else
69 46f79934 2005-01-04 devnull wfid->qid = rx.wqid[rx.nwqid-1];
70 46f79934 2005-01-04 devnull nwalk++;
71 46f79934 2005-01-04 devnull }while(name && *name);
72 46f79934 2005-01-04 devnull return wfid;
73 46f79934 2005-01-04 devnull }