simplify, fix garbage read

This commit is contained in:
nixo 2020-05-10 02:43:00 +02:00
parent 0270a9c565
commit 29f551626e
2 changed files with 9 additions and 65 deletions

View File

@ -266,16 +266,10 @@ CommandResult *parse_command(const char *input, yajl_gen gen, ipc_client *client
/* A YAJL JSON generator used for formatting replies. */ /* A YAJL JSON generator used for formatting replies. */
command_output.json_gen = gen; command_output.json_gen = gen;
// FIXME: Add results (as string, remove this json dependency) SCM _str = scm_simple_format (SCM_BOOL_F,
y(map_open); scm_from_locale_string("{\"status\": ~S}\n"),
// BOOL + false -> failed scm_list_1(status));
// else success ystr(scm_to_locale_string(_str));
ystr("success");
bool success = (scm_is_bool(status) == 0) || scm_is_true(status);
y(bool, success);
ystr("results");
ystr(scm_is_string(status) ? scm_to_locale_string(status) : "#undefined");
y(map_close);
command_output.needs_tree_render = false; command_output.needs_tree_render = false;
result->needs_tree_render = command_output.needs_tree_render; result->needs_tree_render = command_output.needs_tree_render;

View File

@ -112,11 +112,10 @@ static void ipc_push_pending(ipc_client *client) {
* send the message if the client's buffer was empty. * send the message if the client's buffer was empty.
* *
*/ */
static void ipc_send_client_message(ipc_client *client, size_t size, const uint32_t message_type, const uint8_t *payload) { static void ipc_send_client_message(ipc_client *client, size_t size, const uint8_t *payload) {
const i3_ipc_header_t header = { const i3_ipc_header_t header = {
.magic = {'i', '3', '-', 'i', 'p', 'c'}, .magic = {'i', '3', '-', 'i', 'p', 'c'},
.size = size, .size = size};
.type = message_type};
const size_t header_size = sizeof(i3_ipc_header_t); const size_t header_size = sizeof(i3_ipc_header_t);
const size_t message_size = header_size + size; const size_t message_size = header_size + size;
@ -166,7 +165,7 @@ void ipc_send_event(const char *event, uint32_t message_type, const char *payloa
TAILQ_FOREACH (current, &all_clients, clients) { TAILQ_FOREACH (current, &all_clients, clients) {
for (int i = 0; i < current->num_events; i++) { for (int i = 0; i < current->num_events; i++) {
if (strcasecmp(current->events[i], event) == 0) { if (strcasecmp(current->events[i], event) == 0) {
ipc_send_client_message(current, strlen(payload), message_type, (uint8_t *)payload); ipc_send_client_message(current, strlen(payload), (uint8_t *)payload);
break; break;
} }
} }
@ -242,8 +241,7 @@ IPC_HANDLER(run_command) {
ylength length; ylength length;
yajl_gen_get_buf(gen, &reply, &length); yajl_gen_get_buf(gen, &reply, &length);
ipc_send_client_message(client, length, I3_IPC_REPLY_TYPE_COMMAND, ipc_send_client_message(client, length, (const uint8_t *)reply);
(const uint8_t *)reply);
yajl_gen_free(gen); yajl_gen_free(gen);
} }
@ -870,58 +868,12 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) {
#undef YSTR_IF_SET #undef YSTR_IF_SET
} }
/*
* Callback for the YAJL parser (will be called when a string is parsed).
*
*/
static int add_subscription(void *extra, const unsigned char *s,
ylength len) {
ipc_client *client = extra;
DLOG("should add subscription to extra %p, sub %.*s\n", client, (int)len, s);
int event = client->num_events;
client->num_events++;
client->events = srealloc(client->events, client->num_events * sizeof(char *));
/* We copy the string because it is not null-terminated and strndup()
* is missing on some BSD systems */
client->events[event] = scalloc(len + 1, 1);
memcpy(client->events[event], s, len);
DLOG("client is now subscribed to:\n");
for (int i = 0; i < client->num_events; i++) {
DLOG("event %s\n", client->events[i]);
}
DLOG("(done)\n");
return 1;
}
struct sync_state { struct sync_state {
char *last_key; char *last_key;
uint32_t rnd; uint32_t rnd;
xcb_window_t window; xcb_window_t window;
}; };
static int _sync_json_key(void *extra, const unsigned char *val, size_t len) {
struct sync_state *state = extra;
FREE(state->last_key);
state->last_key = scalloc(len + 1, 1);
memcpy(state->last_key, val, len);
return 1;
}
static int _sync_json_int(void *extra, long long val) {
struct sync_state *state = extra;
if (strcasecmp(state->last_key, "rnd") == 0) {
state->rnd = val;
} else if (strcasecmp(state->last_key, "window") == 0) {
state->window = (xcb_window_t)val;
}
return 1;
}
/* /*
* Handler for activity on a client connection, receives a message from a * Handler for activity on a client connection, receives a message from a
* client. * client.
@ -1252,8 +1204,6 @@ void ipc_send_binding_event(const char *event_type, Binding *bind) {
void ipc_confirm_restart(ipc_client *client) { void ipc_confirm_restart(ipc_client *client) {
DLOG("ipc_confirm_restart(fd %d)\n", client->fd); DLOG("ipc_confirm_restart(fd %d)\n", client->fd);
static const char *reply = "[{\"success\":true}]"; static const char *reply = "[{\"success\":true}]";
ipc_send_client_message( ipc_send_client_message(client, strlen(reply), (const uint8_t *)reply);
client, strlen(reply), I3_IPC_REPLY_TYPE_COMMAND,
(const uint8_t *)reply);
ipc_push_pending(client); ipc_push_pending(client);
} }