[Initng-svn] r4065 - in initng/trunk: .

svn at initng.thinktux.net svn at initng.thinktux.net
Mon May 8 13:04:31 CEST 2006


Author: jimmy
Date: Mon May  8 13:04:29 2006
New Revision: 4065

Modified:
   initng/trunk/TODO
   initng/trunk/plugins/nge/initng_nge.c
   initng/trunk/plugins/nge/initng_nge.h
   initng/trunk/plugins/nge/libngeclient.c
   initng/trunk/plugins/nge/libngeclient.h
   initng/trunk/plugins/nge/nge.c

Log:
Add process_killed notification on nge bus.


Modified: initng/trunk/TODO
==============================================================================
--- initng/trunk/TODO	(original)
+++ initng/trunk/TODO	Mon May  8 13:04:29 2006
@@ -3,7 +3,7 @@
 
 Move all selinux stuff to an own selinux plugin.
 
-add nge events, [DONE percentage], and kill notice, when a process dies nge shud know.
+[DONE] add nge events, percentage, and kill notice, when a process dies nge shud know.
 
 Fix the xml parser.
 

Modified: initng/trunk/plugins/nge/initng_nge.c
==============================================================================
--- initng/trunk/plugins/nge/initng_nge.c	(original)
+++ initng/trunk/plugins/nge/initng_nge.c	Mon May  8 13:04:29 2006
@@ -98,6 +98,31 @@
 	}
 }
 
+static int handle_killed(active_db_h * service, process_h * process)
+{
+	char *buffert = NULL;
+	int len;
+
+	buffert = calloc(180 + strlen(service->name) +
+					 strlen(service->current_state->state_name) +
+					 strlen(process->pt->name),
+					 sizeof(char));
+
+	len = sprintf(buffert,
+				  "<event type=\"process_killed\" service=\"%s\" is=\"%i\" state=\"%s\" process=\"%s\" exit_status=\"%i\" term_sig=\"%i\"/>\n",
+				  service->name, service->current_state->is,
+				  service->current_state->state_name,
+				  process->pt->name, WEXITSTATUS(process->r_code), WTERMSIG(process->r_code));
+	
+	if (len > 1)
+		send_to_all(buffert, sizeof(char) * len);
+
+	free(buffert);
+
+	/* AlwaYs, AlwaYs, return FALSE to mark this killed process as NOT handled */
+	return(FALSE);
+}
+
 static void close_initiator_socket(void)
 {
 	/* Check if we need to remove hooks */
@@ -114,6 +139,7 @@
 		initng_plugin_hook_unregister(&g.SWATCHERS, &system_state_change);
 		initng_plugin_hook_unregister(&g.PIPEWATCHERS, &system_pipe_watchers);
 		initng_plugin_hook_unregister(&g.ERR_MSG, &print_error);
+		initng_plugin_hook_unregister(&g.HANDLE_KILLED, &handle_killed);
 
 		is_active = FALSE;
 	}
@@ -187,6 +213,7 @@
 		initng_plugin_hook_register(&g.PIPEWATCHERS, 50,
 									&system_pipe_watchers);
 		initng_plugin_hook_register(&g.ERR_MSG, 50, &print_error);
+		initng_plugin_hook_register(&g.HANDLE_KILLED, 1, &handle_killed);
 		is_active = TRUE;
 	}
 	/* create a new socket, for reading */

Modified: initng/trunk/plugins/nge/initng_nge.h
==============================================================================
--- initng/trunk/plugins/nge/initng_nge.h	(original)
+++ initng/trunk/plugins/nge/initng_nge.h	Mon May  8 13:04:29 2006
@@ -23,4 +23,4 @@
 #define NGE_REAL NGE_PREFIX "nge"
 #define NGE_TEST NGE_PREFIX "nge-test"
 
-#define NGE_VERSION 3
+#define NGE_VERSION 4

Modified: initng/trunk/plugins/nge/libngeclient.c
==============================================================================
--- initng/trunk/plugins/nge/libngeclient.c	(original)
+++ initng/trunk/plugins/nge/libngeclient.c	Mon May  8 13:04:29 2006
@@ -421,6 +421,28 @@
 																		  "state");
 }
 
+/* called on a <event type="process_killed"  */
+static void ngeclient_handle_process_killed(nge_event * event,
+												   char *tag, int chars)
+{
+	assert(event);
+	assert(tag);
+	event->state_type = PROCESS_KILLED;
+	event->payload.process_killed.service = ngeclient_get_option(tag,
+																	   "service");
+	event->payload.process_killed.is = (e_is) ngeclient_get_int(tag,
+																	  "is");
+	event->payload.process_killed.state_name = ngeclient_get_option(tag,
+																		  "state");
+	event->payload.process_killed.process = ngeclient_get_option(tag,
+																	   "process");
+	event->payload.process_killed.exit_status = ngeclient_get_int(tag,
+																	  "exit_status");
+	event->payload.process_killed.term_sig = ngeclient_get_int(tag,
+																	  "term_sig");
+				
+}
+
 /* called on a <event type="initial_system_state"  */
 static void ngeclient_handle_initial_system_state(nge_event * event,
 												  char *tag, int chars)
@@ -494,6 +516,10 @@
 	{
 		ngeclient_handle_service_output(event, tag, chars);
 	}
+	else if (strcmp(type, "process_killed") == 0)
+	{
+		ngeclient_handle_process_killed(event, tag, chars);
+	}
 	else if (strcmp(type, "err_msg") == 0)
 	{
 		ngeclient_handle_err_msg(event, tag, chars);
@@ -761,6 +787,14 @@
 			if (e->payload.service_output.service)
 				free(e->payload.service_output.output);
 			break;
+		case PROCESS_KILLED:
+			if (e->payload.process_killed.service)
+				free(e->payload.process_killed.service);
+			if (e->payload.process_killed.state_name)
+				free(e->payload.process_killed.state_name);
+			if (e->payload.process_killed.process)
+				free(e->payload.process_killed.process);
+			break;
 	}
 	free(e);
 }

Modified: initng/trunk/plugins/nge/libngeclient.h
==============================================================================
--- initng/trunk/plugins/nge/libngeclient.h	(original)
+++ initng/trunk/plugins/nge/libngeclient.h	Mon May  8 13:04:29 2006
@@ -36,6 +36,7 @@
 	INITIAL_SYSTEM_STATE_CHANGE = 7,
 	INITIAL_STATE_FINISHED = 8,
 	SERVICE_OUTPUT = 9,
+	PROCESS_KILLED = 10,
 } e_state_type;
 
 
@@ -84,6 +85,17 @@
 			int percent_stopped;
 		} service_state_change;
 
+		/* process_killed event */
+		struct
+		{
+			char *service;
+			e_is is;
+			char *state_name;
+			char *process;
+			int exit_status;
+			int term_sig;			
+		} process_killed;
+		
 		/* system_state_change  and initial_system_state */
 		h_sys_state system_state_change;
 

Modified: initng/trunk/plugins/nge/nge.c
==============================================================================
--- initng/trunk/plugins/nge/nge.c	(original)
+++ initng/trunk/plugins/nge/nge.c	Mon May  8 13:04:29 2006
@@ -57,6 +57,14 @@
 	fprintf(stdout, "Dissonnected from initng.\n");
 }
 
+static void process_killed(char *service, e_is is, char *state, char * process, int exit_status, int term_sig)
+{
+	fprintf(stdout, "Service \"%s\" state \"%s\" (%i) process \"%s\" killed: exit_status \"%i\" term_sig \"%i\"\n",
+					service, state, is, process, exit_status, term_sig);
+
+}
+
+
 static void service_change(char *service, e_is is, char *state, int pstart, int pstop)
 {
 	switch (is)
@@ -160,6 +168,14 @@
 						   e->payload.service_output.process,
 						   e->payload.service_output.output);
 			return;
+		case PROCESS_KILLED:
+			process_killed(e->payload.process_killed.service,
+						   e->payload.process_killed.is,
+						   e->payload.process_killed.state_name,
+						   e->payload.process_killed.process,
+						   e->payload.process_killed.exit_status,
+						   e->payload.process_killed.term_sig);
+			return;
 	}
 }
 


More information about the Initng-svn mailing list