mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-27 11:52:03 +00:00
73 lines
1.3 KiB
C
73 lines
1.3 KiB
C
/* 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;
|
|
}
|