version 1.2, 2019/12/12 11:51:32 |
version 1.3, 2019/12/16 15:48:50 |
|
|
*/ |
*/ |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
#include <sys/queue.h> |
|
|
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
|
#include <imsg.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
msg.stream = 1; |
msg.stream = 1; |
msg.fd = STDOUT_FILENO; |
msg.fd = STDOUT_FILENO; |
msg.flags = 0; |
msg.flags = 0; |
strlcpy(msg.path, "-", sizeof msg.path); |
|
proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg); |
proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg); |
} else { |
} else { |
evbuffer_add_vprintf(cf->buffer, fmt, ap); |
evbuffer_add_vprintf(cf->buffer, fmt, ap); |
|
|
msg.stream = 1; |
msg.stream = 1; |
msg.fd = STDOUT_FILENO; |
msg.fd = STDOUT_FILENO; |
msg.flags = 0; |
msg.flags = 0; |
strlcpy(msg.path, "-", sizeof msg.path); |
|
proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg); |
proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg); |
} else { |
} else { |
evbuffer_add(cf->buffer, data, size); |
evbuffer_add(cf->buffer, data, size); |
|
|
msg.stream = 2; |
msg.stream = 2; |
msg.fd = STDERR_FILENO; |
msg.fd = STDERR_FILENO; |
msg.flags = 0; |
msg.flags = 0; |
strlcpy(msg.path, "-", sizeof msg.path); |
|
proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg); |
proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg); |
} else { |
} else { |
evbuffer_add_vprintf(cf->buffer, fmt, ap); |
evbuffer_add_vprintf(cf->buffer, fmt, ap); |
|
|
{ |
{ |
struct client_file *cf; |
struct client_file *cf; |
FILE *f; |
FILE *f; |
struct msg_write_open msg; |
struct msg_write_open *msg; |
|
size_t msglen; |
int fd = -1; |
int fd = -1; |
const char *mode; |
const char *mode; |
|
|
|
|
skip: |
skip: |
evbuffer_add(cf->buffer, bdata, bsize); |
evbuffer_add(cf->buffer, bdata, bsize); |
|
|
msg.stream = cf->stream; |
msglen = strlen(cf->path) + 1 + sizeof *msg; |
msg.fd = fd; |
if (msglen > MAX_IMSGSIZE - IMSG_HEADER_SIZE) { |
msg.flags = flags; |
|
if (strlcpy(msg.path, cf->path, sizeof msg.path) >= sizeof msg.path) { |
|
cf->error = E2BIG; |
cf->error = E2BIG; |
goto done; |
goto done; |
} |
} |
if (proc_send(c->peer, MSG_WRITE_OPEN, -1, &msg, sizeof msg) != 0) { |
msg = xmalloc(msglen); |
|
msg->stream = cf->stream; |
|
msg->fd = fd; |
|
msg->flags = flags; |
|
memcpy(msg + 1, cf->path, msglen - sizeof *msg); |
|
if (proc_send(c->peer, MSG_WRITE_OPEN, -1, msg, msglen) != 0) { |
|
free(msg); |
cf->error = EINVAL; |
cf->error = EINVAL; |
goto done; |
goto done; |
} |
} |
|
free(msg); |
return; |
return; |
|
|
done: |
done: |
|
|
{ |
{ |
struct client_file *cf; |
struct client_file *cf; |
FILE *f; |
FILE *f; |
struct msg_read_open msg; |
struct msg_read_open *msg; |
|
size_t msglen, size; |
int fd = -1; |
int fd = -1; |
char buffer[BUFSIZ]; |
char buffer[BUFSIZ]; |
size_t size; |
|
|
|
if (strcmp(path, "-") == 0) { |
if (strcmp(path, "-") == 0) { |
cf = file_create(c, file_next_stream++, cb, cbdata); |
cf = file_create(c, file_next_stream++, cb, cbdata); |
|
|
} |
} |
|
|
skip: |
skip: |
msg.stream = cf->stream; |
msglen = strlen(cf->path) + 1 + sizeof *msg; |
msg.fd = fd; |
if (msglen > MAX_IMSGSIZE - IMSG_HEADER_SIZE) { |
if (strlcpy(msg.path, cf->path, sizeof msg.path) >= sizeof msg.path) { |
|
cf->error = E2BIG; |
cf->error = E2BIG; |
goto done; |
goto done; |
} |
} |
if (proc_send(c->peer, MSG_READ_OPEN, -1, &msg, sizeof msg) != 0) { |
msg = xmalloc(msglen); |
|
msg->stream = cf->stream; |
|
msg->fd = fd; |
|
memcpy(msg + 1, cf->path, msglen - sizeof *msg); |
|
if (proc_send(c->peer, MSG_READ_OPEN, -1, msg, msglen) != 0) { |
|
free(msg); |
cf->error = EINVAL; |
cf->error = EINVAL; |
goto done; |
goto done; |
} |
} |
|
free(msg); |
return; |
return; |
|
|
done: |
done: |
|
|
file_push(struct client_file *cf) |
file_push(struct client_file *cf) |
{ |
{ |
struct client *c = cf->c; |
struct client *c = cf->c; |
struct msg_write_data msg; |
struct msg_write_data *msg; |
|
size_t msglen, sent, left; |
struct msg_write_close close; |
struct msg_write_close close; |
size_t sent, left; |
|
|
|
|
msg = xmalloc(sizeof *msg); |
left = EVBUFFER_LENGTH(cf->buffer); |
left = EVBUFFER_LENGTH(cf->buffer); |
while (left != 0) { |
while (left != 0) { |
sent = left; |
sent = left; |
if (sent > sizeof msg.data) |
if (sent > MAX_IMSGSIZE - IMSG_HEADER_SIZE) |
sent = sizeof msg.data; |
sent = MAX_IMSGSIZE - IMSG_HEADER_SIZE; |
memcpy(msg.data, EVBUFFER_DATA(cf->buffer), sent); |
|
msg.size = sent; |
|
|
|
msg.stream = cf->stream; |
msglen = (sizeof *msg) + sent; |
if (proc_send(c->peer, MSG_WRITE, -1, &msg, sizeof msg) != 0) |
msg = xrealloc(msg, msglen); |
|
msg->stream = cf->stream; |
|
memcpy(msg + 1, EVBUFFER_DATA(cf->buffer), sent); |
|
if (proc_send(c->peer, MSG_WRITE, -1, msg, msglen) != 0) |
break; |
break; |
evbuffer_drain(cf->buffer, sent); |
evbuffer_drain(cf->buffer, sent); |
|
|
|
|
proc_send(c->peer, MSG_WRITE_CLOSE, -1, &close, sizeof close); |
proc_send(c->peer, MSG_WRITE_CLOSE, -1, &close, sizeof close); |
file_fire_done(cf); |
file_fire_done(cf); |
} |
} |
|
free(msg); |
} |
} |