cluster: RHEL58 - rgmanager: Add extra service status call
Lon Hohberger
lon at fedoraproject.org
Thu Jan 5 16:43:40 UTC 2012
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=93e33cb09d2567e9523a7098247c6c9df324c16b
Commit: 93e33cb09d2567e9523a7098247c6c9df324c16b
Parent: fd4b3b98416f916b77ac7726a1c2535843bbba6d
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Mon Oct 24 10:44:18 2011 -0400
Committer: Lon Hohberger <lhh at redhat.com>
CommitterDate: Thu Jan 5 10:56:30 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.
Resolves: rhbz#743214
Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
rgmanager/src/daemons/slang_event.c | 105 +++++++++++++++++++++++++++++++++--
1 files changed, 100 insertions(+), 5 deletions(-)
diff --git a/rgmanager/src/daemons/slang_event.c b/rgmanager/src/daemons/slang_event.c
index 468706f..c9cca7a 100644
--- a/rgmanager/src/daemons/slang_event.c
+++ b/rgmanager/src/daemons/slang_event.c
@@ -30,6 +30,7 @@
#include <stdio.h>
#include <string.h>
+#define HAVE_LONG_LONG 1
#include <slang.h>
#include <sys/syslog.h>
#include <malloc.h>
@@ -229,14 +230,68 @@ get_service_state_internal(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);
*/
-void
-sl_service_status(char *svcName)
+static void
+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,
@@ -246,6 +301,28 @@ sl_service_status(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,
@@ -928,6 +1005,8 @@ array_to_string(char *buf, int buflen, int *array, int arraylen)
void
sl_clulog(int level)
{
+ unsigned long long s_ullval;
+ unsigned long s_ulval;
int t, nargs, len;
//int level;
int s_intval;
@@ -937,6 +1016,7 @@ sl_clulog(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)
@@ -960,6 +1040,16 @@ sl_clulog(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;
@@ -976,6 +1066,11 @@ sl_clulog(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;
}
@@ -1075,7 +1170,7 @@ SLang_Intrin_Fun_Type rgmanager_slang[] =
MAKE_INTRINSIC_0("service_start", sl_start_service, SLANG_INT_TYPE),
MAKE_INTRINSIC_0((char *)"service_migrate", sl_migrate_service,
SLANG_INT_TYPE),
- MAKE_INTRINSIC_S("service_status", sl_service_status,
+ MAKE_INTRINSIC_0((char *)"service_status", sl_service_status,
SLANG_VOID_TYPE),
MAKE_INTRINSIC_S("service_freeze", sl_service_freeze,
SLANG_INT_TYPE),
More information about the cluster-commits
mailing list