Stop remembering the drm fd in child.

master
Scott Anderson 7 years ago
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));
if (fd != drm_fd) {
close(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…
Cancel
Save