mirror of
https://github.com/0intro/wmii
synced 2024-11-22 13:52:17 +03:00
applied 20h's patches with small minor changes (made wmiir compile against his changes)
This commit is contained in:
parent
6b83565318
commit
874228cf1a
@ -27,11 +27,11 @@ usage()
|
||||
static void
|
||||
write_data(unsigned int fid)
|
||||
{
|
||||
void *data = cext_emallocz(c.fcall.iounit);
|
||||
void *data = cext_emallocz(c.ofcall.iounit);
|
||||
unsigned long long offset = 0;
|
||||
unsigned int len = 0;
|
||||
|
||||
while((len = read(0, data, c.fcall.iounit)) > 0) {
|
||||
while((len = read(0, data, c.ofcall.iounit)) > 0) {
|
||||
if(ixp_client_write(&c, fid, offset, len, data) != len) {
|
||||
fprintf(stderr, "wmiir: cannot write file: %s\n", c.errstr);
|
||||
break;
|
||||
@ -65,7 +65,7 @@ xcreate(char *file)
|
||||
fprintf(stderr, "wmiir: cannot create file '%s': %s\n", p, c.errstr);
|
||||
return -1;
|
||||
}
|
||||
if(!(c.fcall.qid.type&P9DMDIR))
|
||||
if(!(c.ofcall.qid.type&P9DMDIR))
|
||||
write_data(fid);
|
||||
return ixp_client_close(&c, fid);
|
||||
}
|
||||
@ -193,7 +193,7 @@ xdir(char *file, int details)
|
||||
fprintf(stderr, "wmiir: cannot stat file '%s': %s\n", file, c.errstr);
|
||||
return -1;
|
||||
}
|
||||
buf = c.fcall.stat;
|
||||
buf = c.ofcall.stat;
|
||||
ixp_unpack_stat(&buf, nil, s);
|
||||
if(!(s->mode & IXP_DMDIR)) {
|
||||
print_stat(s, details);
|
||||
|
136
libixp/client.c
136
libixp/client.c
@ -16,70 +16,78 @@ int
|
||||
ixp_client_do_fcall(IXPClient *c)
|
||||
{
|
||||
static unsigned char msg[IXP_MAX_MSG];
|
||||
unsigned int msize = ixp_fcall2msg(msg, &c->fcall, IXP_MAX_MSG);
|
||||
unsigned int msize = ixp_fcall2msg(msg, &c->ifcall, IXP_MAX_MSG);
|
||||
|
||||
c->errstr = 0;
|
||||
if(ixp_send_message(c->fd, msg, msize, &c->errstr) != msize)
|
||||
return -1;
|
||||
if(!ixp_recv_message(c->fd, msg, IXP_MAX_MSG, &c->errstr))
|
||||
return -1;
|
||||
if(!(msize = ixp_msg2fcall(&c->fcall, msg, IXP_MAX_MSG))) {
|
||||
if(!(msize = ixp_msg2fcall(&c->ofcall, msg, IXP_MAX_MSG))) {
|
||||
c->errstr = "received bad message";
|
||||
return -1;
|
||||
}
|
||||
if(c->fcall.type == RERROR) {
|
||||
c->errstr = c->fcall.ename;
|
||||
if(c->ofcall.type == RERROR) {
|
||||
c->errstr = c->ofcall.ename;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ixp_client_dial(IXPClient *c, char *sockfile, unsigned int rootfid)
|
||||
{
|
||||
|
||||
if((c->fd = ixp_connect_sock(sockfile)) < 0) {
|
||||
c->errstr = "cannot connect server";
|
||||
return -1;
|
||||
}
|
||||
c->fcall.type = TVERSION;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.msize = IXP_MAX_MSG;
|
||||
c->fcall.version = cext_estrdup(IXP_VERSION);
|
||||
|
||||
c->ifcall.type = TVERSION;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.msize = IXP_MAX_MSG;
|
||||
c->ifcall.version = IXP_VERSION;
|
||||
if(ixp_client_do_fcall(c) == -1) {
|
||||
fprintf(stderr, "error: %s\n", c->errstr);
|
||||
ixp_client_hangup(c);
|
||||
return -1;
|
||||
}
|
||||
if(strncmp(c->fcall.version, IXP_VERSION, strlen(IXP_VERSION))) {
|
||||
if(strncmp(c->ofcall.version, IXP_VERSION, strlen(IXP_VERSION))) {
|
||||
fprintf(stderr, "error: %s\n", c->errstr);
|
||||
c->errstr = "9P versions differ";
|
||||
ixp_client_hangup(c);
|
||||
return -1; /* we cannot handle this version */
|
||||
}
|
||||
free(c->ofcall.version);
|
||||
c->root_fid = rootfid;
|
||||
|
||||
c->fcall.type = TATTACH;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = c->root_fid;
|
||||
c->fcall.afid = IXP_NOFID;
|
||||
c->fcall.uname = cext_estrdup(getenv("USER"));
|
||||
c->fcall.aname = cext_estrdup("");
|
||||
c->ifcall.type = TATTACH;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = c->root_fid;
|
||||
c->ifcall.afid = IXP_NOFID;
|
||||
c->ifcall.uname = getenv("USER");
|
||||
c->ifcall.aname = "";
|
||||
if(ixp_client_do_fcall(c) == -1) {
|
||||
fprintf(stderr, "error: %s\n", c->errstr);
|
||||
ixp_client_hangup(c);
|
||||
return -1;
|
||||
}
|
||||
c->root_qid = c->fcall.qid;
|
||||
c->root_qid = c->ofcall.qid;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ixp_client_remove(IXPClient *c, unsigned int newfid, char *filepath)
|
||||
{
|
||||
|
||||
if(ixp_client_walk(c, newfid, filepath) == -1)
|
||||
return -1;
|
||||
c->fcall.type = TREMOVE;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = newfid;
|
||||
c->ifcall.type = TREMOVE;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = newfid;
|
||||
|
||||
return ixp_client_do_fcall(c);
|
||||
}
|
||||
|
||||
@ -87,12 +95,12 @@ int
|
||||
ixp_client_create(IXPClient *c, unsigned int dirfid, char *name,
|
||||
unsigned int perm, unsigned char mode)
|
||||
{
|
||||
c->fcall.type = TCREATE;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = dirfid;
|
||||
c->fcall.name = cext_estrdup(name);
|
||||
c->fcall.perm = perm;
|
||||
c->fcall.mode = mode;
|
||||
c->ifcall.type = TCREATE;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = dirfid;
|
||||
c->ifcall.name = name;
|
||||
c->ifcall.perm = perm;
|
||||
c->ifcall.mode = mode;
|
||||
return ixp_client_do_fcall(c);
|
||||
}
|
||||
|
||||
@ -101,15 +109,16 @@ ixp_client_walk(IXPClient *c, unsigned int newfid, char *filepath)
|
||||
{
|
||||
unsigned int i;
|
||||
char *wname[IXP_MAX_WELEM];
|
||||
c->fcall.type = TWALK;
|
||||
c->fcall.fid = c->root_fid;
|
||||
c->fcall.newfid = newfid;
|
||||
|
||||
c->ifcall.type = TWALK;
|
||||
c->ifcall.fid = c->root_fid;
|
||||
c->ifcall.newfid = newfid;
|
||||
if(filepath) {
|
||||
c->fcall.name = cext_estrdup(filepath);
|
||||
c->fcall.nwname =
|
||||
cext_tokenize(wname, IXP_MAX_WELEM, c->fcall.name, '/');
|
||||
for(i = 0; i < c->fcall.nwname; i++)
|
||||
c->fcall.wname[i] = cext_estrdup(wname[i]);
|
||||
c->ifcall.name = filepath;
|
||||
c->ifcall.nwname =
|
||||
cext_tokenize(wname, IXP_MAX_WELEM, c->ifcall.name, '/');
|
||||
for(i = 0; i < c->ifcall.nwname; i++)
|
||||
c->ifcall.wname[i] = wname[i];
|
||||
}
|
||||
return ixp_client_do_fcall(c);
|
||||
}
|
||||
@ -117,22 +126,24 @@ ixp_client_walk(IXPClient *c, unsigned int newfid, char *filepath)
|
||||
int
|
||||
ixp_client_stat(IXPClient *c, unsigned int newfid, char *filepath)
|
||||
{
|
||||
|
||||
if(ixp_client_walk(c, newfid, filepath) == -1)
|
||||
return -1;
|
||||
|
||||
c->fcall.type = TSTAT;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = newfid;
|
||||
c->ifcall.type = TSTAT;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = newfid;
|
||||
return ixp_client_do_fcall(c);
|
||||
}
|
||||
|
||||
int
|
||||
ixp_client_open(IXPClient *c, unsigned int newfid, unsigned char mode)
|
||||
{
|
||||
c->fcall.type = TOPEN;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = newfid;
|
||||
c->fcall.mode = mode;
|
||||
|
||||
c->ifcall.type = TOPEN;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = newfid;
|
||||
c->ifcall.mode = mode;
|
||||
return ixp_client_do_fcall(c);
|
||||
}
|
||||
|
||||
@ -140,6 +151,7 @@ int
|
||||
ixp_client_walkopen(IXPClient *c, unsigned int newfid, char *filepath,
|
||||
unsigned char mode)
|
||||
{
|
||||
|
||||
if(ixp_client_walk(c, newfid, filepath) == -1)
|
||||
return -1;
|
||||
return ixp_client_open(c, newfid, mode);
|
||||
@ -149,17 +161,19 @@ int
|
||||
ixp_client_read(IXPClient *c, unsigned int fid, unsigned long long offset,
|
||||
void *result, unsigned int res_len)
|
||||
{
|
||||
unsigned int bytes = c->fcall.iounit;
|
||||
unsigned int bytes = c->ofcall.iounit;
|
||||
|
||||
c->fcall.type = TREAD;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = fid;
|
||||
c->fcall.offset = offset;
|
||||
c->fcall.count = res_len < bytes ? res_len : bytes;
|
||||
c->ifcall.type = TREAD;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = fid;
|
||||
c->ifcall.offset = offset;
|
||||
c->ifcall.count = res_len < bytes ? res_len : bytes;
|
||||
if(ixp_client_do_fcall(c) == -1)
|
||||
return -1;
|
||||
memcpy(result, c->fcall.data, c->fcall.count);
|
||||
return c->fcall.count;
|
||||
memcpy(result, c->ofcall.data, c->ofcall.count);
|
||||
free(c->ofcall.data);
|
||||
|
||||
return c->ofcall.count;
|
||||
}
|
||||
|
||||
int
|
||||
@ -167,27 +181,31 @@ ixp_client_write(IXPClient *c, unsigned int fid,
|
||||
unsigned long long offset, unsigned int count,
|
||||
unsigned char *data)
|
||||
{
|
||||
if(count > c->fcall.iounit) {
|
||||
|
||||
if(count > c->ofcall.iounit) {
|
||||
c->errstr = "iounit exceeded";
|
||||
return -1;
|
||||
}
|
||||
c->fcall.type = TWRITE;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = fid;
|
||||
c->fcall.offset = offset;
|
||||
c->fcall.count = count;
|
||||
c->fcall.data = (void *)data;
|
||||
|
||||
c->ifcall.type = TWRITE;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = fid;
|
||||
c->ifcall.offset = offset;
|
||||
c->ifcall.count = count;
|
||||
c->ifcall.data = (void *)data;
|
||||
if(ixp_client_do_fcall(c) == -1)
|
||||
return -1;
|
||||
return c->fcall.count;
|
||||
|
||||
return c->ofcall.count;
|
||||
}
|
||||
|
||||
int
|
||||
ixp_client_close(IXPClient *c, unsigned int fid)
|
||||
{
|
||||
c->fcall.type = TCLUNK;
|
||||
c->fcall.tag = IXP_NOTAG;
|
||||
c->fcall.fid = fid;
|
||||
|
||||
c->ifcall.type = TCLUNK;
|
||||
c->ifcall.tag = IXP_NOTAG;
|
||||
c->ifcall.fid = fid;
|
||||
return ixp_client_do_fcall(c);
|
||||
}
|
||||
|
||||
|
@ -244,7 +244,8 @@ typedef struct IXPClient {
|
||||
int fd;
|
||||
unsigned int root_fid;
|
||||
Qid root_qid;
|
||||
Fcall fcall;
|
||||
Fcall ifcall;
|
||||
Fcall ofcall;
|
||||
char *errstr;
|
||||
} IXPClient;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user