commit 4bfca250ce0fa2d00faa79430158eb30a94c8dbf
parent 86077a19c1e78c688250573904d445189b69ca56
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Tue, 7 Mar 2006 17:43:46 +0100
added /cache namespace containing available cached ws'es
Diffstat:
2 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -65,6 +65,8 @@ static char Enocommand[] = "command not supported";
* /ws/1/1/tags FsFtags tag of client
* /ws/1/1/geom FsFgeom geometry of client
* /ws/1/1/ctl FsFctl command interface (client)
+ * /cache/ FsDcache cache of existing ws'es
+ * /cache/foo FsDws cache of existing ws'es
*/
Qid root_qid;
@@ -153,9 +155,18 @@ qid2name(Qid *qid)
case FsDdef: return "def"; break;
case FsDkeys: return "keys"; break;
case FsDtags: return "tags"; break;
+ case FsDcache: return "cache"; break;
case FsDclients: return "clients"; break;
case FsDbar: return "bar"; break;
- case FsDws: return "ws"; break;
+ case FsDws:
+ if(qid->dir_type == FsDroot)
+ return "ws";
+ else {
+ if(i1 == -1)
+ return nil;
+ return tag[i1]->name;
+ }
+ break;
case FsDlabel:
if(i1 == -1)
return nil;
@@ -258,9 +269,11 @@ name2type(char *name, unsigned char dir_type)
case FsDclient: return FsFtags; break;
}
}
+ if(!strncmp(name, "cache", 6))
+ return FsDcache;
if(!strncmp(name, "clients", 8))
return FsDclients;
- if(!strncmp(name, "ws", 3))
+ if(!strncmp(name, "ws", 3) && (dir_type == FsDroot))
return FsDws;
if(!strncmp(name, "bar", 4))
return FsDbar;
@@ -300,12 +313,18 @@ name2type(char *name, unsigned char dir_type)
return FsFkey;
if(!strncmp(name, "sel", 4))
goto dyndir;
+ if(dir_type == FsDcache) {
+ for(i = 0; i < ntag; i++)
+ if(!strncmp(name, tag[i]->name, strlen(tag[i]->name)))
+ goto dyndir;
+ }
i = (unsigned short) cext_strtonum(name, 0, 0xffff, &err);
if(err)
return -1;
dyndir:
/*fprintf(stderr, "nametotype: dir_type = %d\n", dir_type);*/
switch(dir_type) {
+ case FsDcache: return FsDws; break;
case FsDbar: return FsDlabel; break;
case FsDws: return FsDarea; break;
case FsDclients: return FsDGclient; break;
@@ -333,6 +352,7 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
case FsDdef:
case FsDkeys:
case FsDtags:
+ case FsDcache:
case FsDclients:
case FsDbar:
new->type = IXP_QTDIR;
@@ -340,7 +360,16 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
break;
case FsDws:
new->type = IXP_QTDIR;
- new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0);
+ if(!strncmp(wname, "ws", 3) && dir_type == FsDroot)
+ new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0);
+ else {
+ for(i = 0; i < ntag; i++)
+ if(!strncmp(wname, tag[i]->name, strlen(tag[i]->name)))
+ break;
+ if(i >= ntag)
+ return -1;
+ new->path = mkqpath(FsDws, tag[i]->id, 0, 0);
+ }
break;
case FsDlabel:
new->type = IXP_QTDIR;
@@ -583,6 +612,7 @@ type2stat(Stat *stat, char *wname, Qid *dir)
case FsDdef:
case FsDkeys:
case FsDtags:
+ case FsDcache:
case FsDclients:
case FsDbar:
case FsDlabel:
@@ -743,6 +773,24 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
}
break;
+ case FsDcache:
+ /* jump to offset */
+ len = 0;
+ for(i = 0; i < ntag; i++) {
+ len += type2stat(&stat, tag[i]->name, &m->qid);
+ if(len <= fcall->offset)
+ continue;
+ break;
+ }
+ /* offset found, proceeding */
+ for(; i < ntag; i++) {
+ len = type2stat(&stat, tag[i]->name, &m->qid);
+ if(fcall->count + len > fcall->iounit)
+ break;
+ fcall->count += len;
+ p = ixp_enc_stat(p, &stat);
+ }
+ break;
case FsDtags:
/* jump to offset */
len = 0;
@@ -882,6 +930,8 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
fcall->count += type2stat(&stat, "clients", &m->qid);
p = ixp_enc_stat(p, &stat);
+ fcall->count += type2stat(&stat, "cache", &m->qid);
+ p = ixp_enc_stat(p, &stat);
fcall->count += type2stat(&stat, "ws", &m->qid);
p = ixp_enc_stat(p, &stat);
break;
@@ -904,6 +954,15 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
}
break;
+ case FsDcache:
+ for(i = 0; i < ntag; i++) {
+ len = type2stat(&stat, tag[i]->name, &m->qid);
+ if(fcall->count + len > fcall->iounit)
+ break;
+ fcall->count += len;
+ p = ixp_enc_stat(p, &stat);
+ }
+ break;
case FsDtags:
for(i = 0; i < nctag; i++) {
len = type2stat(&stat, ctag[i], &m->qid);
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -46,6 +46,7 @@ enum {
FsDroot,
FsDdef,
FsDws,
+ FsDcache,
FsDarea,
FsDclients,
FsDclient,