lib9pclient is the new libfs
This commit is contained in:
parent
5ba841dffa
commit
46f79934b7
16 changed files with 1033 additions and 0 deletions
73
src/lib9pclient/walk.c
Normal file
73
src/lib9pclient/walk.c
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
|
||||
/* See COPYRIGHT */
|
||||
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <fcall.h>
|
||||
#include <9pclient.h>
|
||||
#include "fsimpl.h"
|
||||
|
||||
CFid*
|
||||
_fswalk(CFid *fid, char *oname)
|
||||
{
|
||||
char *freep, *name;
|
||||
int i, nwalk;
|
||||
char *p;
|
||||
CFid *wfid;
|
||||
Fcall tx, rx;
|
||||
|
||||
freep = nil;
|
||||
name = oname;
|
||||
if(name){
|
||||
freep = malloc(strlen(name)+1);
|
||||
if(freep == nil)
|
||||
return nil;
|
||||
strcpy(freep, name);
|
||||
name = freep;
|
||||
}
|
||||
|
||||
if((wfid = _fsgetfid(fid->fs)) == nil){
|
||||
free(freep);
|
||||
return nil;
|
||||
}
|
||||
|
||||
nwalk = 0;
|
||||
do{
|
||||
/* collect names */
|
||||
for(i=0; name && *name && i < MAXWELEM; ){
|
||||
p = name;
|
||||
name = strchr(name, '/');
|
||||
if(name)
|
||||
*name++ = 0;
|
||||
if(*p == 0 || (*p == '.' && *(p+1) == 0))
|
||||
continue;
|
||||
tx.wname[i++] = p;
|
||||
}
|
||||
|
||||
/* do a walk */
|
||||
tx.type = Twalk;
|
||||
tx.fid = nwalk ? wfid->fid : fid->fid;
|
||||
tx.newfid = wfid->fid;
|
||||
tx.nwname = i;
|
||||
if(_fsrpc(fid->fs, &tx, &rx, 0) < 0){
|
||||
Error:
|
||||
free(freep);
|
||||
if(nwalk)
|
||||
fsclose(wfid);
|
||||
else
|
||||
_fsputfid(wfid);
|
||||
return nil;
|
||||
}
|
||||
if(rx.nwqid != tx.nwname){
|
||||
/* XXX lame error */
|
||||
werrstr("file '%s' not found", oname);
|
||||
goto Error;
|
||||
}
|
||||
if(rx.nwqid == 0)
|
||||
wfid->qid = fid->qid;
|
||||
else
|
||||
wfid->qid = rx.wqid[rx.nwqid-1];
|
||||
nwalk++;
|
||||
}while(name && *name);
|
||||
return wfid;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue