瀏覽代碼

klishd: faux.eloop with signals

Serj Kalichev 3 年之前
父節點
當前提交
228a95f86c
共有 1 個文件被更改,包括 26 次插入4 次删除
  1. 26 4
      bin/klishd/klishd.c

+ 26 - 4
bin/klishd/klishd.c

@@ -47,20 +47,39 @@ static void sigchld_handler(int signo);
 static int create_listen_unix_sock(const char *path);
 
 
-bool_t unix_socket_event(faux_eloop_t *eloop, faux_eloop_type_e type,
+static bool_t stop_loop(faux_eloop_t *eloop, faux_eloop_type_e type,
+	void *associated_data, void *user_data)
+{
+	faux_eloop_info_signal_t *info = (faux_eloop_info_signal_t *)associated_data;
+printf("SIGNAL %d\n", info->signo);
+
+	// Happy compiler
+	eloop = eloop;
+	type = type;
+	associated_data = associated_data;
+	user_data = user_data;
+
+	return BOOL_FALSE; // Stop Event Loop
+}
+
+static bool_t unix_socket_event(faux_eloop_t *eloop, faux_eloop_type_e type,
 	void *associated_data, void *user_data)
 {
 	faux_eloop_info_fd_t *info = (faux_eloop_info_fd_t *)associated_data;
 
 	if (info->revents & POLLIN) {
-printf("Data on %d\n", info->fd);
+		char buf[1000];
+		ssize_t s = 0;
+
+		s = read(info->fd, buf, 1000);
+printf("Received %ld bytes on fd %d\n", s, info->fd);
+//faux_eloop_add_signal(eloop, SIGINT, stop_loop, NULL);
 	}
 
 	if (info->revents & POLLHUP) {
 		close(info->fd);
 		faux_eloop_del_fd(eloop, info->fd);
 		syslog(LOG_DEBUG, "Close connection %d", info->fd);
-return BOOL_FALSE;
 	}
 
 	type = type; // Happy compiler
@@ -69,7 +88,7 @@ return BOOL_FALSE;
 	return BOOL_TRUE;
 }
 
-bool_t listen_unix_socket_event(faux_eloop_t *eloop, faux_eloop_type_e type,
+static bool_t listen_unix_socket_event(faux_eloop_t *eloop, faux_eloop_type_e type,
 	void *associated_data, void *user_data)
 {
 	int new_conn = -1;
@@ -237,6 +256,9 @@ syslog(LOG_DEBUG, "Listen socket %d", listen_unix_sock);
 
 
 	eloop = faux_eloop_new(NULL);
+	faux_eloop_add_signal(eloop, SIGINT, stop_loop, NULL);
+	faux_eloop_add_signal(eloop, SIGTERM, stop_loop, NULL);
+	faux_eloop_add_signal(eloop, SIGQUIT, stop_loop, NULL);
 	faux_eloop_add_fd(eloop, listen_unix_sock, POLLIN, listen_unix_socket_event, NULL);
 	faux_eloop_loop(eloop);
 	faux_eloop_free(eloop);