mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	Stop remembering the drm fd in child.
This commit is contained in:
		
							parent
							
								
									2f2c8205d8
								
							
						
					
					
						commit
						3779ef802d
					
				
					 3 changed files with 15 additions and 21 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue