mirror of
https://github.com/tmux/tmux.git
synced 2025-09-01 20:57:00 +00:00
Move file handling protocol stuff all into file.c so it can be reused
more easily.
This commit is contained in:
@ -51,12 +51,6 @@ static void server_client_dispatch(struct imsg *, void *);
|
||||
static void server_client_dispatch_command(struct client *, struct imsg *);
|
||||
static void server_client_dispatch_identify(struct client *, struct imsg *);
|
||||
static void server_client_dispatch_shell(struct client *);
|
||||
static void server_client_dispatch_write_ready(struct client *,
|
||||
struct imsg *);
|
||||
static void server_client_dispatch_read_data(struct client *,
|
||||
struct imsg *);
|
||||
static void server_client_dispatch_read_done(struct client *,
|
||||
struct imsg *);
|
||||
|
||||
/* Compare client windows. */
|
||||
static int
|
||||
@ -2070,13 +2064,13 @@ server_client_dispatch(struct imsg *imsg, void *arg)
|
||||
server_client_dispatch_shell(c);
|
||||
break;
|
||||
case MSG_WRITE_READY:
|
||||
server_client_dispatch_write_ready(c, imsg);
|
||||
file_write_ready(&c->files, imsg);
|
||||
break;
|
||||
case MSG_READ:
|
||||
server_client_dispatch_read_data(c, imsg);
|
||||
file_read_data(&c->files, imsg);
|
||||
break;
|
||||
case MSG_READ_DONE:
|
||||
server_client_dispatch_read_done(c, imsg);
|
||||
file_read_done(&c->files, imsg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2302,71 +2296,6 @@ server_client_dispatch_shell(struct client *c)
|
||||
proc_kill_peer(c->peer);
|
||||
}
|
||||
|
||||
/* Handle write ready message. */
|
||||
static void
|
||||
server_client_dispatch_write_ready(struct client *c, struct imsg *imsg)
|
||||
{
|
||||
struct msg_write_ready *msg = imsg->data;
|
||||
size_t msglen = imsg->hdr.len - IMSG_HEADER_SIZE;
|
||||
struct client_file find, *cf;
|
||||
|
||||
if (msglen != sizeof *msg)
|
||||
fatalx("bad MSG_WRITE_READY size");
|
||||
find.stream = msg->stream;
|
||||
if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL)
|
||||
return;
|
||||
if (msg->error != 0) {
|
||||
cf->error = msg->error;
|
||||
file_fire_done(cf);
|
||||
} else
|
||||
file_push(cf);
|
||||
}
|
||||
|
||||
/* Handle read data message. */
|
||||
static void
|
||||
server_client_dispatch_read_data(struct client *c, struct imsg *imsg)
|
||||
{
|
||||
struct msg_read_data *msg = imsg->data;
|
||||
size_t msglen = imsg->hdr.len - IMSG_HEADER_SIZE;
|
||||
struct client_file find, *cf;
|
||||
void *bdata = msg + 1;
|
||||
size_t bsize = msglen - sizeof *msg;
|
||||
|
||||
if (msglen < sizeof *msg)
|
||||
fatalx("bad MSG_READ_DATA size");
|
||||
find.stream = msg->stream;
|
||||
if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL)
|
||||
return;
|
||||
|
||||
log_debug("%s: file %d read %zu bytes", c->name, cf->stream, bsize);
|
||||
if (cf->error == 0) {
|
||||
if (evbuffer_add(cf->buffer, bdata, bsize) != 0) {
|
||||
cf->error = ENOMEM;
|
||||
file_fire_done(cf);
|
||||
} else
|
||||
file_fire_read(cf);
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle read done message. */
|
||||
static void
|
||||
server_client_dispatch_read_done(struct client *c, struct imsg *imsg)
|
||||
{
|
||||
struct msg_read_done *msg = imsg->data;
|
||||
size_t msglen = imsg->hdr.len - IMSG_HEADER_SIZE;
|
||||
struct client_file find, *cf;
|
||||
|
||||
if (msglen != sizeof *msg)
|
||||
fatalx("bad MSG_READ_DONE size");
|
||||
find.stream = msg->stream;
|
||||
if ((cf = RB_FIND(client_files, &c->files, &find)) == NULL)
|
||||
return;
|
||||
|
||||
log_debug("%s: file %d read done", c->name, cf->stream);
|
||||
cf->error = msg->error;
|
||||
file_fire_done(cf);
|
||||
}
|
||||
|
||||
/* Get client working directory. */
|
||||
const char *
|
||||
server_client_get_cwd(struct client *c, struct session *s)
|
||||
|
Reference in New Issue
Block a user