version 1.28, 2014/04/24 09:14:43 |
version 1.29, 2014/05/13 07:34:35 |
|
|
struct client *c = cmdq->client; |
struct client *c = cmdq->client; |
struct session *s; |
struct session *s; |
FILE *f; |
FILE *f; |
const char *path; |
const char *path, *bufname; |
char *pdata, *new_pdata, *cause; |
char *pdata, *new_pdata, *cause; |
size_t psize; |
size_t psize; |
u_int limit; |
int ch, error, cwd, fd; |
int ch, error, buffer, *buffer_ptr, cwd, fd; |
|
|
|
if (!args_has(args, 'b')) |
bufname = NULL; |
buffer = -1; |
if (args_has(args, 'b')) |
else { |
bufname = args_get(args, 'b'); |
buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause); |
|
if (cause != NULL) { |
|
cmdq_error(cmdq, "buffer %s", cause); |
|
free(cause); |
|
return (CMD_RETURN_ERROR); |
|
} |
|
} |
|
|
|
path = args->argv[0]; |
path = args->argv[0]; |
if (strcmp(path, "-") == 0) { |
if (strcmp(path, "-") == 0) { |
buffer_ptr = xmalloc(sizeof *buffer_ptr); |
|
*buffer_ptr = buffer; |
|
|
|
error = server_set_stdin_callback(c, cmd_load_buffer_callback, |
error = server_set_stdin_callback(c, cmd_load_buffer_callback, |
buffer_ptr, &cause); |
(void*)bufname, &cause); |
if (error != 0) { |
if (error != 0) { |
cmdq_error(cmdq, "%s: %s", path, cause); |
cmdq_error(cmdq, "%s: %s", path, cause); |
free(cause); |
free(cause); |
|
|
|
|
fclose(f); |
fclose(f); |
|
|
limit = options_get_number(&global_options, "buffer-limit"); |
if (paste_set(pdata, psize, bufname, &cause) != 0) { |
if (buffer == -1) { |
cmdq_error(cmdq, "%s", cause); |
paste_add(pdata, psize, limit); |
|
return (CMD_RETURN_NORMAL); |
|
} |
|
if (paste_replace(buffer, pdata, psize) != 0) { |
|
cmdq_error(cmdq, "no buffer %d", buffer); |
|
free(pdata); |
free(pdata); |
|
free(cause); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
} |
} |
|
|
|
|
void |
void |
cmd_load_buffer_callback(struct client *c, int closed, void *data) |
cmd_load_buffer_callback(struct client *c, int closed, void *data) |
{ |
{ |
int *buffer = data; |
const char *bufname = data; |
char *pdata; |
char *pdata, *cause; |
size_t psize; |
size_t psize; |
u_int limit; |
|
|
|
if (!closed) |
if (!closed) |
return; |
return; |
|
|
return; |
return; |
|
|
psize = EVBUFFER_LENGTH(c->stdin_data); |
psize = EVBUFFER_LENGTH(c->stdin_data); |
if (psize == 0 || (pdata = malloc(psize + 1)) == NULL) { |
if (psize == 0 || (pdata = malloc(psize + 1)) == NULL) |
free(data); |
|
goto out; |
goto out; |
} |
|
memcpy(pdata, EVBUFFER_DATA(c->stdin_data), psize); |
memcpy(pdata, EVBUFFER_DATA(c->stdin_data), psize); |
pdata[psize] = '\0'; |
pdata[psize] = '\0'; |
evbuffer_drain(c->stdin_data, psize); |
evbuffer_drain(c->stdin_data, psize); |
|
|
limit = options_get_number(&global_options, "buffer-limit"); |
if (paste_set(pdata, psize, bufname, &cause) != 0) { |
if (*buffer == -1) |
|
paste_add(pdata, psize, limit); |
|
else if (paste_replace(*buffer, pdata, psize) != 0) { |
|
/* No context so can't use server_client_msg_error. */ |
/* No context so can't use server_client_msg_error. */ |
evbuffer_add_printf(c->stderr_data, "no buffer %d\n", *buffer); |
evbuffer_add_printf(c->stderr_data, "%s", cause); |
server_push_stderr(c); |
server_push_stderr(c); |
free(pdata); |
free(pdata); |
|
free(cause); |
} |
} |
|
|
free(data); |
|
|
|
out: |
out: |
cmdq_continue(c->cmdq); |
cmdq_continue(c->cmdq); |