made Qid routing in wmiibar id based for each item, now doing same in wm as well

This commit is contained in:
Anselm R. Garbe 2006-02-03 14:45:07 +02:00
parent 8ee287bc78
commit 385860251d
3 changed files with 50 additions and 51 deletions

View File

@ -48,12 +48,15 @@ enum {
};
typedef struct {
unsigned short id;
char data[256];
char colstr[24];
Color color;
XRectangle rect;
} Item;
#define NEW_ITEM (unsigned short)0xffff
static char E9pversion[] = "9P version not supported";
static char Enoperm[] = "permission denied";
static char Enofid[] = "fid not assigned";
@ -106,7 +109,9 @@ dummy_error_handler(Display * dpy, XErrorEvent * err)
static void
new_item()
{
static unsigned int id = 0;
Item *it = cext_emallocz(sizeof(Item));
it->id = id++;
if(nitem > 0) {
cext_strlcpy(it->colstr, item[0]->colstr, sizeof(it->colstr));
it->color = item[0]->color;
@ -232,13 +237,24 @@ check_x_event(IXPServer *s, IXPConn *c)
}
}
int
index_of_id(unsigned short id)
{
int i;
if(id == NEW_ITEM)
return nitem;
for(i = 0; i < nitem; i++)
if(item[i]->id == id)
return i;
return -1;
}
/* IXP stuff */
static unsigned long long
mkqpath(unsigned char type, unsigned short item)
mkqpath(unsigned char type, unsigned short id)
{
return ((unsigned long long) item << 8) | (unsigned long long) type;
return ((unsigned long long) id << 8) | (unsigned long long) type;
}
static unsigned char
@ -248,7 +264,7 @@ qpath_type(unsigned long long path)
}
static unsigned short
qpath_item(unsigned long long path)
qpath_id(unsigned long long path)
{
return (path >> 8) & 0xffff;
}
@ -257,9 +273,11 @@ static char *
qid_to_name(Qid *qid)
{
unsigned char type = qpath_type(qid->path);
unsigned short i = qpath_item(qid->path);
int i = index_of_id(qpath_id(qid->path));
static char buf[32];
if(i == -1)
return nil;
switch(type) {
case Droot: return "/"; break;
case Ditem:
@ -309,10 +327,11 @@ static int
mkqid(Qid *dir, char *wname, Qid *new)
{
const char *err;
unsigned short id = qpath_id(dir->path);
int type = name_to_type(wname);
unsigned short i = qpath_item(dir->path);
int i = index_of_id(id);
if((dir->type != IXP_QTDIR) || (type == -1))
if((i == -1) || (dir->type != IXP_QTDIR) || (type == -1))
return -1;
new->dtype = qpath_type(dir->path);
@ -324,12 +343,12 @@ mkqid(Qid *dir, char *wname, Qid *new)
case Ditem:
new->type = IXP_QTDIR;
if(!strncmp(wname, "new", 4))
new->path = mkqpath(Ditem, nitem);
new->path = mkqpath(Ditem, NEW_ITEM);
else {
unsigned short i = cext_strtonum(wname, 1, 0xffff, &err);
i = cext_strtonum(wname, 1, 0xffff, &err);
if(err || (i >= nitem))
return -1;
new->path = mkqpath(Ditem, i);
new->path = mkqpath(Ditem, item[i]->id);
}
break;
case Fdata: /* note, Fdata has to be checked before Fcolor, fallthrough */
@ -340,7 +359,7 @@ mkqid(Qid *dir, char *wname, Qid *new)
return -1;
default:
new->type = IXP_QTFILE;
new->path = mkqpath(type, i);
new->path = mkqpath(type, id);
break;
}
return 0;
@ -450,9 +469,11 @@ static unsigned int
type_to_stat(Stat *stat, char *name, Qid *dir)
{
int type = name_to_type(name);
unsigned short i = qpath_item(dir->path);
int i = index_of_id(qpath_id(dir->path));
char buf[16];
if(i == -1)
return 0;
switch (type) {
case Droot:
case Ditem:
@ -494,26 +515,22 @@ static int
xremove(IXPConn *c)
{
IXPMap *m = ixp_server_fid2map(c, c->fcall->fid);
unsigned short i;
Qid qitem, qid;
int i;
if(!m) {
errstr = Enofid;
return -1;
}
i = qpath_item(m->qid.path);
i = index_of_id(qpath_id(m->qid.path));
if(i == -1) {
errstr = Enofile;
return -1;
}
if((qpath_type(m->qid.path) == Ditem) && i && (i < nitem)) {
Item *it = item[i];
qitem = m->qid;
/* clunk */
cext_array_detach((void **)c->map, m, &c->mapsz);
free(m);
/* close all connections which might have outstanding requests to this item */
if(!mkqid(&qitem, "data", &qid))
ixp_server_close_conns_qid(&srv, &qid);
if(!mkqid(&qitem, "color", &qid))
ixp_server_close_conns_qid(&srv, &qid);
ixp_server_close_conns_qid(&srv, &qitem);
/* now detach the item */
detach_item(it);
free(it);
@ -533,15 +550,19 @@ xread(IXPConn *c)
Stat stat;
IXPMap *m = ixp_server_fid2map(c, c->fcall->fid);
unsigned char *p = c->fcall->data;
unsigned short i;
unsigned int len;
int i;
char buf[32];
if(!m) {
errstr = Enofid;
return -1;
}
i = qpath_item(m->qid.path);
i = index_of_id(qpath_id(m->qid.path));
if(i == -1) {
errstr = Enofile;
return -1;
}
c->fcall->count = 0;
if(c->fcall->offset) {
@ -676,14 +697,18 @@ xwrite(IXPConn *c)
{
char buf[256];
IXPMap *m = ixp_server_fid2map(c, c->fcall->fid);
unsigned short i;
int i;
if(!m) {
errstr = Enofid;
return -1;
}
i = qpath_item(m->qid.path);
i = index_of_id(qpath_id(m->qid.path));
if(i == -1) {
errstr = Enofile;
return -1;
}
switch (qpath_type(m->qid.path)) {
case Fctl:
if(c->fcall->count == 4) {

View File

@ -281,7 +281,6 @@ unsigned int ixp_msg_to_fcall(void *msg, unsigned int msglen, Fcall *fcall);
/* server.c */
char *ixp_server_loop(IXPServer *s);
IXPMap *ixp_server_fid2map(IXPConn *c, unsigned int fid);
void ixp_server_close_conns_qid(IXPServer *s, Qid *qid);
/* socket.c */
int ixp_connect_sock(char *address);

View File

@ -71,28 +71,3 @@ ixp_server_fid2map(IXPConn *c, unsigned int fid)
return c->map[i];
return nil;
}
static int
xcomp_qid(Qid *q1, Qid *q2)
{
return !((q1->type == q2->type) &&
(q1->version == q2->version) &&
(q1->path == q2->path) &&
(q1->dtype == q2->dtype));
}
void
ixp_server_close_conns_qid(IXPServer *s, Qid *qid)
{
size_t i, j;
for(i = 0; (i < s->connsz) && s->conn[i]; i++) {
IXPConn *c = s->conn[i];
if(!c->close)
continue;
for(j = 0; (j < c->mapsz) && c->map[j]; j++)
if(!xcomp_qid(qid, &c->map[j]->qid)) {
c->close(s, c);
break;
}
}
}