Index: trunk/FACT++/dim/README_v19.txt
===================================================================
--- trunk/FACT++/dim/README_v19.txt	(revision 14285)
+++ trunk/FACT++/dim/README_v19.txt	(revision 14286)
@@ -1,4 +1,4 @@
 
-                    DIM version 19.35 Release Notes
+                    DIM version 19.37 Release Notes
 
 Notes 1 and 2 for Unix Users only
@@ -17,5 +17,18 @@
 		Dns </dev/null >& dns.log &
 
-NOTE 3: The Version Number service provided by servers is now set to 1935.
+NOTE 3: The Version Number service provided by servers is now set to 1937.
+
+27/06/2012
+Changes for version 19.37:
+    - DIM DNS crashed for servers with a task name bigger than 80 characters - Fixed.
+
+
+22/06/2012
+Changes for version 19.36:
+    - The internal "DIS_DNS/KILL_SERVERS" command can now be used to pass a user defined exit_code to
+      the servers. The servers will get this exit_code in their exit_handler.
+      Although the exit_code passed to the "DIS_DNS/KILL_SERVERS" command is an integer, only the lower
+      16 bits can be used, i.e. only these bits are passed to the servers.
+
 
 24/05/2012
Index: trunk/FACT++/dim/dim/dim.h
===================================================================
--- trunk/FACT++/dim/dim/dim.h	(revision 14285)
+++ trunk/FACT++/dim/dim/dim.h	(revision 14286)
@@ -14,5 +14,5 @@
 #include "dim_common.h"
 
-#define DIM_VERSION_NUMBER 1935
+#define DIM_VERSION_NUMBER 1937
 
 
@@ -187,5 +187,5 @@
 */
 typedef enum { DNS_DIS_REGISTER, DNS_DIS_KILL, DNS_DIS_STOP, 
-			   DNS_DIS_EXIT } DNS_DIS_TYPES;
+			   DNS_DIS_EXIT, DNS_DIS_SOFT_EXIT } DNS_DIS_TYPES;
 typedef enum { RD_HDR, RD_DATA, RD_DUMMY } CONN_STATE;
 typedef enum { NOSWAP, SWAPS, SWAPL, SWAPD} SWAP_TYPE;
@@ -442,5 +442,5 @@
 	TIMR_ENT *timr_ent;
 	int already;
-	char long_task_name[MAX_TASK_NAME*2];
+	char long_task_name[MAX_TASK_NAME*10];
 } DNS_CONNECTION;
 
Index: trunk/FACT++/dim/src/did/did.c
===================================================================
--- trunk/FACT++/dim/src/did/did.c	(revision 14285)
+++ trunk/FACT++/dim/src/did/did.c	(revision 14286)
@@ -1844,5 +1844,5 @@
 		return;
 	}
-        if ((tag == DID_SEL_NODE) || (tag == DID_SEL_SERVICE)) 
+    if ((tag == DID_SEL_NODE) || (tag == DID_SEL_SERVICE)) 
 	{
 		strcpy(Curr_view_opt_par, str);
@@ -1850,5 +1850,5 @@
 		XtFree(str);
 	}
-        if(tag == DID_SERVICES)
+    if(tag == DID_SERVICES)
 	{
 	  pstr = strchr(str,' ');
@@ -1908,5 +1908,5 @@
 	  XtFree(str);
 	}
-        if(tag == DID_COMMAND)
+    if(tag == DID_COMMAND)
 	{
 	  did_prepare_command(str);
Index: trunk/FACT++/dim/src/dis.c
===================================================================
--- trunk/FACT++/dim/src/dis.c	(revision 14285)
+++ trunk/FACT++/dim/src/dis.c	(revision 14286)
@@ -253,5 +253,5 @@
 		strcpy(str,"Service name too long: ");
 		strcat(str,name);
-		error_handler(0, DIM_ERROR, DIMSVCTOOLG, str);
+		error_handler(0, DIM_ERROR, DIMSVCTOOLG, str, -1);
 		ENABLE_AST
 		return((unsigned) 0);
@@ -261,5 +261,5 @@
 		strcpy(str,"Duplicate Service: ");
 		strcat(str,name);
-		error_handler(0, DIM_ERROR, DIMSVCDUPLC, str);
+		error_handler(0, DIM_ERROR, DIMSVCDUPLC, str, -1);
 		ENABLE_AST
 		return((unsigned) 0);
@@ -273,5 +273,5 @@
 			strcpy(str,"Format String Too Long: ");
 			strcat(str,name);
-			error_handler(0, DIM_ERROR, DIMSVCFORMT, str);
+			error_handler(0, DIM_ERROR, DIMSVCFORMT, str, -1);
 			free(new_serv);
 			ENABLE_AST
@@ -282,5 +282,5 @@
 			strcpy(str,"Bad Format String: ");
 			strcat(str,name);
-			error_handler(0, DIM_ERROR, DIMSVCFORMT, str);
+			error_handler(0, DIM_ERROR, DIMSVCFORMT, str, -1);
 			free(new_serv);
 			ENABLE_AST
@@ -431,5 +431,5 @@
 		strcpy(str,"Command name too long: ");
 		strcat(str,name);
-		error_handler(0, DIM_ERROR, DIMSVCTOOLG, str);
+		error_handler(0, DIM_ERROR, DIMSVCTOOLG, str, -1);
 		ENABLE_AST
 		return((unsigned) 0);
@@ -648,4 +648,5 @@
 	extern void do_dis_stop_serving_dns(DIS_DNS_CONN *);
 	DIS_DNS_CONN *dnsp;
+	int type, exit_code;
 
 	if(size){}
@@ -672,5 +673,5 @@
 					DIS_DNS_TMOUT_MIN, DIS_DNS_TMOUT_MAX, SRC_DIS );
 			if(dnsp->dns_dis_conn_id == -2)
-				error_handler(0, DIM_FATAL, DIMDNSUNDEF, "DIM_DNS_NODE undefined");
+				error_handler(0, DIM_FATAL, DIMDNSUNDEF, "DIM_DNS_NODE undefined", -1);
 		}
 		break;
@@ -694,5 +695,8 @@
 		if(vtohl(packet->size) != DNS_DIS_HEADER)
 			break;
-		switch( vtohl(packet->type) )
+		type = vtohl(packet->type);
+		exit_code = (type >> 16) & 0xFFFF;
+		type &= 0xFFFF;
+		switch(type)
 		{
 		case DNS_DIS_REGISTER :
@@ -700,5 +704,5 @@
 				"%s: Watchdog Timeout, DNS requests registration",
 				dnsp->task_name);
-			error_handler(0, DIM_WARNING, DIMDNSTMOUT, str);
+			error_handler(0, DIM_WARNING, DIMDNSTMOUT, str, -1);
 			register_services(dnsp, ALL, 0);
 			break;
@@ -711,5 +715,5 @@
 			*/
 			Serving = -1;
-			error_handler(0, DIM_FATAL, DIMDNSDUPLC, str);
+			error_handler(0, DIM_FATAL, DIMDNSDUPLC, str, -1);
 			/*
 			do_dis_stop_serving_dns(dnsp);
@@ -730,5 +734,5 @@
 */
 			Serving = -1;
-			error_handler(0, DIM_FATAL, DIMDNSREFUS, str);
+			error_handler(0, DIM_FATAL, DIMDNSREFUS, str, -1);
 			/*
 			do_dis_stop_serving_dns(dnsp);
@@ -748,5 +752,13 @@
 			Serving = -1;
 */
-			error_handler(0, DIM_FATAL, DIMDNSEXIT, str);
+			error_handler(0, DIM_FATAL, DIMDNSEXIT, str, -1);
+			break;
+		case DNS_DIS_SOFT_EXIT :
+			sprintf(str, 
+				"%s: DNS requests Exit(%d)",dnsp->task_name, exit_code);
+/*
+			Serving = -1;
+*/
+			error_handler(0, DIM_FATAL, DIMDNSEXIT, str, exit_code);
 			break;
 		}
@@ -1207,5 +1219,5 @@
 					DIS_DNS_TMOUT_MIN, DIS_DNS_TMOUT_MAX, SRC_DIS );
 			if(dnsp->dns_dis_conn_id == -2)
-				error_handler(0, DIM_FATAL, DIMDNSUNDEF, "DIM_DNS_NODE undefined");
+				error_handler(0, DIM_FATAL, DIMDNSUNDEF, "DIM_DNS_NODE undefined", -1);
 		}
 	}
@@ -1720,5 +1732,5 @@
 	{
 		sprintf(str, "Update Service - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 		ENABLE_AST
 		return(found);
@@ -1861,5 +1873,5 @@
 	{
 		sprintf(str, "Service Has Clients- Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 		ENABLE_AST
 		return(found);
@@ -1895,5 +1907,5 @@
 	{
 		sprintf(str,"Get Timeout - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 		return(-1);
 	}
@@ -1922,5 +1934,5 @@
 	{
 		sprintf(str,"Set Quality - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 	    ENABLE_AST
 		return;
@@ -1956,5 +1968,5 @@
 	{
 		sprintf(str,"Set Timestamp - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 	    ENABLE_AST
 		return(0);
@@ -2007,5 +2019,5 @@
 	{
 		sprintf(str,"Get Timestamp - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 	    ENABLE_AST
 		return(0);
@@ -2050,5 +2062,5 @@
 	if( !service_id ) {
 		sprintf(str,"Send Service - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 		ENABLE_AST
 		return;
@@ -2114,5 +2126,5 @@
 	{
 		sprintf(str,"Remove Service - Invalid service id");
-		error_handler(0, DIM_ERROR, DIMSVCINVAL, str);
+		error_handler(0, DIM_ERROR, DIMSVCINVAL, str, -1);
 		ENABLE_AST
 		return(found);
@@ -3184,5 +3196,5 @@
 }
 
-static void error_handler(int conn_id, int severity, int errcode, char *reason)
+static void error_handler(int conn_id, int severity, int errcode, char *reason, int exit)
 {
 	int exit_tag, exit_code, exit_size;
@@ -3205,5 +3217,8 @@
 	{
 		exit_tag = 0;
-		exit_code = errcode;
+		if(exit == -1)
+			exit_code = errcode;
+		else
+			exit_code = exit;
 		exit_size = sizeof(int);
 		exit_handler(&exit_tag, &exit_code, &exit_size);
Index: trunk/FACT++/dim/src/dns.c
===================================================================
--- trunk/FACT++/dim/src/dns.c	(revision 14285)
+++ trunk/FACT++/dim/src/dns.c	(revision 14286)
@@ -525,5 +525,5 @@
 				{
 					strncpy(Dns_conns[conn_id].long_task_name, packet->services[i].service_name,
-						MAX_TASK_NAME*2);
+						MAX_TASK_NAME*10);
 					ptrt = strstr(Dns_conns[conn_id].long_task_name,"/CLIENT_LIST");
 					*ptrt = '\0';
@@ -1455,5 +1455,5 @@
 	dis_add_cmnd( "DIS_DNS/DEBUG_ON", 0, set_debug_on, 0 );
 	dis_add_cmnd( "DIS_DNS/DEBUG_OFF", 0, set_debug_off, 0 );
-	dis_add_cmnd( "DIS_DNS/KILL_SERVERS", 0, kill_servers, 0 );
+	dis_add_cmnd( "DIS_DNS/KILL_SERVERS", "I", kill_servers, 0 );
 	dis_add_cmnd( "DIS_DNS/PRINT_HASH_TABLE", 0, print_hash_table, 0 );
 	dis_add_cmnd( "DIS_DNS/SERVICE_INFO/RpcIn", "C", set_rpc_info, 0 );
@@ -1563,9 +1563,19 @@
 
 
-void kill_servers()
+void kill_servers(int *tag, int *code, int *size)
 {
 	int i;
 	DNS_DIS_PACKET dis_packet;
-
+	int soft_code = 0, soft_size = 0;
+	int type;
+	
+	if(size)
+	{
+		soft_size = *size;
+		if(code)
+		{
+			soft_code = *code;
+		}
+	}
 	for(i = 0; i< Curr_N_Conns; i++)
 	{
@@ -1574,9 +1584,21 @@
 			if(!strcmp(Dns_conns[i].task_name,"DIS_DNS"))
 				continue;
-			dim_print_date_time();
-			printf(" Killing server %s@%s\n",
-				Dns_conns[i].task_name, Dns_conns[i].node_name);
 			fflush(stdout);
-			dis_packet.type = htovl(DNS_DIS_EXIT);
+			type = DNS_DIS_EXIT;
+			if(soft_size)
+			{
+				type = DNS_DIS_SOFT_EXIT;
+				type |= (soft_code << 16) & 0xFFFF0000;
+				dim_print_date_time();
+				printf(" Killing server %s@%s with exit code %d\n",
+					Dns_conns[i].task_name, Dns_conns[i].node_name, soft_code);
+			}
+			else
+			{
+				dim_print_date_time();
+				printf(" Killing server %s@%s\n",
+					Dns_conns[i].task_name, Dns_conns[i].node_name);
+			}
+			dis_packet.type = htovl(type);
 			dis_packet.size = htovl(DNS_DIS_HEADER);
 			if( !dna_write_nowait(i, &dis_packet, DNS_DIS_HEADER) )
