commit feb5646

Michael Forney  ·  2016-04-30 08:09:16 +0000 UTC
parent 70daabb
launch: Improve error messages
1 files changed,  +47, -53
+47, -53
  1@@ -77,9 +77,7 @@ die(const char *format, ...);
  2 
  3 static void __attribute__((noreturn)) usage(const char *name)
  4 {
  5-	fprintf(stderr, "Usage: %s [-n] [-s <server-socket>] [-t <tty-device>] "
  6-	                "[--] <server> [server arguments...]\n",
  7-	        name);
  8+	fprintf(stderr, "usage: %s [-n] [-s socket] [-t tty] [--] server [args...]\n", name);
  9 	exit(2);
 10 }
 11 
 12@@ -90,7 +88,7 @@ start_devices(void)
 13 
 14 	for (index = 0; index < launcher.num_drm_fds; ++index) {
 15 		if (drmSetMaster(launcher.drm_fds[index]) < 0)
 16-			die("Failed to set DRM master");
 17+			die("failed to set DRM master");
 18 	}
 19 }
 20 
 21@@ -101,15 +99,12 @@ stop_devices(bool fatal)
 22 
 23 	for (index = 0; index < launcher.num_drm_fds; ++index) {
 24 		if (drmDropMaster(launcher.drm_fds[index]) < 0 && fatal)
 25-			die("Failed to drop DRM master");
 26+			die("failed to drop DRM master");
 27 	}
 28 
 29 	for (index = 0; index < launcher.num_input_fds; ++index) {
 30-		if (ioctl(launcher.input_fds[index], EVIOCREVOKE, 0) == -1 && errno != ENODEV && fatal)
 31-			die("FATAL: Your kernel does not support EVIOCREVOKE; "
 32-			    "input devices cannot be revoked: %s",
 33-			    strerror(errno));
 34-
 35+		if (ioctl(launcher.input_fds[index], EVIOCREVOKE, 0) < 0 && errno != ENODEV && fatal)
 36+			die("failed to revoke input device:");
 37 		close(launcher.input_fds[index]);
 38 	}
 39 
 40@@ -125,7 +120,6 @@ cleanup(void)
 41 		return;
 42 
 43 	/* Cleanup VT */
 44-	fprintf(stderr, "Restoring VT to original state\n");
 45 	ioctl(launcher.tty_fd, VT_SETMODE, &mode);
 46 	ioctl(launcher.tty_fd, KDSETMODE, original_vt_state.console_mode);
 47 	ioctl(launcher.tty_fd, KDSKBMODE, original_vt_state.kb_mode);
 48@@ -143,13 +137,12 @@ die(const char *format, ...)
 49 {
 50 	va_list args;
 51 
 52-	fputs("FATAL: ", stderr);
 53 	va_start(args, format);
 54 	vfprintf(stderr, format, args);
 55 	va_end(args);
 56 
 57-	if (errno != 0)
 58-		fprintf(stderr, ": %s", strerror(errno));
 59+	if (format[0] && format[strlen(format) - 1] == ':')
 60+		fprintf(stderr, " %s", strerror(errno));
 61 
 62 	fputc('\n', stderr);
 63 
 64@@ -185,7 +178,6 @@ handle_chld(int signal)
 65 	int status;
 66 
 67 	wait(&status);
 68-	fprintf(stderr, "Server exited with status %d\n", WEXITSTATUS(status));
 69 	cleanup();
 70 	exit(WEXITSTATUS(status));
 71 }
 72@@ -231,12 +223,12 @@ handle_socket_data(int socket)
 73 	switch (request->type) {
 74 	case SWC_LAUNCH_REQUEST_OPEN_DEVICE:
 75 		if (request->path[size - __builtin_offsetof(typeof(*request), path) - 1] != '\0') {
 76-			fprintf(stderr, "Path is not NULL terminated\n");
 77+			fprintf(stderr, "path is not NULL terminated\n");
 78 			goto fail;
 79 		}
 80 
 81 		if (stat(request->path, &st) == -1) {
 82-			fprintf(stderr, "Could not stat %s\n", request->path);
 83+			fprintf(stderr, "stat %s: %s\n", request->path, strerror(errno));
 84 			goto fail;
 85 		}
 86 
 87@@ -246,25 +238,25 @@ handle_socket_data(int socket)
 88 				goto fail;
 89 
 90 			if (launcher.num_input_fds == ARRAY_LENGTH(launcher.input_fds)) {
 91-				fprintf(stderr, "Too many input devices opened\n");
 92+				fprintf(stderr, "too many input devices opened\n");
 93 				goto fail;
 94 			}
 95 			break;
 96 		case DRM_MAJOR:
 97 			if (launcher.num_drm_fds == ARRAY_LENGTH(launcher.drm_fds)) {
 98-				fprintf(stderr, "Too many DRM devices opened\n");
 99+				fprintf(stderr, "too many DRM devices opened\n");
100 				goto fail;
101 			}
102 			break;
103 		default:
104-			fprintf(stderr, "Device is not an input device\n");
105+			fprintf(stderr, "device is not an input device\n");
106 			goto fail;
107 		}
108 
109 		fd = open(request->path, request->flags);
110 
111 		if (fd == -1) {
112-			fprintf(stderr, "Could not open device %s\n", request->path);
113+			fprintf(stderr, "open %s: %s\n", request->path, strerror(errno));
114 			goto fail;
115 		}
116 
117@@ -283,10 +275,10 @@ handle_socket_data(int socket)
118 			goto fail;
119 
120 		if (ioctl(launcher.tty_fd, VT_ACTIVATE, request->vt) == -1)
121-			fprintf(stderr, "Could not activate VT %d: %s\n", request->vt, strerror(errno));
122+			fprintf(stderr, "failed to activate VT %d: %s\n", request->vt, strerror(errno));
123 		break;
124 	default:
125-		fprintf(stderr, "Unknown request %u\n", request->type);
126+		fprintf(stderr, "unknown request %u\n", request->type);
127 		goto fail;
128 	}
129 
130@@ -312,9 +304,9 @@ find_vt(char *vt, size_t size)
131 
132 		tty0_fd = open("/dev/tty0", O_RDWR);
133 		if (tty0_fd == -1)
134-			die("Could not open /dev/tty0 to find unused VT");
135+			die("open /dev/tty0:");
136 		if (ioctl(tty0_fd, VT_OPENQRY, &vt_num) != 0)
137-			die("Could not find unused VT");
138+			die("VT open query failed:");
139 		close(tty0_fd);
140 		if (snprintf(vt, size, "/dev/tty%d", vt_num) >= size)
141 			die("VT number is too large");
142@@ -339,7 +331,7 @@ open_tty(const char *tty_name)
143 		fd = open(tty_name, O_RDWR | O_NOCTTY);
144 
145 		if (fd < 0)
146-			die("Could not open %s", tty_name);
147+			die("open %s:", tty_name);
148 
149 		return fd;
150 	}
151@@ -358,34 +350,34 @@ setup_tty(int fd)
152 	};
153 
154 	if (fstat(fd, &st) == -1)
155-		die("Could not stat TTY fd");
156+		die("failed to stat TTY fd:");
157 
158 	vt = minor(st.st_rdev);
159 
160 	if (major(st.st_rdev) != TTY_MAJOR || vt == 0)
161-		die("Not a valid VT");
162+		die("not a valid VT");
163 
164 	if (ioctl(fd, VT_GETSTATE, &state) == -1)
165-		die("Could not get the current VT state");
166+		die("failed to get the current VT state:");
167 
168 	original_vt_state.vt = state.v_active;
169 
170 	if (ioctl(fd, KDGKBMODE, &original_vt_state.kb_mode))
171-		die("Could not get keyboard mode");
172+		die("failed to get keyboard mode:");
173 
174 	if (ioctl(fd, KDGETMODE, &original_vt_state.console_mode))
175-		die("Could not get console mode");
176+		die("failed to get console mode:");
177 
178 	if (ioctl(fd, KDSKBMODE, K_OFF) == -1)
179-		die("Could not set keyboard mode to K_OFF");
180+		die("failed to set keyboard mode to K_OFF:");
181 
182 	if (ioctl(fd, KDSETMODE, KD_GRAPHICS) == -1) {
183-		perror("Could not set console mode to KD_GRAPHICS");
184+		perror("failed to set console mode to KD_GRAPHICS");
185 		goto error0;
186 	}
187 
188 	if (ioctl(fd, VT_SETMODE, &mode) == -1) {
189-		perror("Could not set VT mode");
190+		perror("failed to set VT mode");
191 		goto error1;
192 	}
193 
194@@ -393,12 +385,12 @@ setup_tty(int fd)
195 		activate();
196 	else if (!nflag) {
197 		if (ioctl(fd, VT_ACTIVATE, vt) == -1) {
198-			perror("Could not activate VT");
199+			perror("failed to activate VT");
200 			goto error2;
201 		}
202 
203 		if (ioctl(fd, VT_WAITACTIVE, vt) == -1) {
204-			perror("Could not wait for VT to become active");
205+			perror("failed to wait for VT to become active");
206 			goto error2;
207 		}
208 	}
209@@ -446,30 +438,30 @@ main(int argc, char *argv[])
210 		usage(argv[0]);
211 
212 	if (socketpair(AF_LOCAL, SOCK_SEQPACKET, 0, sockets) == -1)
213-		die("Could not create socket pair");
214+		die("socketpair:");
215 
216 	launcher.socket = sockets[0];
217 
218 	if (fcntl(sockets[0], F_SETFD, FD_CLOEXEC) == -1)
219-		die("Could not set CLOEXEC on socket");
220+		die("failed set CLOEXEC on socket:");
221 
222 	action.sa_handler = &handle_chld;
223 	if (sigaction(SIGCHLD, &action, NULL) == -1)
224-		die("Failed to register signal handler for SIGCHLD");
225+		die("failed to register signal handler for SIGCHLD:");
226 
227 	action.sa_handler = &handle_usr1;
228 	if (sigaction(SIGUSR1, &action, NULL) == -1)
229-		die("Failed to register signal handler for SIGUSR1");
230+		die("failed to register signal handler for SIGUSR1:");
231 
232 	action.sa_handler = &handle_usr2;
233 	if (sigaction(SIGUSR2, &action, NULL) == -1)
234-		die("Failed to register signal handler for SIGUSR2");
235+		die("failed to register signal handler for SIGUSR2:");
236 
237 	action.sa_handler = &forward_signal;
238 	if (sigaction(SIGINT, &action, NULL) == -1)
239-		die("Failed to register signal handler for SIGINT");
240+		die("failed to register signal handler for SIGINT:");
241 	if (sigaction(SIGTERM, &action, NULL) == -1)
242-		die("Failed to register signal handler for SIGTERM");
243+		die("failed to register signal handler for SIGTERM:");
244 
245 	sigfillset(&set);
246 	sigdelset(&set, SIGCHLD);
247@@ -484,7 +476,7 @@ main(int argc, char *argv[])
248 		vt = vt_buf;
249 	}
250 
251-	fprintf(stderr, "Running on %s\n", vt);
252+	fprintf(stderr, "running on %s\n", vt);
253 	launcher.tty_fd = open_tty(vt);
254 	setup_tty(launcher.tty_fd);
255 
256@@ -497,15 +489,15 @@ main(int argc, char *argv[])
257 		/* Reset signal handlers to defaults */
258 		action.sa_handler = SIG_DFL;
259 		if (sigaction(SIGCHLD, &action, NULL) == -1)
260-			die("Failed to set default signal handler for SIGCHLD");
261+			die("failed to set default signal handler for SIGCHLD:");
262 		if (sigaction(SIGUSR1, &action, NULL) == -1)
263-			die("Failed to set default signal handler for SIGUSR1");
264+			die("failed to set default signal handler for SIGUSR1:");
265 		if (sigaction(SIGUSR2, &action, NULL) == -1)
266-			die("Failed to set default signal handler for SIGUSR2");
267+			die("failed to set default signal handler for SIGUSR2:");
268 		if (sigaction(SIGINT, &action, NULL) == -1)
269-			die("Failed to set default signal handler for SIGINT");
270+			die("failed to set default signal handler for SIGINT:");
271 		if (sigaction(SIGTERM, &action, NULL) == -1)
272-			die("Failed to set default signal handler for SIGTERM");
273+			die("failed to set default signal handler for SIGTERM:");
274 
275 		/* Set empty signal mask */
276 		sigemptyset(&set);
277@@ -517,11 +509,13 @@ main(int argc, char *argv[])
278 		sprintf(string, "%d", launcher.tty_fd);
279 		setenv(SWC_LAUNCH_TTY_FD_ENV, string, 1);
280 
281-		if (setuid(getuid()) != 0 || setgid(getgid()) != 0)
282-			die("Failed to drop permission before executing display server");
283+		if (setuid(getuid()) < 0)
284+			die("setuid:");
285+		if (setgid(getgid()) < 0)
286+			die("setgid:");
287 
288 		execvp(argv[optind], argv + optind);
289-		die("Could not exec %s", argv[optind]);
290+		die("exec %s:", argv[optind]);
291 	}
292 	/* Parent */
293 	else {
294@@ -538,7 +532,7 @@ main(int argc, char *argv[])
295 				if (errno == EINTR)
296 					continue;
297 				else
298-					die("Error while polling on socket fd");
299+					die("poll:");
300 			}
301 
302 			handle_socket_data(pollfd.fd);