Normalize log texts a bit
This commit is contained in:
parent
79b90788bd
commit
e4c28227ec
5 changed files with 135 additions and 135 deletions
|
@ -141,12 +141,12 @@ static int get_tty_path(int tty, char path[static TTYPATHLEN]) {
|
||||||
int terminal_open(int vt) {
|
int terminal_open(int vt) {
|
||||||
char path[TTYPATHLEN];
|
char path[TTYPATHLEN];
|
||||||
if (get_tty_path(vt, path) == -1) {
|
if (get_tty_path(vt, path) == -1) {
|
||||||
log_errorf("could not generate tty path: %s", strerror(errno));
|
log_errorf("Could not generate tty path: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int fd = open(path, O_RDWR | O_NOCTTY);
|
int fd = open(path, O_RDWR | O_NOCTTY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
log_errorf("could not open target tty: %s", strerror(errno));
|
log_errorf("Could not open target tty: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return fd;
|
return fd;
|
||||||
|
@ -158,7 +158,7 @@ int terminal_current_vt(int fd) {
|
||||||
int res = ioctl(fd, VT_GETSTATE, &st);
|
int res = ioctl(fd, VT_GETSTATE, &st);
|
||||||
close(fd);
|
close(fd);
|
||||||
if (res == -1) {
|
if (res == -1) {
|
||||||
log_errorf("could not retrieve VT state: %s", strerror(errno));
|
log_errorf("Could not retrieve VT state: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return st.v_active;
|
return st.v_active;
|
||||||
|
@ -167,12 +167,12 @@ int terminal_current_vt(int fd) {
|
||||||
int res = ioctl(fd, VT_GETACTIVE, &vt);
|
int res = ioctl(fd, VT_GETACTIVE, &vt);
|
||||||
close(fd);
|
close(fd);
|
||||||
if (res == -1) {
|
if (res == -1) {
|
||||||
log_errorf("could not retrieve VT state: %s", strerror(errno));
|
log_errorf("Could not retrieve VT state: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vt == -1) {
|
if (vt == -1) {
|
||||||
log_errorf("invalid vt: %d", vt);
|
log_errorf("Invalid VT: %d", vt);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return vt;
|
return vt;
|
||||||
|
@ -182,7 +182,7 @@ int terminal_current_vt(int fd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int terminal_set_process_switching(int fd, bool enable) {
|
int terminal_set_process_switching(int fd, bool enable) {
|
||||||
log_debugf("setting process switching to %d", enable);
|
log_debugf("Setting process switching to %d", enable);
|
||||||
struct vt_mode mode = {
|
struct vt_mode mode = {
|
||||||
.mode = enable ? VT_PROCESS : VT_AUTO,
|
.mode = enable ? VT_PROCESS : VT_AUTO,
|
||||||
.waitv = 0,
|
.waitv = 0,
|
||||||
|
@ -192,7 +192,7 @@ int terminal_set_process_switching(int fd, bool enable) {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (ioctl(fd, VT_SETMODE, &mode) == -1) {
|
if (ioctl(fd, VT_SETMODE, &mode) == -1) {
|
||||||
log_errorf("could not set VT mode to %s process switching: %s",
|
log_errorf("Could not set VT mode to %s process switching: %s",
|
||||||
enable ? "enable" : "disable", strerror(errno));
|
enable ? "enable" : "disable", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -200,9 +200,9 @@ int terminal_set_process_switching(int fd, bool enable) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int terminal_switch_vt(int fd, int vt) {
|
int terminal_switch_vt(int fd, int vt) {
|
||||||
log_debugf("switching to VT %d", vt);
|
log_debugf("Switching to VT %d", vt);
|
||||||
if (ioctl(fd, VT_ACTIVATE, vt) == -1) {
|
if (ioctl(fd, VT_ACTIVATE, vt) == -1) {
|
||||||
log_errorf("could not activate VT %d: %s", vt, strerror(errno));
|
log_errorf("Could not activate VT %d: %s", vt, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,9 +210,9 @@ int terminal_switch_vt(int fd, int vt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int terminal_ack_release(int fd) {
|
int terminal_ack_release(int fd) {
|
||||||
log_debug("acking VT release");
|
log_debug("Acking VT release");
|
||||||
if (ioctl(fd, VT_RELDISP, 1) == -1) {
|
if (ioctl(fd, VT_RELDISP, 1) == -1) {
|
||||||
log_errorf("could not ack VT release: %s", strerror(errno));
|
log_errorf("Could not ack VT release: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,9 +220,9 @@ int terminal_ack_release(int fd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int terminal_ack_acquire(int fd) {
|
int terminal_ack_acquire(int fd) {
|
||||||
log_debug("acking VT acquire");
|
log_debug("Acking VT acquire");
|
||||||
if (ioctl(fd, VT_RELDISP, VT_ACKACQ) == -1) {
|
if (ioctl(fd, VT_RELDISP, VT_ACKACQ) == -1) {
|
||||||
log_errorf("could not ack VT acquire: %s", strerror(errno));
|
log_errorf("Could not ack VT acquire: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,16 +230,16 @@ int terminal_ack_acquire(int fd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int terminal_set_keyboard(int fd, bool enable) {
|
int terminal_set_keyboard(int fd, bool enable) {
|
||||||
log_debugf("setting KD keyboard state to %d", enable);
|
log_debugf("Setting KD keyboard state to %d", enable);
|
||||||
if (ioctl(fd, KDSKBMODE, enable ? K_ENABLE : K_DISABLE) == -1) {
|
if (ioctl(fd, KDSKBMODE, enable ? K_ENABLE : K_DISABLE) == -1) {
|
||||||
log_errorf("could not set KD keyboard mode to %s: %s",
|
log_errorf("Could not set KD keyboard mode to %s: %s",
|
||||||
enable ? "enabled" : "disabled", strerror(errno));
|
enable ? "enabled" : "disabled", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#if defined(__FreeBSD__)
|
#if defined(__FreeBSD__)
|
||||||
struct termios tios;
|
struct termios tios;
|
||||||
if (tcgetattr(fd, &tios) == -1) {
|
if (tcgetattr(fd, &tios) == -1) {
|
||||||
log_errorf("could not set get terminal mode: %s", strerror(errno));
|
log_errorf("Could not set get terminal mode: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (enable) {
|
if (enable) {
|
||||||
|
@ -248,7 +248,7 @@ int terminal_set_keyboard(int fd, bool enable) {
|
||||||
cfmakeraw(&tios);
|
cfmakeraw(&tios);
|
||||||
}
|
}
|
||||||
if (tcsetattr(fd, TCSAFLUSH, &tios) == -1) {
|
if (tcsetattr(fd, TCSAFLUSH, &tios) == -1) {
|
||||||
log_errorf("could not set terminal mode to %s: %s", enable ? "sane" : "raw",
|
log_errorf("Could not set terminal mode to %s: %s", enable ? "sane" : "raw",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -257,9 +257,9 @@ int terminal_set_keyboard(int fd, bool enable) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int terminal_set_graphics(int fd, bool enable) {
|
int terminal_set_graphics(int fd, bool enable) {
|
||||||
log_debugf("setting KD graphics state to %d", enable);
|
log_debugf("Setting KD graphics state to %d", enable);
|
||||||
if (ioctl(fd, KDSETMODE, enable ? KD_GRAPHICS : KD_TEXT) == -1) {
|
if (ioctl(fd, KDSETMODE, enable ? KD_GRAPHICS : KD_TEXT) == -1) {
|
||||||
log_errorf("could not set KD graphics mode to %s: %s", enable ? "graphics" : "text",
|
log_errorf("Could not set KD graphics mode to %s: %s", enable ? "graphics" : "text",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,7 @@ static int client_send_error(struct client *client, int error_code) {
|
||||||
|
|
||||||
if (connection_put(&client->connection, &errheader, sizeof errheader) == -1 ||
|
if (connection_put(&client->connection, &errheader, sizeof errheader) == -1 ||
|
||||||
connection_put(&client->connection, &errmsg, sizeof errmsg) == -1) {
|
connection_put(&client->connection, &errmsg, sizeof errmsg) == -1) {
|
||||||
log_error("could not send error to client");
|
log_errorf("Could not send error to client: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -135,18 +135,18 @@ static char *client_get_seat_name(struct client *client) {
|
||||||
static int handle_open_seat(struct client *client) {
|
static int handle_open_seat(struct client *client) {
|
||||||
char *seat_name = client_get_seat_name(client);
|
char *seat_name = client_get_seat_name(client);
|
||||||
if (seat_name == NULL) {
|
if (seat_name == NULL) {
|
||||||
log_error("could not get name of target seat");
|
log_error("Could not get name of target seat");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct seat *seat = server_get_seat(client->server, seat_name);
|
struct seat *seat = server_get_seat(client->server, seat_name);
|
||||||
if (seat == NULL) {
|
if (seat == NULL) {
|
||||||
log_error("unable to find seat by name");
|
log_errorf("Could not find seat named %s", seat_name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat_add_client(seat, client) == -1) {
|
if (seat_add_client(seat, client) == -1) {
|
||||||
log_errorf("unable to add client to target seat: %s", strerror(errno));
|
log_errorf("Could not add client to target seat: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
linked_list_remove(&client->link);
|
linked_list_remove(&client->link);
|
||||||
|
@ -165,7 +165,7 @@ static int handle_open_seat(struct client *client) {
|
||||||
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
||||||
connection_put(&client->connection, &rmsg, sizeof rmsg) == -1 ||
|
connection_put(&client->connection, &rmsg, sizeof rmsg) == -1 ||
|
||||||
connection_put(&client->connection, seat_name, seat_name_len) == -1) {
|
connection_put(&client->connection, seat_name, seat_name_len) == -1) {
|
||||||
log_errorf("unable to write response: %s", strerror(errno));
|
log_errorf("Could not write response: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,13 +175,13 @@ static int handle_open_seat(struct client *client) {
|
||||||
|
|
||||||
static int handle_close_seat(struct client *client) {
|
static int handle_close_seat(struct client *client) {
|
||||||
if (client->seat == NULL) {
|
if (client->seat == NULL) {
|
||||||
log_error("protocol error: no seat associated with client");
|
log_error("Protocol error: no seat associated with client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
linked_list_remove(&client->link);
|
linked_list_remove(&client->link);
|
||||||
if (seat_remove_client(client) == -1) {
|
if (seat_remove_client(client) == -1) {
|
||||||
log_error("unable to remove client from seat");
|
log_error("Could not remove client from seat");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
linked_list_insert(&client->server->idle_clients, &client->link);
|
linked_list_insert(&client->server->idle_clients, &client->link);
|
||||||
|
@ -192,7 +192,7 @@ static int handle_close_seat(struct client *client) {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (connection_put(&client->connection, &header, sizeof header) == -1) {
|
if (connection_put(&client->connection, &header, sizeof header) == -1) {
|
||||||
log_errorf("unable to write response: %s", strerror(errno));
|
log_errorf("Could not write response: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,25 +201,25 @@ static int handle_close_seat(struct client *client) {
|
||||||
|
|
||||||
static int handle_open_device(struct client *client, char *path) {
|
static int handle_open_device(struct client *client, char *path) {
|
||||||
if (client->seat == NULL) {
|
if (client->seat == NULL) {
|
||||||
log_error("protocol error: no seat associated with client");
|
log_error("Protocol error: no seat associated with client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct seat_device *device = seat_open_device(client, path);
|
struct seat_device *device = seat_open_device(client, path);
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
log_errorf("could not open device: %s", strerror(errno));
|
log_errorf("Could not open device: %s", strerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dupfd = dup(device->fd);
|
int dupfd = dup(device->fd);
|
||||||
if (dupfd == -1) {
|
if (dupfd == -1) {
|
||||||
log_errorf("could not dup fd: %s", strerror(errno));
|
log_errorf("Could not dup fd: %s", strerror(errno));
|
||||||
seat_close_device(client, device);
|
seat_close_device(client, device);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connection_put_fd(&client->connection, dupfd) == -1) {
|
if (connection_put_fd(&client->connection, dupfd) == -1) {
|
||||||
log_errorf("unable to queue fd for sending: %s", strerror(errno));
|
log_errorf("Could not queue fd for sending: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ static int handle_open_device(struct client *client, char *path) {
|
||||||
|
|
||||||
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
||||||
connection_put(&client->connection, &msg, sizeof msg) == -1) {
|
connection_put(&client->connection, &msg, sizeof msg) == -1) {
|
||||||
log_errorf("unable to write response: %s", strerror(errno));
|
log_errorf("Could not write response: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,19 +245,19 @@ fail:
|
||||||
|
|
||||||
static int handle_close_device(struct client *client, int device_id) {
|
static int handle_close_device(struct client *client, int device_id) {
|
||||||
if (client->seat == NULL) {
|
if (client->seat == NULL) {
|
||||||
log_error("protocol error: no seat associated with client");
|
log_error("Protocol error: no seat associated with client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct seat_device *device = seat_find_device(client, device_id);
|
struct seat_device *device = seat_find_device(client, device_id);
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
log_error("no such device");
|
log_error("No such device");
|
||||||
errno = EBADF;
|
errno = EBADF;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat_close_device(client, device) == -1) {
|
if (seat_close_device(client, device) == -1) {
|
||||||
log_errorf("could not close device: %s", strerror(errno));
|
log_errorf("Could not close device: %s", strerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ static int handle_close_device(struct client *client, int device_id) {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (connection_put(&client->connection, &header, sizeof header) == -1) {
|
if (connection_put(&client->connection, &header, sizeof header) == -1) {
|
||||||
log_errorf("unable to write response: %s", strerror(errno));
|
log_errorf("Could not write response: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ fail:
|
||||||
|
|
||||||
static int handle_switch_session(struct client *client, int session) {
|
static int handle_switch_session(struct client *client, int session) {
|
||||||
if (client->seat == NULL) {
|
if (client->seat == NULL) {
|
||||||
log_error("protocol error: no seat associated with client");
|
log_error("Protocol error: no seat associated with client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ error:
|
||||||
|
|
||||||
static int handle_disable_seat(struct client *client) {
|
static int handle_disable_seat(struct client *client) {
|
||||||
if (client->seat == NULL) {
|
if (client->seat == NULL) {
|
||||||
log_error("protocol error: no seat associated with client");
|
log_error("Protocol error: no seat associated with client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ static int client_handle_opcode(struct client *client, uint16_t opcode, size_t s
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case CLIENT_OPEN_SEAT: {
|
case CLIENT_OPEN_SEAT: {
|
||||||
if (size != 0) {
|
if (size != 0) {
|
||||||
log_error("protocol error: invalid open_seat message");
|
log_error("Protocol error: invalid open_seat message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
res = handle_open_seat(client);
|
res = handle_open_seat(client);
|
||||||
|
@ -322,7 +322,7 @@ static int client_handle_opcode(struct client *client, uint16_t opcode, size_t s
|
||||||
}
|
}
|
||||||
case CLIENT_CLOSE_SEAT: {
|
case CLIENT_CLOSE_SEAT: {
|
||||||
if (size != 0) {
|
if (size != 0) {
|
||||||
log_error("protocol error: invalid close_seat message");
|
log_error("Protocol error: invalid close_seat message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
res = handle_close_seat(client);
|
res = handle_close_seat(client);
|
||||||
|
@ -333,11 +333,11 @@ static int client_handle_opcode(struct client *client, uint16_t opcode, size_t s
|
||||||
struct proto_client_open_device msg;
|
struct proto_client_open_device msg;
|
||||||
if (sizeof msg > size || connection_get(&client->connection, &msg, sizeof msg) == -1 ||
|
if (sizeof msg > size || connection_get(&client->connection, &msg, sizeof msg) == -1 ||
|
||||||
sizeof msg + msg.path_len > size || msg.path_len > MAX_PATH_LEN) {
|
sizeof msg + msg.path_len > size || msg.path_len > MAX_PATH_LEN) {
|
||||||
log_error("protocol error: invalid open_device message");
|
log_error("Protocol error: invalid open_device message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (connection_get(&client->connection, path, msg.path_len) == -1) {
|
if (connection_get(&client->connection, path, msg.path_len) == -1) {
|
||||||
log_error("protocol error: invalid open_device message");
|
log_error("Protocol error: invalid open_device message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ static int client_handle_opcode(struct client *client, uint16_t opcode, size_t s
|
||||||
case CLIENT_CLOSE_DEVICE: {
|
case CLIENT_CLOSE_DEVICE: {
|
||||||
struct proto_client_close_device msg;
|
struct proto_client_close_device msg;
|
||||||
if (sizeof msg > size || connection_get(&client->connection, &msg, sizeof msg) == -1) {
|
if (sizeof msg > size || connection_get(&client->connection, &msg, sizeof msg) == -1) {
|
||||||
log_error("protocol error: invalid close_device message");
|
log_error("Protocol error: invalid close_device message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +357,7 @@ static int client_handle_opcode(struct client *client, uint16_t opcode, size_t s
|
||||||
case CLIENT_SWITCH_SESSION: {
|
case CLIENT_SWITCH_SESSION: {
|
||||||
struct proto_client_switch_session msg;
|
struct proto_client_switch_session msg;
|
||||||
if (sizeof msg > size || connection_get(&client->connection, &msg, sizeof msg) == -1) {
|
if (sizeof msg > size || connection_get(&client->connection, &msg, sizeof msg) == -1) {
|
||||||
log_error("protocol error: invalid switch_session message");
|
log_error("Protocol error: invalid switch_session message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,14 +366,14 @@ static int client_handle_opcode(struct client *client, uint16_t opcode, size_t s
|
||||||
}
|
}
|
||||||
case CLIENT_DISABLE_SEAT: {
|
case CLIENT_DISABLE_SEAT: {
|
||||||
if (size != 0) {
|
if (size != 0) {
|
||||||
log_error("protocol error: invalid disable_seat message");
|
log_error("Protocol error: invalid disable_seat message");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
res = handle_disable_seat(client);
|
res = handle_disable_seat(client);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
log_errorf("protocol error: unknown opcode: %d", opcode);
|
log_errorf("Protocol error: unknown opcode: %d", opcode);
|
||||||
res = -1;
|
res = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -390,7 +390,7 @@ int client_send_disable_seat(struct client *client) {
|
||||||
};
|
};
|
||||||
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
||||||
connection_flush(&client->connection) == -1) {
|
connection_flush(&client->connection) == -1) {
|
||||||
log_error("unable to send event");
|
log_errorf("Could not send event: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -403,7 +403,7 @@ int client_send_enable_seat(struct client *client) {
|
||||||
};
|
};
|
||||||
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
if (connection_put(&client->connection, &header, sizeof header) == -1 ||
|
||||||
connection_flush(&client->connection) == -1) {
|
connection_flush(&client->connection) == -1) {
|
||||||
log_error("unable to send event");
|
log_errorf("Could not send event: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -414,18 +414,18 @@ int client_handle_connection(int fd, uint32_t mask, void *data) {
|
||||||
|
|
||||||
struct client *client = data;
|
struct client *client = data;
|
||||||
if (mask & EVENT_ERROR) {
|
if (mask & EVENT_ERROR) {
|
||||||
log_error("connection error");
|
log_error("Connection error");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
if (mask & EVENT_HANGUP) {
|
if (mask & EVENT_HANGUP) {
|
||||||
log_info("client disconnected");
|
log_info("Client disconnected");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mask & EVENT_WRITABLE) {
|
if (mask & EVENT_WRITABLE) {
|
||||||
int len = connection_flush(&client->connection);
|
int len = connection_flush(&client->connection);
|
||||||
if (len == -1 && errno != EAGAIN) {
|
if (len == -1 && errno != EAGAIN) {
|
||||||
log_error("could not flush client connection");
|
log_errorf("Could not flush client connection: %s", strerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
} else if (len >= 0) {
|
} else if (len >= 0) {
|
||||||
event_source_fd_update(client->event_source, EVENT_READABLE);
|
event_source_fd_update(client->event_source, EVENT_READABLE);
|
||||||
|
@ -434,8 +434,12 @@ int client_handle_connection(int fd, uint32_t mask, void *data) {
|
||||||
|
|
||||||
if (mask & EVENT_READABLE) {
|
if (mask & EVENT_READABLE) {
|
||||||
int len = connection_read(&client->connection);
|
int len = connection_read(&client->connection);
|
||||||
if (len == 0 || (len == -1 && errno != EAGAIN)) {
|
if (len == -1 && errno != EAGAIN) {
|
||||||
log_error("could not read client connection");
|
log_errorf("Could not read client connection: %s", strerror(errno));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (len == 0) {
|
||||||
|
log_error("Could not read client connection: zero-length read");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
128
seatd/seat.c
128
seatd/seat.c
|
@ -36,9 +36,9 @@ struct seat *seat_create(const char *seat_name, bool vt_bound) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (vt_bound) {
|
if (vt_bound) {
|
||||||
log_infof("created VT-bound seat '%s'", seat_name);
|
log_infof("Created VT-bound seat %s", seat_name);
|
||||||
} else {
|
} else {
|
||||||
log_infof("created seat '%s'", seat_name);
|
log_infof("Created seat %s", seat_name);
|
||||||
}
|
}
|
||||||
return seat;
|
return seat;
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ void seat_destroy(struct seat *seat) {
|
||||||
static void seat_update_vt(struct seat *seat) {
|
static void seat_update_vt(struct seat *seat) {
|
||||||
int tty0fd = terminal_open(0);
|
int tty0fd = terminal_open(0);
|
||||||
if (tty0fd == -1) {
|
if (tty0fd == -1) {
|
||||||
log_errorf("unable to open tty0: %s", strerror(errno));
|
log_errorf("Could not open tty0 to update VT: %s", strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
seat->cur_vt = terminal_current_vt(tty0fd);
|
seat->cur_vt = terminal_current_vt(tty0fd);
|
||||||
|
@ -74,7 +74,7 @@ static int vt_open(struct seat *seat, int vt) {
|
||||||
}
|
}
|
||||||
seat->cur_ttyfd = terminal_open(vt);
|
seat->cur_ttyfd = terminal_open(vt);
|
||||||
if (seat->cur_ttyfd == -1) {
|
if (seat->cur_ttyfd == -1) {
|
||||||
log_errorf("could not open terminal for vt %d: %s", vt, strerror(errno));
|
log_errorf("Could not open terminal for VT %d: %s", vt, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ static void vt_close(struct seat *seat) {
|
||||||
static int vt_close_num(int vt) {
|
static int vt_close_num(int vt) {
|
||||||
int ttyfd = terminal_open(vt);
|
int ttyfd = terminal_open(vt);
|
||||||
if (ttyfd == -1) {
|
if (ttyfd == -1) {
|
||||||
log_errorf("could not open terminal %s", strerror(errno));
|
log_errorf("Could not open terminal to clean up VT %d: %s", vt, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
vt_close_fd(ttyfd);
|
vt_close_fd(ttyfd);
|
||||||
|
@ -114,7 +114,7 @@ static int vt_close_num(int vt) {
|
||||||
static int vt_switch(struct seat *seat, int vt) {
|
static int vt_switch(struct seat *seat, int vt) {
|
||||||
int ttyfd = terminal_open(seat->cur_vt);
|
int ttyfd = terminal_open(seat->cur_vt);
|
||||||
if (ttyfd == -1) {
|
if (ttyfd == -1) {
|
||||||
log_errorf("could not open terminal: %s", strerror(errno));
|
log_errorf("Could not open terminal to switch to VT %d: %s", vt, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
terminal_set_process_switching(ttyfd, true);
|
terminal_set_process_switching(ttyfd, true);
|
||||||
|
@ -126,7 +126,7 @@ static int vt_switch(struct seat *seat, int vt) {
|
||||||
static int vt_ack(struct seat *seat, bool release) {
|
static int vt_ack(struct seat *seat, bool release) {
|
||||||
int tty0fd = terminal_open(seat->cur_vt);
|
int tty0fd = terminal_open(seat->cur_vt);
|
||||||
if (tty0fd == -1) {
|
if (tty0fd == -1) {
|
||||||
log_errorf("unable to open tty0: %s", strerror(errno));
|
log_errorf("Could not open tty0 to ack VT signal: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (release) {
|
if (release) {
|
||||||
|
@ -143,19 +143,19 @@ int seat_add_client(struct seat *seat, struct client *client) {
|
||||||
assert(client);
|
assert(client);
|
||||||
|
|
||||||
if (client->seat != NULL) {
|
if (client->seat != NULL) {
|
||||||
log_error("cannot add client: client is already a member of a seat");
|
log_error("Could not add client: client is already a member of a seat");
|
||||||
errno = EBUSY;
|
errno = EBUSY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat->vt_bound && seat->active_client != NULL) {
|
if (seat->vt_bound && seat->active_client != NULL) {
|
||||||
log_error("cannot add client: seat is VT-bound and an active client already exists");
|
log_error("Could not add client: seat is VT-bound and has an active client");
|
||||||
errno = EBUSY;
|
errno = EBUSY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client->session != -1) {
|
if (client->session != -1) {
|
||||||
log_error("cannot add client: client cannot be reused");
|
log_error("Could not add client: client cannot be reused");
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ int seat_add_client(struct seat *seat, struct client *client) {
|
||||||
if (seat->vt_bound) {
|
if (seat->vt_bound) {
|
||||||
seat_update_vt(seat);
|
seat_update_vt(seat);
|
||||||
if (seat->cur_vt == -1) {
|
if (seat->cur_vt == -1) {
|
||||||
log_error("could not determine VT for client");
|
log_error("Could not determine VT for client");
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ int seat_add_client(struct seat *seat, struct client *client) {
|
||||||
}
|
}
|
||||||
|
|
||||||
client->seat = seat;
|
client->seat = seat;
|
||||||
log_infof("added client %d", client->session);
|
log_infof("Added client %d to %s", client->session, seat->seat_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ int seat_remove_client(struct client *client) {
|
||||||
seat_close_client(client);
|
seat_close_client(client);
|
||||||
|
|
||||||
client->seat = NULL;
|
client->seat = NULL;
|
||||||
log_infof("removed client %d", client->session);
|
log_infof("Removed client %d from %s", client->session, seat->seat_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -222,8 +222,10 @@ struct seat_device *seat_open_device(struct client *client, const char *path) {
|
||||||
assert(strlen(path) > 0);
|
assert(strlen(path) > 0);
|
||||||
struct seat *seat = client->seat;
|
struct seat *seat = client->seat;
|
||||||
|
|
||||||
|
log_debugf("Opening device %s for client %d on %s", path, client->session, seat->seat_name);
|
||||||
|
|
||||||
if (client->state != CLIENT_ACTIVE) {
|
if (client->state != CLIENT_ACTIVE) {
|
||||||
log_error("client is not active");
|
log_error("Could open device: client is not active");
|
||||||
errno = EPERM;
|
errno = EPERM;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -231,7 +233,7 @@ struct seat_device *seat_open_device(struct client *client, const char *path) {
|
||||||
|
|
||||||
char sanitized_path[PATH_MAX];
|
char sanitized_path[PATH_MAX];
|
||||||
if (realpath(path, sanitized_path) == NULL) {
|
if (realpath(path, sanitized_path) == NULL) {
|
||||||
log_errorf("invalid path '%s': %s", path, strerror(errno));
|
log_errorf("Could not canonicalize path %s: %s", path, strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +243,7 @@ struct seat_device *seat_open_device(struct client *client, const char *path) {
|
||||||
} else if (path_is_drm(sanitized_path)) {
|
} else if (path_is_drm(sanitized_path)) {
|
||||||
type = SEAT_DEVICE_TYPE_DRM;
|
type = SEAT_DEVICE_TYPE_DRM;
|
||||||
} else {
|
} else {
|
||||||
log_errorf("invalid path '%s'", sanitized_path);
|
log_errorf("%s is not a supported device type ", sanitized_path);
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -266,34 +268,34 @@ struct seat_device *seat_open_device(struct client *client, const char *path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device_count >= MAX_SEAT_DEVICES) {
|
if (device_count >= MAX_SEAT_DEVICES) {
|
||||||
log_error("max seat devices exceeded");
|
log_error("Client exceeded max seat devices");
|
||||||
errno = EMFILE;
|
errno = EMFILE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = open(sanitized_path, O_RDWR | O_NOCTTY | O_NOFOLLOW | O_CLOEXEC | O_NONBLOCK);
|
int fd = open(sanitized_path, O_RDWR | O_NOCTTY | O_NOFOLLOW | O_CLOEXEC | O_NONBLOCK);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
log_errorf("could not open file: %s", strerror(errno));
|
log_errorf("Could not open file: %s", strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SEAT_DEVICE_TYPE_DRM:
|
case SEAT_DEVICE_TYPE_DRM:
|
||||||
if (drm_set_master(fd) == -1) {
|
if (drm_set_master(fd) == -1) {
|
||||||
log_errorf("could not make device fd drm master: %s", strerror(errno));
|
log_errorf("Could not make device fd drm master: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SEAT_DEVICE_TYPE_EVDEV:
|
case SEAT_DEVICE_TYPE_EVDEV:
|
||||||
// Nothing to do here
|
// Nothing to do here
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log_error("invalid seat device type");
|
log_error("Invalid seat device type");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
device = calloc(1, sizeof(struct seat_device));
|
device = calloc(1, sizeof(struct seat_device));
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
log_errorf("could not alloc device for '%s': %s", sanitized_path, strerror(errno));
|
log_errorf("Allocation failed: %s", strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -301,7 +303,7 @@ struct seat_device *seat_open_device(struct client *client, const char *path) {
|
||||||
|
|
||||||
device->path = strdup(sanitized_path);
|
device->path = strdup(sanitized_path);
|
||||||
if (device->path == NULL) {
|
if (device->path == NULL) {
|
||||||
log_errorf("could not dup path for '%s': %s", sanitized_path, strerror(errno));
|
log_errorf("Allocation failed: %s", strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
free(device);
|
free(device);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -315,8 +317,6 @@ struct seat_device *seat_open_device(struct client *client, const char *path) {
|
||||||
linked_list_insert(&client->devices, &device->link);
|
linked_list_insert(&client->devices, &device->link);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
log_debugf("seat: '%s', client: %d, path: '%s', device_id: %d, ref_cnt: %d",
|
|
||||||
seat->seat_name, client->session, path, device_id, device->ref_cnt);
|
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
@ -330,18 +330,18 @@ static int seat_deactivate_device(struct seat_device *seat_device) {
|
||||||
switch (seat_device->type) {
|
switch (seat_device->type) {
|
||||||
case SEAT_DEVICE_TYPE_DRM:
|
case SEAT_DEVICE_TYPE_DRM:
|
||||||
if (drm_drop_master(seat_device->fd) == -1) {
|
if (drm_drop_master(seat_device->fd) == -1) {
|
||||||
log_errorf("could not revoke drm master on device fd: %s", strerror(errno));
|
log_errorf("Could not revoke drm master on device fd: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SEAT_DEVICE_TYPE_EVDEV:
|
case SEAT_DEVICE_TYPE_EVDEV:
|
||||||
if (evdev_revoke(seat_device->fd) == -1) {
|
if (evdev_revoke(seat_device->fd) == -1) {
|
||||||
log_errorf("could not revoke evdev on device fd: %s", strerror(errno));
|
log_errorf("Could not revoke evdev on device fd: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log_error("invalid seat device type");
|
log_error("Invalid seat device type");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
seat_device->active = false;
|
seat_device->active = false;
|
||||||
|
@ -353,9 +353,8 @@ int seat_close_device(struct client *client, struct seat_device *seat_device) {
|
||||||
assert(client->seat);
|
assert(client->seat);
|
||||||
assert(seat_device && seat_device->fd != -1);
|
assert(seat_device && seat_device->fd != -1);
|
||||||
|
|
||||||
log_debugf("seat: '%s', client: %d, path: '%s', device_id: %d, ref_cnt: %d",
|
log_debugf("Closing device %s for client %d on %s", seat_device->path, client->session,
|
||||||
client->seat->seat_name, client->session, seat_device->path,
|
client->seat->seat_name);
|
||||||
seat_device->device_id, seat_device->ref_cnt);
|
|
||||||
|
|
||||||
seat_device->ref_cnt--;
|
seat_device->ref_cnt--;
|
||||||
if (seat_device->ref_cnt > 0) {
|
if (seat_device->ref_cnt > 0) {
|
||||||
|
@ -383,7 +382,7 @@ static int seat_activate_device(struct client *client, struct seat_device *seat_
|
||||||
switch (seat_device->type) {
|
switch (seat_device->type) {
|
||||||
case SEAT_DEVICE_TYPE_DRM:
|
case SEAT_DEVICE_TYPE_DRM:
|
||||||
if (drm_set_master(seat_device->fd) == -1) {
|
if (drm_set_master(seat_device->fd) == -1) {
|
||||||
log_errorf("could not make device fd drm master: %s", strerror(errno));
|
log_errorf("Could not make device fd drm master: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
seat_device->active = true;
|
seat_device->active = true;
|
||||||
break;
|
break;
|
||||||
|
@ -391,7 +390,7 @@ static int seat_activate_device(struct client *client, struct seat_device *seat_
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
default:
|
default:
|
||||||
log_error("invalid seat device type");
|
log_error("Invalid seat device type");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,11 +406,11 @@ static int seat_activate(struct seat *seat) {
|
||||||
|
|
||||||
struct client *next_client = NULL;
|
struct client *next_client = NULL;
|
||||||
if (seat->next_client != NULL) {
|
if (seat->next_client != NULL) {
|
||||||
log_debug("activating next queued client");
|
log_debugf("Activating next queued client on %s", seat->seat_name);
|
||||||
next_client = seat->next_client;
|
next_client = seat->next_client;
|
||||||
seat->next_client = NULL;
|
seat->next_client = NULL;
|
||||||
} else if (linked_list_empty(&seat->clients)) {
|
} else if (linked_list_empty(&seat->clients)) {
|
||||||
log_info("no clients on seat to activate");
|
log_infof("No clients on %s to activate", seat->seat_name);
|
||||||
return -1;
|
return -1;
|
||||||
} else if (seat->vt_bound && seat->cur_vt == -1) {
|
} else if (seat->vt_bound && seat->cur_vt == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -420,16 +419,16 @@ static int seat_activate(struct seat *seat) {
|
||||||
elem = elem->next) {
|
elem = elem->next) {
|
||||||
struct client *client = (struct client *)elem;
|
struct client *client = (struct client *)elem;
|
||||||
if (client->session == seat->cur_vt) {
|
if (client->session == seat->cur_vt) {
|
||||||
log_debugf("activating client belonging to VT %d", seat->cur_vt);
|
log_debugf("Activating client belonging to VT %d", seat->cur_vt);
|
||||||
next_client = client;
|
next_client = client;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log_infof("no clients belonging to VT %d to activate", seat->cur_vt);
|
log_infof("No clients belonging to VT %d to activate", seat->cur_vt);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
log_debug("activating first client on seat");
|
log_debugf("Activating first client on %s", seat->seat_name);
|
||||||
next_client = (struct client *)seat->clients.next;
|
next_client = (struct client *)seat->clients.next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,21 +441,19 @@ int seat_open_client(struct seat *seat, struct client *client) {
|
||||||
assert(client);
|
assert(client);
|
||||||
|
|
||||||
if (client->state != CLIENT_NEW && client->state != CLIENT_DISABLED) {
|
if (client->state != CLIENT_NEW && client->state != CLIENT_DISABLED) {
|
||||||
log_errorf("could not enable client %d: client is not new or disabled",
|
log_error("Could not enable client: client is not new or disabled");
|
||||||
client->session);
|
|
||||||
errno = EALREADY;
|
errno = EALREADY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat->active_client != NULL) {
|
if (seat->active_client != NULL) {
|
||||||
log_errorf("could not enable client %d: seat already has active client",
|
log_error("Could not enable client: seat already has an active client");
|
||||||
client->session);
|
|
||||||
errno = EBUSY;
|
errno = EBUSY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat->vt_bound && vt_open(seat, client->session) == -1) {
|
if (seat->vt_bound && vt_open(seat, client->session) == -1) {
|
||||||
log_errorf("could not open VT for client %d", client->session);
|
log_error("Could not open VT for client");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -464,19 +461,18 @@ int seat_open_client(struct seat *seat, struct client *client) {
|
||||||
elem = elem->next) {
|
elem = elem->next) {
|
||||||
struct seat_device *device = (struct seat_device *)elem;
|
struct seat_device *device = (struct seat_device *)elem;
|
||||||
if (seat_activate_device(client, device) == -1) {
|
if (seat_activate_device(client, device) == -1) {
|
||||||
log_errorf("unable to activate '%s' for client %d: %s", device->path,
|
log_errorf("Could not activate %s: %s", device->path, strerror(errno));
|
||||||
client->session, strerror(errno));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client->state = CLIENT_ACTIVE;
|
client->state = CLIENT_ACTIVE;
|
||||||
seat->active_client = client;
|
seat->active_client = client;
|
||||||
if (client_send_enable_seat(client) == -1) {
|
if (client_send_enable_seat(client) == -1) {
|
||||||
log_errorf("could not send enable signal to client %d", client->session);
|
log_error("Could not send enable signal to client");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_infof("enabled client %d", client->session);
|
log_infof("Opened client %d on %s", client->session, seat->seat_name);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
@ -495,7 +491,7 @@ static int seat_close_client(struct client *client) {
|
||||||
while (!linked_list_empty(&client->devices)) {
|
while (!linked_list_empty(&client->devices)) {
|
||||||
struct seat_device *device = (struct seat_device *)client->devices.next;
|
struct seat_device *device = (struct seat_device *)client->devices.next;
|
||||||
if (seat_close_device(client, device) == -1) {
|
if (seat_close_device(client, device) == -1) {
|
||||||
log_errorf("unable to close '%s': %s", device->path, strerror(errno));
|
log_errorf("Could not close %s: %s", device->path, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,18 +505,18 @@ static int seat_close_client(struct client *client) {
|
||||||
if (was_current && seat->active_client == NULL) {
|
if (was_current && seat->active_client == NULL) {
|
||||||
// This client was current, but there were no clients
|
// This client was current, but there were no clients
|
||||||
// waiting to take this VT, so clean it up.
|
// waiting to take this VT, so clean it up.
|
||||||
log_debug("closing active VT");
|
log_debug("Closing active VT");
|
||||||
vt_close(seat);
|
vt_close(seat);
|
||||||
} else if (!was_current && client->state != CLIENT_CLOSED) {
|
} else if (!was_current && client->state != CLIENT_CLOSED) {
|
||||||
// This client was not current, but as the client was
|
// This client was not current, but as the client was
|
||||||
// running, we need to clean up the VT.
|
// running, we need to clean up the VT.
|
||||||
log_debug("closing inactive VT");
|
log_debug("Closing inactive VT");
|
||||||
vt_close_num(client->session);
|
vt_close_num(client->session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client->state = CLIENT_CLOSED;
|
client->state = CLIENT_CLOSED;
|
||||||
log_infof("closed client %d", client->session);
|
log_infof("Closed client %d on %s", client->session, seat->seat_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -532,7 +528,7 @@ static int seat_disable_client(struct client *client) {
|
||||||
struct seat *seat = client->seat;
|
struct seat *seat = client->seat;
|
||||||
|
|
||||||
if (client->state != CLIENT_ACTIVE) {
|
if (client->state != CLIENT_ACTIVE) {
|
||||||
log_error("client not active");
|
log_error("Could not disable client: client is not active");
|
||||||
errno = EBUSY;
|
errno = EBUSY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -546,17 +542,17 @@ static int seat_disable_client(struct client *client) {
|
||||||
elem = elem->next) {
|
elem = elem->next) {
|
||||||
struct seat_device *device = (struct seat_device *)elem;
|
struct seat_device *device = (struct seat_device *)elem;
|
||||||
if (seat_deactivate_device(device) == -1) {
|
if (seat_deactivate_device(device) == -1) {
|
||||||
log_errorf("unable to deactivate '%s': %s", device->path, strerror(errno));
|
log_errorf("Could not deactivate %s: %s", device->path, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client->state = CLIENT_PENDING_DISABLE;
|
client->state = CLIENT_PENDING_DISABLE;
|
||||||
if (client_send_disable_seat(seat->active_client) == -1) {
|
if (client_send_disable_seat(seat->active_client) == -1) {
|
||||||
log_error("could not send disable event");
|
log_error("Could not send disable event");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_infof("disabling client %d", client->session);
|
log_infof("Disabling client %d on %s", client->session, seat->seat_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -566,13 +562,13 @@ int seat_ack_disable_client(struct client *client) {
|
||||||
|
|
||||||
struct seat *seat = client->seat;
|
struct seat *seat = client->seat;
|
||||||
if (client->state != CLIENT_PENDING_DISABLE) {
|
if (client->state != CLIENT_PENDING_DISABLE) {
|
||||||
log_error("client not pending disable");
|
log_error("Could not ack disable: client is not pending disable");
|
||||||
errno = EBUSY;
|
errno = EBUSY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
client->state = CLIENT_DISABLED;
|
client->state = CLIENT_DISABLED;
|
||||||
log_infof("disabled client %d", client->session);
|
log_infof("Disabled client %d on %s", client->session, seat->seat_name);
|
||||||
|
|
||||||
if (seat->active_client != client) {
|
if (seat->active_client != client) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -594,32 +590,32 @@ int seat_set_next_session(struct client *client, int session) {
|
||||||
struct seat *seat = client->seat;
|
struct seat *seat = client->seat;
|
||||||
|
|
||||||
if (client->state != CLIENT_ACTIVE) {
|
if (client->state != CLIENT_ACTIVE) {
|
||||||
log_error("client is not active");
|
log_error("Could not set next session: client is not active");
|
||||||
errno = EPERM;
|
errno = EPERM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(seat->active_client == client);
|
assert(seat->active_client == client);
|
||||||
|
|
||||||
if (session <= 0) {
|
if (session <= 0) {
|
||||||
log_errorf("invalid session value: %d", session);
|
log_errorf("Could not set next session: invalid session value %d", session);
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (session == client->session) {
|
if (session == client->session) {
|
||||||
log_info("requested session is already active");
|
log_info("Could not set next session: requested session is already active");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat->next_client != NULL) {
|
if (seat->next_client != NULL) {
|
||||||
log_info("switch is already queued");
|
log_info("Could not set next session: switch is already queued");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat->vt_bound) {
|
if (seat->vt_bound) {
|
||||||
log_infof("switching to VT %d from VT %d", session, seat->cur_vt);
|
log_infof("Switching from VT %d to VT %d", seat->cur_vt, session);
|
||||||
if (vt_switch(seat, session) == -1) {
|
if (vt_switch(seat, session) == -1) {
|
||||||
log_error("could not switch VT");
|
log_error("Could not switch VT");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -636,12 +632,12 @@ int seat_set_next_session(struct client *client, int session) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target == NULL) {
|
if (target == NULL) {
|
||||||
log_error("no valid switch available");
|
log_error("Could not set next session: no such client");
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_infof("queuing switch client with session %d", session);
|
log_infof("Queuing switch to client %d on %s", session, seat->seat_name);
|
||||||
seat->next_client = target;
|
seat->next_client = target;
|
||||||
seat_disable_client(seat->active_client);
|
seat_disable_client(seat->active_client);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -654,7 +650,7 @@ int seat_vt_activate(struct seat *seat) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
seat_update_vt(seat);
|
seat_update_vt(seat);
|
||||||
log_debug("activating VT");
|
log_debug("Activating VT");
|
||||||
vt_ack(seat, false);
|
vt_ack(seat, false);
|
||||||
if (seat->active_client == NULL) {
|
if (seat->active_client == NULL) {
|
||||||
seat_activate(seat);
|
seat_activate(seat);
|
||||||
|
@ -670,7 +666,7 @@ int seat_vt_release(struct seat *seat) {
|
||||||
}
|
}
|
||||||
seat_update_vt(seat);
|
seat_update_vt(seat);
|
||||||
|
|
||||||
log_debug("releasing VT");
|
log_debug("Releasing VT");
|
||||||
if (seat->active_client != NULL) {
|
if (seat->active_client != NULL) {
|
||||||
seat_disable_client(seat->active_client);
|
seat_disable_client(seat->active_client);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ static int open_socket(const char *path, int uid, int gid) {
|
||||||
} addr = {{0}};
|
} addr = {{0}};
|
||||||
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
|
int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
log_errorf("could not create socket: %s", strerror(errno));
|
log_errorf("Could not create socket: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,21 +32,21 @@ static int open_socket(const char *path, int uid, int gid) {
|
||||||
strncpy(addr.unix.sun_path, path, sizeof addr.unix.sun_path - 1);
|
strncpy(addr.unix.sun_path, path, sizeof addr.unix.sun_path - 1);
|
||||||
socklen_t size = offsetof(struct sockaddr_un, sun_path) + strlen(addr.unix.sun_path);
|
socklen_t size = offsetof(struct sockaddr_un, sun_path) + strlen(addr.unix.sun_path);
|
||||||
if (bind(fd, &addr.generic, size) == -1) {
|
if (bind(fd, &addr.generic, size) == -1) {
|
||||||
log_errorf("could not bind socket: %s", strerror(errno));
|
log_errorf("Could not bind socket: %s", strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (listen(fd, LISTEN_BACKLOG) == -1) {
|
if (listen(fd, LISTEN_BACKLOG) == -1) {
|
||||||
log_errorf("could not listen on socket: %s", strerror(errno));
|
log_errorf("Could not listen on socket: %s", strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (uid != 0 || gid != 0) {
|
if (uid != 0 || gid != 0) {
|
||||||
if (chown(path, uid, gid) == -1) {
|
if (chown(path, uid, gid) == -1) {
|
||||||
log_errorf("could not chown socket to uid %d, gid %d: %s", uid, gid,
|
log_errorf("Could not chown socket to uid %d, gid %d: %s", uid, gid,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
} else if (chmod(path, 0770) == -1) {
|
} else if (chmod(path, 0770) == -1) {
|
||||||
log_errorf("could not chmod socket: %s", strerror(errno));
|
log_errorf("Could not chmod socket: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fd;
|
return fd;
|
||||||
|
@ -122,7 +122,7 @@ int main(int argc, char *argv[]) {
|
||||||
socket_path = SEATD_DEFAULTPATH;
|
socket_path = SEATD_DEFAULTPATH;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (stat(socket_path, &st) == 0) {
|
if (stat(socket_path, &st) == 0) {
|
||||||
log_info("removing leftover seatd socket");
|
log_info("Removing leftover seatd socket");
|
||||||
unlink(socket_path);
|
unlink(socket_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,13 +135,13 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
int socket_fd = open_socket(socket_path, uid, gid);
|
int socket_fd = open_socket(socket_path, uid, gid);
|
||||||
if (socket_fd == -1) {
|
if (socket_fd == -1) {
|
||||||
log_errorf("could not create server socket: %s", strerror(errno));
|
log_errorf("Could not create server socket: %s", strerror(errno));
|
||||||
server_finish(&server);
|
server_finish(&server);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (poller_add_fd(&server.poller, socket_fd, EVENT_READABLE, server_handle_connection,
|
if (poller_add_fd(&server.poller, socket_fd, EVENT_READABLE, server_handle_connection,
|
||||||
&server) == NULL) {
|
&server) == NULL) {
|
||||||
log_errorf("could not add socket to poller: %s", strerror(errno));
|
log_errorf("Could not add socket to poller: %s", strerror(errno));
|
||||||
close(socket_fd);
|
close(socket_fd);
|
||||||
server_finish(&server);
|
server_finish(&server);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -151,7 +151,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
while (server.running) {
|
while (server.running) {
|
||||||
if (poller_poll(&server.poller) == -1) {
|
if (poller_poll(&server.poller) == -1) {
|
||||||
log_errorf("poller failed: %s", strerror(errno));
|
log_errorf("Poller failed: %s", strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,11 +111,11 @@ static int server_handle_kill(int signal, void *data) {
|
||||||
static int set_nonblock(int fd) {
|
static int set_nonblock(int fd) {
|
||||||
int flags;
|
int flags;
|
||||||
if ((flags = fcntl(fd, F_GETFD)) == -1 || fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
|
if ((flags = fcntl(fd, F_GETFD)) == -1 || fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
|
||||||
log_errorf("could not set FD_CLOEXEC on socket: %s", strerror(errno));
|
log_errorf("Could not set FD_CLOEXEC on socket: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if ((flags = fcntl(fd, F_GETFL)) == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
|
if ((flags = fcntl(fd, F_GETFL)) == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
|
||||||
log_errorf("could not set O_NONBLOCK on socket: %s", strerror(errno));
|
log_errorf("Could not set O_NONBLOCK on socket: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -124,7 +124,7 @@ static int set_nonblock(int fd) {
|
||||||
int server_add_client(struct server *server, int fd) {
|
int server_add_client(struct server *server, int fd) {
|
||||||
if (set_nonblock(fd) != 0) {
|
if (set_nonblock(fd) != 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
log_errorf("could not prepare new client socket: %s", strerror(errno));
|
log_errorf("Could not prepare new client socket: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,11 +132,11 @@ int server_add_client(struct server *server, int fd) {
|
||||||
client->event_source =
|
client->event_source =
|
||||||
poller_add_fd(&server->poller, fd, EVENT_READABLE, client_handle_connection, client);
|
poller_add_fd(&server->poller, fd, EVENT_READABLE, client_handle_connection, client);
|
||||||
if (client->event_source == NULL) {
|
if (client->event_source == NULL) {
|
||||||
log_errorf("could not add client socket to poller: %s", strerror(errno));
|
log_errorf("Could not add client socket to poller: %s", strerror(errno));
|
||||||
client_destroy(client);
|
client_destroy(client);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
log_infof("new client connected (pid: %d, uid: %d, gid: %d)", client->pid, client->uid,
|
log_infof("New client connected (pid: %d, uid: %d, gid: %d)", client->pid, client->uid,
|
||||||
client->gid);
|
client->gid);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -146,14 +146,14 @@ int server_handle_connection(int fd, uint32_t mask, void *data) {
|
||||||
if (mask & (EVENT_ERROR | EVENT_HANGUP)) {
|
if (mask & (EVENT_ERROR | EVENT_HANGUP)) {
|
||||||
shutdown(fd, SHUT_RDWR);
|
shutdown(fd, SHUT_RDWR);
|
||||||
server->running = false;
|
server->running = false;
|
||||||
log_errorf("server socket recieved an error: %s", strerror(errno));
|
log_errorf("Server socket recieved an error: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mask & EVENT_READABLE) {
|
if (mask & EVENT_READABLE) {
|
||||||
int new_fd = accept(fd, NULL, NULL);
|
int new_fd = accept(fd, NULL, NULL);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
log_errorf("could not accept client connection: %s", strerror(errno));
|
log_errorf("Could not accept client connection: %s", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue