|
|
@ -106,7 +106,7 @@ void ipc_terminate(void) {
|
|
|
|
struct sockaddr_un *ipc_user_sockaddr(void) {
|
|
|
|
struct sockaddr_un *ipc_user_sockaddr(void) {
|
|
|
|
struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un));
|
|
|
|
struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un));
|
|
|
|
if (ipc_sockaddr == NULL) {
|
|
|
|
if (ipc_sockaddr == NULL) {
|
|
|
|
sway_abort("can't malloc ipc_sockaddr");
|
|
|
|
sway_abort("Can't allocate ipc_sockaddr");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ipc_sockaddr->sun_family = AF_UNIX;
|
|
|
|
ipc_sockaddr->sun_family = AF_UNIX;
|
|
|
@ -119,7 +119,7 @@ struct sockaddr_un *ipc_user_sockaddr(void) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (path_size <= snprintf(ipc_sockaddr->sun_path, path_size,
|
|
|
|
if (path_size <= snprintf(ipc_sockaddr->sun_path, path_size,
|
|
|
|
"%s/sway-ipc.%i.%i.sock", dir, getuid(), getpid())) {
|
|
|
|
"%s/sway-ipc.%i.%i.sock", dir, getuid(), getpid())) {
|
|
|
|
sway_abort("socket path won't fit into ipc_sockaddr->sun_path");
|
|
|
|
sway_abort("Socket path won't fit into ipc_sockaddr->sun_path");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ipc_sockaddr;
|
|
|
|
return ipc_sockaddr;
|
|
|
@ -148,13 +148,13 @@ int ipc_handle_connection(int fd, uint32_t mask, void *data) {
|
|
|
|
|
|
|
|
|
|
|
|
int client_fd = accept(ipc_socket, NULL, NULL);
|
|
|
|
int client_fd = accept(ipc_socket, NULL, NULL);
|
|
|
|
if (client_fd == -1) {
|
|
|
|
if (client_fd == -1) {
|
|
|
|
sway_log_errno(L_INFO, "Unable to accept IPC client connection");
|
|
|
|
sway_log_errno(L_ERROR, "Unable to accept IPC client connection");
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int flags;
|
|
|
|
int flags;
|
|
|
|
if ((flags=fcntl(client_fd, F_GETFD)) == -1 || fcntl(client_fd, F_SETFD, flags|FD_CLOEXEC) == -1) {
|
|
|
|
if ((flags=fcntl(client_fd, F_GETFD)) == -1 || fcntl(client_fd, F_SETFD, flags|FD_CLOEXEC) == -1) {
|
|
|
|
sway_log_errno(L_INFO, "Unable to set CLOEXEC on IPC client socket");
|
|
|
|
sway_log_errno(L_ERROR, "Unable to set CLOEXEC on IPC client socket");
|
|
|
|
close(client_fd);
|
|
|
|
close(client_fd);
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -171,6 +171,11 @@ int ipc_handle_connection(int fd, uint32_t mask, void *data) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
struct ipc_client* client = malloc(sizeof(struct ipc_client));
|
|
|
|
struct ipc_client* client = malloc(sizeof(struct ipc_client));
|
|
|
|
|
|
|
|
if (!client) {
|
|
|
|
|
|
|
|
sway_log(L_ERROR, "Unable to allocate ipc client");
|
|
|
|
|
|
|
|
close(client_fd);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
client->payload_length = 0;
|
|
|
|
client->payload_length = 0;
|
|
|
|
client->fd = client_fd;
|
|
|
|
client->fd = client_fd;
|
|
|
|
client->subscribed_events = 0;
|
|
|
|
client->subscribed_events = 0;
|
|
|
@ -187,7 +192,7 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data) {
|
|
|
|
struct ipc_client *client = data;
|
|
|
|
struct ipc_client *client = data;
|
|
|
|
|
|
|
|
|
|
|
|
if (mask & WLC_EVENT_ERROR) {
|
|
|
|
if (mask & WLC_EVENT_ERROR) {
|
|
|
|
sway_log(L_INFO, "IPC Client socket error, removing client");
|
|
|
|
sway_log(L_ERROR, "IPC Client socket error, removing client");
|
|
|
|
client->fd = -1;
|
|
|
|
client->fd = -1;
|
|
|
|
ipc_client_disconnect(client);
|
|
|
|
ipc_client_disconnect(client);
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
@ -291,6 +296,12 @@ void ipc_get_pixels(wlc_handle output) {
|
|
|
|
char response_header[9];
|
|
|
|
char response_header[9];
|
|
|
|
memset(response_header, 0, sizeof(response_header));
|
|
|
|
memset(response_header, 0, sizeof(response_header));
|
|
|
|
char *data = malloc(sizeof(response_header) + size->w * size->h * 4);
|
|
|
|
char *data = malloc(sizeof(response_header) + size->w * size->h * 4);
|
|
|
|
|
|
|
|
if (!data) {
|
|
|
|
|
|
|
|
sway_log(L_ERROR, "Unable to allocate pixels for get_pixels");
|
|
|
|
|
|
|
|
ipc_client_disconnect(client);
|
|
|
|
|
|
|
|
free(req);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
|
|
|
wlc_pixels_read(WLC_RGBA8888, &req->geo, &g_out, data + sizeof(response_header));
|
|
|
|
wlc_pixels_read(WLC_RGBA8888, &req->geo, &g_out, data + sizeof(response_header));
|
|
|
|
|
|
|
|
|
|
|
|
response_header[0] = 1;
|
|
|
|
response_header[0] = 1;
|
|
|
@ -318,7 +329,7 @@ void ipc_client_handle_command(struct ipc_client *client) {
|
|
|
|
|
|
|
|
|
|
|
|
char *buf = malloc(client->payload_length + 1);
|
|
|
|
char *buf = malloc(client->payload_length + 1);
|
|
|
|
if (!buf) {
|
|
|
|
if (!buf) {
|
|
|
|
sway_log_errno(L_INFO, "Out of memory");
|
|
|
|
sway_log_errno(L_INFO, "Unable to allocate IPC payload");
|
|
|
|
ipc_client_disconnect(client);
|
|
|
|
ipc_client_disconnect(client);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -497,6 +508,10 @@ void ipc_client_handle_command(struct ipc_client *client) {
|
|
|
|
goto exit_cleanup;
|
|
|
|
goto exit_cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
struct get_pixels_request *req = malloc(sizeof(struct get_pixels_request));
|
|
|
|
struct get_pixels_request *req = malloc(sizeof(struct get_pixels_request));
|
|
|
|
|
|
|
|
if (!req) {
|
|
|
|
|
|
|
|
sway_log(L_ERROR, "Unable to allocate get_pixels request");
|
|
|
|
|
|
|
|
goto exit_cleanup;
|
|
|
|
|
|
|
|
}
|
|
|
|
req->client = client;
|
|
|
|
req->client = client;
|
|
|
|
req->output = output->handle;
|
|
|
|
req->output = output->handle;
|
|
|
|
req->geo = g;
|
|
|
|
req->geo = g;
|
|
|
|