Stop remembering the drm fd in child.
This commit is contained in:
parent
2f2c8205d8
commit
3779ef802d
|
@ -4,8 +4,8 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
int direct_ipc_open(int sock, const char *path);
|
int direct_ipc_open(int sock, const char *path);
|
||||||
void direct_ipc_setmaster(int sock);
|
void direct_ipc_setmaster(int sock, int fd);
|
||||||
void direct_ipc_dropmaster(int sock);
|
void direct_ipc_dropmaster(int sock, int fd);
|
||||||
void direct_ipc_finish(int sock, pid_t pid);
|
void direct_ipc_finish(int sock, pid_t pid);
|
||||||
int direct_ipc_start(pid_t *pid_out);
|
int direct_ipc_start(pid_t *pid_out);
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,7 @@ static void communicate(int sock) {
|
||||||
int drm_fd = -1;
|
int drm_fd = -1;
|
||||||
bool running = true;
|
bool running = true;
|
||||||
|
|
||||||
while (running && recv_msg(sock, NULL, &msg, sizeof(msg)) >= 0) {
|
while (running && recv_msg(sock, &drm_fd, &msg, sizeof(msg)) >= 0) {
|
||||||
switch (msg.type) {
|
switch (msg.type) {
|
||||||
case MSG_OPEN:
|
case MSG_OPEN:
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
@ -140,29 +140,24 @@ static void communicate(int sock) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maj == DRM_MAJOR) {
|
if (maj == DRM_MAJOR && drmSetMaster(fd)) {
|
||||||
if (drmSetMaster(fd)) {
|
ret = errno;
|
||||||
ret = errno;
|
|
||||||
} else {
|
|
||||||
drm_fd = fd;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
error:
|
error:
|
||||||
send_msg(sock, ret ? -1 : fd, &ret, sizeof(ret));
|
send_msg(sock, ret ? -1 : fd, &ret, sizeof(ret));
|
||||||
|
close(fd);
|
||||||
if (fd != drm_fd) {
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_SETMASTER:
|
case MSG_SETMASTER:
|
||||||
drmSetMaster(drm_fd);
|
drmSetMaster(drm_fd);
|
||||||
|
close(drm_fd);
|
||||||
send_msg(sock, -1, NULL, 0);
|
send_msg(sock, -1, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_DROPMASTER:
|
case MSG_DROPMASTER:
|
||||||
drmDropMaster(drm_fd);
|
drmDropMaster(drm_fd);
|
||||||
|
close(drm_fd);
|
||||||
send_msg(sock, -1, NULL, 0);
|
send_msg(sock, -1, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -173,7 +168,6 @@ error:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close(drm_fd);
|
|
||||||
close(sock);
|
close(sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,17 +183,17 @@ int direct_ipc_open(int sock, const char *path) {
|
||||||
return err ? -err : fd;
|
return err ? -err : fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void direct_ipc_setmaster(int sock) {
|
void direct_ipc_setmaster(int sock, int fd) {
|
||||||
struct msg msg = { .type = MSG_SETMASTER };
|
struct msg msg = { .type = MSG_SETMASTER };
|
||||||
|
|
||||||
send_msg(sock, -1, &msg, sizeof(msg));
|
send_msg(sock, fd, &msg, sizeof(msg));
|
||||||
recv_msg(sock, NULL, NULL, 0);
|
recv_msg(sock, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void direct_ipc_dropmaster(int sock) {
|
void direct_ipc_dropmaster(int sock, int fd) {
|
||||||
struct msg msg = { .type = MSG_DROPMASTER };
|
struct msg msg = { .type = MSG_DROPMASTER };
|
||||||
|
|
||||||
send_msg(sock, -1, &msg, sizeof(msg));
|
send_msg(sock, fd, &msg, sizeof(msg));
|
||||||
recv_msg(sock, NULL, NULL, 0);
|
recv_msg(sock, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ static void direct_session_close(struct wlr_session *base, int fd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (major(st.st_rdev) == DRM_MAJOR) {
|
if (major(st.st_rdev) == DRM_MAJOR) {
|
||||||
direct_ipc_dropmaster(session->sock);
|
direct_ipc_dropmaster(session->sock, session->base.drm_fd);
|
||||||
session->base.drm_fd = -1;
|
session->base.drm_fd = -1;
|
||||||
} else if (major(st.st_rdev) == INPUT_MAJOR) {
|
} else if (major(st.st_rdev) == INPUT_MAJOR) {
|
||||||
ioctl(fd, EVIOCREVOKE, 0);
|
ioctl(fd, EVIOCREVOKE, 0);
|
||||||
|
@ -109,11 +109,11 @@ static int vt_handler(int signo, void *data) {
|
||||||
if (session->base.active) {
|
if (session->base.active) {
|
||||||
session->base.active = false;
|
session->base.active = false;
|
||||||
wl_signal_emit(&session->base.session_signal, session);
|
wl_signal_emit(&session->base.session_signal, session);
|
||||||
direct_ipc_dropmaster(session->sock);
|
direct_ipc_dropmaster(session->sock, session->base.drm_fd);
|
||||||
ioctl(session->tty_fd, VT_RELDISP, 1);
|
ioctl(session->tty_fd, VT_RELDISP, 1);
|
||||||
} else {
|
} else {
|
||||||
ioctl(session->tty_fd, VT_RELDISP, VT_ACKACQ);
|
ioctl(session->tty_fd, VT_RELDISP, VT_ACKACQ);
|
||||||
direct_ipc_setmaster(session->sock);
|
direct_ipc_setmaster(session->sock, session->base.drm_fd);
|
||||||
session->base.active = true;
|
session->base.active = true;
|
||||||
wl_signal_emit(&session->base.session_signal, session);
|
wl_signal_emit(&session->base.session_signal, session);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue