Diff between d98c7855f41f6579e9bc5163c37dd4f5610aeddc and 86eb638a46cd7188cfd2aeb7bf8515174540528d

Changed Files

File Additions Deletions Status
android/system-emulator.c +38 -0 modified

Full Patch

diff --git a/android/system-emulator.c b/android/system-emulator.c
index 3e44e74..8ca4fe1 100644
--- a/android/system-emulator.c
+++ b/android/system-emulator.c
@@ -29,9 +29,11 @@
 #include <errno.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <signal.h>
 #include <string.h>
 #include <libgen.h>
 #include <sys/poll.h>
+#include <sys/wait.h>
 #include <sys/param.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -63,6 +65,8 @@ static void ctl_start(void)
 		exit(0);
 	}
 
+	printf("New process %d created\n", pid);
+
 	daemon_pid = pid;
 }
 
@@ -88,15 +92,49 @@ static void system_socket_callback(int fd, uint32_t events, void *user_data)
 	ctl_start();
 }
 
+static void signal_callback(int signum, void *user_data)
+{
+	switch (signum) {
+	case SIGINT:
+	case SIGTERM:
+		mainloop_quit();
+		break;
+	case SIGCHLD:
+		while (1) {
+			pid_t pid;
+			int status;
+
+			pid = waitpid(WAIT_ANY, &status, WNOHANG);
+			if (pid < 0 || pid == 0)
+				break;
+
+			printf("Process %d terminated with status=%d\n",
+								pid, status);
+
+			if (pid == daemon_pid)
+				daemon_pid = -1;
+		}
+		break;
+	}
+}
+
 int main(int argc, char *argv[])
 {
 	static const char SYSTEM_SOCKET_PATH[] = "\0android_system";
 
+	sigset_t mask;
 	struct sockaddr_un addr;
 	int fd;
 
 	mainloop_init();
 
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGINT);
+	sigaddset(&mask, SIGTERM);
+	sigaddset(&mask, SIGCHLD);
+
+	mainloop_set_signal(&mask, signal_callback, NULL, NULL);
+
 	printf("Android system emulator ver %s\n", VERSION);
 
 	snprintf(exec_dir, sizeof(exec_dir), "%s", dirname(argv[0]));