cluster: RHEL6 - rgmanager: Add extra service status call

Lon Hohberger lon at fedoraproject.org
Wed Feb 15 23:49:12 UTC 2012


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=fb5d3eea42ea69cec1d37fd4d8018e32a36d2c37
Commit:        fb5d3eea42ea69cec1d37fd4d8018e32a36d2c37
Parent:        b950000e35d922fe24de64d798f59f712ba7017f
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Mon Oct 24 10:44:18 2011 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Wed Feb 15 18:43:45 2012 -0500

rgmanager: Add extra service status call

Pass the flags and last transition time back to caller
if the caller requests it with an additional parameter.

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/src/daemons/slang_event.c |  103 +++++++++++++++++++++++++++++++++--
 1 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/rgmanager/src/daemons/slang_event.c b/rgmanager/src/daemons/slang_event.c
index 0b9f0d0..c302de5 100644
--- a/rgmanager/src/daemons/slang_event.c
+++ b/rgmanager/src/daemons/slang_event.c
@@ -15,6 +15,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#define HAVE_LONG_LONG
 #include <slang.h>
 #include <sys/syslog.h>
 #include <malloc.h>
@@ -204,14 +205,68 @@ get_service_state_internal(const char *svcName, rg_state_t *svcStatus)
 
 
 /*
-   (restarts, last_owner, owner, state) = get_service_status(servicename)
+   (rte, restarts, last_owner, owner, state) =
+		service_status(servicename)
+
+For extra information (flags, transition time)
+   (transition_time, flags, rte, restarts, owner, state) = 
+                service_status(servicename, 1);
  */
 static void
-sl_service_status(const char *svcName)
+sl_service_status(void)
 {
+	char *svcName = NULL;
+	char *state_str;
 	rg_state_t svcStatus;
 	int restarts_exceeded = 0;
-	char *state_str;
+	int nargs = 0, t = 0, extra = 0, flags = 0;
+	unsigned long long mtime;
+
+	nargs = SLang_Num_Function_Args;
+
+	/* Takes one or two args */
+	if (nargs <= 0 || nargs > 2) {
+		SLang_verror(SL_Syntax_Error,
+		     (char *)"%s: Wrong # of args (%d), must be 1 or 2\n",
+		     __FUNCTION__,
+		     nargs);
+		return;
+	}
+
+	if (nargs == 2) {
+		t = SLang_peek_at_stack();
+		if (t != SLANG_INT_TYPE) {
+			SLang_verror(SL_Syntax_Error,
+				     (char *)"%s: expected type %d got %d\n",
+				     __FUNCTION__, SLANG_INT_TYPE, t);
+			return;
+		}
+
+		if (SLang_pop_integer(&extra) < 0) {
+			SLang_verror(SL_Syntax_Error,
+			    (char *)"%s: Failed to pop integer from stack!\n",
+			    __FUNCTION__);
+			return;
+		}
+	}
+
+	t = SLang_peek_at_stack();
+	if (t != SLANG_STRING_TYPE) {
+		SLang_verror(SL_Syntax_Error,
+			     (char *)"%s: expected type %d got %d\n",
+			     __FUNCTION__,
+			     SLANG_STRING_TYPE, t);
+		return;
+	}
+
+	if (SLpop_string(&svcName) < 0) {
+		SLang_verror(SL_Syntax_Error,
+		    (char *)"%s: Failed to pop string from stack!\n",
+		    __FUNCTION__);
+		return;
+	}
+
+	/* Ok, got our parameters */
 
 	if (get_service_state_internal(svcName, &svcStatus) < 0) {
 		SLang_verror(SL_RunTime_Error,
@@ -221,6 +276,28 @@ sl_service_status(const char *svcName)
 		return;
 	}
 
+	if (extra) {
+		/* push transition time and flags on to the stack */
+
+		mtime = (unsigned long long)svcStatus.rs_transition;
+		if (SLang_push_ulong_long(mtime) < 0) {
+			SLang_verror(SL_RunTime_Error,
+				     (char *)"%s: Failed to push mtime %s",
+				     __FUNCTION__,
+				     svcName);
+			return;
+		}
+
+		flags = (int)svcStatus.rs_flags;
+		if (SLang_push_integer(flags) < 0) {
+			SLang_verror(SL_RunTime_Error,
+				     (char *)"%s: Failed to push flags %s",
+				     __FUNCTION__,
+				     svcName);
+			return;
+		}
+	}
+
 	restarts_exceeded = check_restart(svcName);
 	if (SLang_push_integer(restarts_exceeded) < 0) {
 		SLang_verror(SL_RunTime_Error,
@@ -903,6 +980,8 @@ array_to_string(char *buf, int buflen, int *array, int arraylen)
 static void
 sl_logt_print(int level)
 {
+	unsigned long long s_ullval;
+	unsigned long s_ulval;
 	int t, nargs, len;
 	//int level;
 	int s_intval;
@@ -912,6 +991,7 @@ sl_logt_print(int level)
 	char tmp[256];
 	int need_free;
 	int remain = sizeof(logbuf)-2;
+	SLang_Any_Type *stuff = NULL;
 
 	nargs = SLang_Num_Function_Args;
 	if (nargs < 1)
@@ -935,6 +1015,16 @@ sl_logt_print(int level)
 			}
 			free(nodes);
 			break;
+		case SLANG_ULONG_TYPE:
+			if (SLang_pop_ulong(&s_ulval) < 0)
+				return;
+			len=snprintf(tmp, sizeof(tmp) - 1, "%lu", s_ulval);
+			break;
+		case SLANG_ULLONG_TYPE:
+			if (SLang_pop_ulong_long(&s_ullval) < 0)
+				return;
+			len=snprintf(tmp, sizeof(tmp) - 1, "%llu", s_ullval);
+			break;
 		case SLANG_INT_TYPE:
 			if (SLang_pop_integer(&s_intval) < 0)
 				return;
@@ -951,6 +1041,11 @@ sl_logt_print(int level)
 			need_free = 0;
 			len=snprintf(tmp, sizeof(tmp) - 1,
 				     "{UnknownType %d}", t);
+			SLang_pop_anytype(&stuff);
+			if (stuff) {
+				SLang_free_anytype(stuff);
+				stuff = NULL;
+			}
 			break;
 		}
 
@@ -1054,7 +1149,7 @@ static SLang_Intrin_Fun_Type rgmanager_slang[] =
 			 SLANG_INT_TYPE),
 	MAKE_INTRINSIC_0((char *)"service_migrate", sl_migrate_service,
 			 SLANG_INT_TYPE),
-	MAKE_INTRINSIC_S((char *)"service_status", sl_service_status,
+	MAKE_INTRINSIC_0((char *)"service_status", sl_service_status,
 			 SLANG_VOID_TYPE),
 	MAKE_INTRINSIC_S((char *)"service_freeze", sl_service_freeze,
 			 SLANG_INT_TYPE),


More information about the cluster-commits mailing list