From e8a014c07b1208f316f32cadec8431340f4d04e0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ale=C5=A1=20K=C5=99enek?= Date: Fri, 23 Mar 2007 13:53:44 +0000 Subject: [PATCH] merge --- org.glite.lb.server/Makefile | 9 +- org.glite.lb.server/config/startup | 20 ++- org.glite.lb.server/examples/ws_joblog.c | 11 +- org.glite.lb.server/examples/ws_jobstat.c | 26 +++- org.glite.lb.server/examples/ws_query_ex.c | 20 ++- org.glite.lb.server/src/bkserverd.c | 36 ++++- org.glite.lb.server/src/lb_plugin.c | 232 +++++++++++++++++++--------- org.glite.lb.server/src/query.c | 6 +- org.glite.lb.server/src/ws_fault.c | 49 ++++-- org.glite.lb.server/src/ws_query.c | 11 +- org.glite.lb.server/src/ws_typeref.c.T | 215 +++++++++++++------------- org.glite.lb.server/src/ws_typeref.h | 12 +- org.glite.lb.server/test/test_soap_conv.cpp | 4 +- 13 files changed, 399 insertions(+), 252 deletions(-) diff --git a/org.glite.lb.server/Makefile b/org.glite.lb.server/Makefile index 33b33e0..b4d9407 100644 --- a/org.glite.lb.server/Makefile +++ b/org.glite.lb.server/Makefile @@ -80,11 +80,11 @@ GRIDSITE_LIBS = -lgridsite_globus `xml2-config --libs` CFLAGS:= \ ${WS_CFLAGS} ${DEBUG} \ -DVERSION=\"${version}\" \ + -I${gsoap_prefix}/include -I${gsoap_prefix}/ \ -I${stagedir}/include -I${top_srcdir}/src -I. \ -I${top_srcdir}/interface \ -I${expat_prefix}/include \ -I${cares_prefix}/include \ - -I${gsoap_prefix}/include -I${gsoap_prefix}/ \ -I${classads_prefix}/include \ -I${voms_prefix}/include \ ${COVERAGE_FLAGS} \ @@ -316,7 +316,7 @@ test_soap_conv: test_soap_conv.cpp ${WS_CLIENT_OBJS} examples: ws_getversion ws_jobstat ws_query_ex ws_joblog ws_getversion: ws_getversion.o ${WS_CLIENT_OBJS} - ${LINK} -o $@ ws_getversion.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} + ${LINK} -o $@ ws_getversion.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} ws_jobstat: ws_jobstat.o ${WS_CLIENT_OBJS} ${LINK} -o $@ ws_jobstat.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} @@ -324,9 +324,6 @@ ws_jobstat: ws_jobstat.o ${WS_CLIENT_OBJS} ws_query_ex: ws_query_ex.o ${WS_CLIENT_OBJS} ${LINK} -o $@ ws_query_ex.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} -ws_query_ext: ws_query_ext.o ${WS_CLIENT_OBJS} - ${LINK} -o $@ ws_query_ext.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} - ws_joblog: ws_joblog.o ${WS_CLIENT_OBJS} ${LINK} -o $@ ws_joblog.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} @@ -373,7 +370,6 @@ install: ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-bkserverd ${INSTALL} -m 644 ${top_srcdir}/interface/job-attrs.xsd ${PREFIX}/interface ${INSTALL} -m 644 ${top_srcdir}/interface/job-record.xsd ${PREFIX}/interface - ${INSTALL} -m 644 jp_job_attrs.h ${PREFIX}/include/${globalprefix}/${lbprefix} if [ x${DOSTAGE} != xyes ]; then \ ${INSTALL} -m 755 ${stagedir}/bin/glite-lb-notif-interlogd ${PREFIX}/bin; \ @@ -384,6 +380,7 @@ install: install -m 644 ${STATIC_LIB_BK} ${PREFIX}/lib; \ if [ x${LB_STANDALONE} = x -a x${PLUGIN_LIB} != x ]; then \ ${INSTALL} -m 755 ${PLUGIN_LIB} ${PREFIX}/lib; \ + ${INSTALL} -m 644 jp_job_attrs.h ${PREFIX}/include/${globalprefix}/${lbprefix} ; \ fi; \ ${INSTALL} -m 644 ${top_srcdir}/interface/srv_perf.h ${PREFIX}/include/${globalprefix}/${lbprefix}; \ fi diff --git a/org.glite.lb.server/config/startup b/org.glite.lb.server/config/startup index f39c10e..597ddaf 100755 --- a/org.glite.lb.server/config/startup +++ b/org.glite.lb.server/config/startup @@ -13,6 +13,7 @@ GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite} [ -n "$GLITE_LB_SERVER_PIDFILE" ] && pidfile=$GLITE_LB_SERVER_PIDFILE || pidfile=$GLITE_LOCATION_VAR/glite-lb-bkserverd.pid +[ -z "$GLITE_LB_NOTIF_SOCK" ] && GLITE_LB_NOTIF_SOCK="/tmp/glite-lb-notif.sock" unset creds port @@ -35,26 +36,31 @@ start() fi [ -z "$GLITE_LB_EXPORT_DUMPDIR" ] && GLITE_LB_EXPORT_DUMPDIR=/tmp/dump - purgedir="--dump-prefix $GLITE_LB_EXPORT_DUMPDIR" + dumpdir="--dump-prefix $GLITE_LB_EXPORT_DUMPDIR" [ -d "$GLITE_LB_EXPORT_DUMPDIR" ] || mkdir -p "$GLITE_LB_EXPORT_DUMPDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_DUMPDIR" - [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg - maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR" - [ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPREG_MAILDIR" + [ -z "$GLITE_LB_EXPORT_PURGEDIR" ] && GLITE_LB_EXPORT_PURGEDIR=/tmp/purge + purgedir="--purge-prefix $GLITE_LB_EXPORT_PURGEDIR" + [ -d "$GLITE_LB_EXPORT_PURGEDIR" ] || mkdir -p "$GLITE_LB_EXPORT_PURGEDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_PURGEDIR" + + if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" ]; then + [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=/tmp/jpreg + [ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPREG_MAILDIR" + maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR" + fi + super="--super-users-file $GLITE_LOCATION/etc/LB-super-users" [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2 [ -n "$GLITE_LB_SERVER_PORT" ] && port="-p $GLITE_LB_SERVER_PORT" [ -n "$GLITE_LB_SERVER_WPORT" ] && wport="-w $GLITE_LB_SERVER_WPORT" - - [ -z "$GLITE_LB_NOTIF_SOCK" ] && GLITE_LB_NOTIF_SOCK="/tmp/glite-lb-notif.sock" [ -z "$GLITE_LB_NOTIF_FPREFIX" ] && GLITE_LB_NOTIF_FPREFIX="/var/tmp/glite-lb-notif" echo -n Starting glite-lb-bkserver ... su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-bkserverd \ --notif-il-sock=$GLITE_LB_NOTIF_SOCK \ --notif-il-fprefix=$GLITE_LB_NOTIF_FPREFIX \ - $creds -i $pidfile $port $wport $purgedir $maildir" \ + $super $creds -i $pidfile $port $wport $dumpdir $purgedir $maildir" \ && echo " done" || echo " FAILED" echo -n Starting glite-lb-notif-interlogd ... diff --git a/org.glite.lb.server/examples/ws_joblog.c b/org.glite.lb.server/examples/ws_joblog.c index fc86a38..a3bff54 100644 --- a/org.glite.lb.server/examples/ws_joblog.c +++ b/org.glite.lb.server/examples/ws_joblog.c @@ -1,16 +1,17 @@ #include #include -#include "glite/security/glite_gsplugin.h" #include "glite/lb/consumer.h" #include "glite/lb/events_parse.h" +#include "soap_version.h" +#include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" + #include "bk_ws_H.h" #include "ws_typeref.h" #include "ws_fault.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define soap_call___lb__QueryEvents soap_call___ns1__QueryEvents #endif @@ -41,8 +42,7 @@ int main(int argc,char** argv) struct soap *mydlo = soap_new(); struct _lbe__QueryEventsResponse out; struct _lbe__QueryEvents in; - edg_wll_QueryRec **jconds = NULL, - **econds = NULL; + edg_wll_QueryRec **jconds = NULL; edg_wll_QueryRec j[2], e[1]; int opt, err, i; edg_wlc_JobId job; @@ -86,7 +86,6 @@ int main(int argc,char** argv) glite_gsplugin_set_udata(mydlo, ctx); - /* prepare job log query */ memset(j,0,sizeof j); memset(e,0,sizeof e); diff --git a/org.glite.lb.server/examples/ws_jobstat.c b/org.glite.lb.server/examples/ws_jobstat.c index 2130a28..e6f2cf9 100644 --- a/org.glite.lb.server/examples/ws_jobstat.c +++ b/org.glite.lb.server/examples/ws_jobstat.c @@ -1,15 +1,15 @@ #include #include +#include "soap_version.h" #include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" #include "glite/lb/consumer.h" #include "bk_ws_H.h" #include "ws_typeref.h" #include "ws_fault.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define soap_call___lb__JobStatus soap_call___ns1__JobStatus #endif @@ -40,7 +40,6 @@ int main(int argc,char** argv) struct soap *mydlo = soap_new(); struct _lbe__JobStatusResponse out; struct _lbe__JobStatus in; - struct lbt__jobFlags flags = { 0, NULL }; int opt, err; char *server = "http://localhost:9003/", *jobid = NULL, @@ -77,9 +76,9 @@ int main(int argc,char** argv) glite_gsplugin_set_udata(mydlo, ctx); - in.jobid = jobid; - in.flags = &flags; - + in.jobid = soap_strdup(mydlo, jobid); + in.flags = soap_malloc(mydlo, sizeof(*in.flags)); + edg_wll_JobStatFlagsToSoap(mydlo, 0, in.flags); switch (err = soap_call___lb__JobStatus(mydlo, server, "",&in,&out)) { @@ -162,7 +161,9 @@ static void printstat(edg_wll_JobStat stat, int level) printf("%srsl : %s\n", ind, stat.rsl); printf("%sreason : %s\n", ind, stat.reason); printf("%slocation : %s\n", ind, stat.location); - printf("%ssubjob_failed : %d\n", ind, stat.subjob_failed); + printf("%sce_node : %s\n", ind, stat.ce_node); + printf("%ssubjob_failed : %d\n", ind, stat.subjob_failed); +// printf("%sdone_code : %d\n", ind, edg_wll_done_codeToString(stat.done_code)); printf("%sdone_code : %d\n", ind, stat.done_code); printf("%sexit_code : %d\n", ind, stat.exit_code); printf("%sresubmitted : %d\n", ind, stat.resubmitted); @@ -188,6 +189,17 @@ static void printstat(edg_wll_JobStat stat, int level) printf("%sexpectUpdate : %d\n", ind, stat.expectUpdate); printf("%sexpectFrom : %s\n", ind, stat.expectFrom); printf("%sacl : %s\n", ind, stat.acl); + printf("%spayload_running: %d\n", ind, stat.payload_running); + if (stat.possible_destinations) { + printf("%spossible_destinations : \n", ind); + for (i=0; stat.possible_destinations[i]; i++) + printf("%s\t%s \n", ind, stat.possible_destinations[i]); + } + if (stat.possible_ce_nodes) { + printf("%spossible_ce_nodes : \n", ind); + for (i=0; stat.possible_ce_nodes[i]; i++) + printf("%s\t%s \n", ind, stat.possible_ce_nodes[i]); + } printf("\n"); free(j1); diff --git a/org.glite.lb.server/examples/ws_query_ex.c b/org.glite.lb.server/examples/ws_query_ex.c index 1b627a4..b20e457 100644 --- a/org.glite.lb.server/examples/ws_query_ex.c +++ b/org.glite.lb.server/examples/ws_query_ex.c @@ -1,15 +1,16 @@ #include #include -#include "glite/security/glite_gsplugin.h" #include "glite/lb/consumer.h" +#include "soap_version.h" +#include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" + #include "bk_ws_H.h" #include "ws_fault.h" #include "ws_typeref.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define soap_call___lb__QueryJobs soap_call___ns1__QueryJobs #endif @@ -43,7 +44,7 @@ int main(int argc,char** argv) int opt, err; char *server = "http://localhost:9003/", *name = NULL; - int i, j; + int i; name = strrchr(argv[0],'/'); if (name) name++; else name = argv[0]; @@ -75,15 +76,18 @@ int main(int argc,char** argv) conditions[1] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec)); conditions[1][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - conditions[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[1][0].value.c = NULL; +#warning FIXME: NULL should work, use optional in WSDL? +// conditions[1][0].op = EDG_WLL_QUERY_OP_EQUAL; +// conditions[1][0].value.c = NULL; + conditions[1][0].op = EDG_WLL_QUERY_OP_UNEQUAL; + conditions[1][0].value.c = "x"; qjobs = soap_malloc(soap, sizeof(*qjobs)); memset(qjobs, 0, sizeof(*qjobs)); qjobs->flags = soap_malloc(soap, sizeof(*qjobs->flags)); memset(qjobs->flags, 0, sizeof(*qjobs->flags)); if (!qjobs->flags || edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec **)conditions, &qjobs->__sizeconditions, &qjobs->conditions) - || edg_wll_JobStatFlagsToSoap(soap, 0, qjobs->flags) ) { + || edg_wll_JobStatFlagsToSoap(soap, EDG_WLL_STAT_CLASSADS || EDG_WLL_STAT_CHILDREN || EDG_WLL_STAT_CHILDSTAT, qjobs->flags) ) { char *et,*ed; fprintf(stderr, "%s: soap types conversion error...\n", argv[0]); @@ -107,7 +111,7 @@ int main(int argc,char** argv) edg_wll_JobStatCode statCode; - edg_wll_SoapToJobStatCode(out.states[i]->state, &statCode); + edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(out.states, i)->state, &statCode); char *s = edg_wll_StatToString(statCode); printf("%-65s%s\n", out.jobs[i], s); free(s); diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c index 97d5484..184e2be 100644 --- a/org.glite.lb.server/src/bkserverd.c +++ b/org.glite.lb.server/src/bkserverd.c @@ -752,17 +752,21 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) +/* don't care :-( switch ( edg_wll_gss_watch_creds(server_cert, &cert_mtime) ) { case 0: break; case 1: +*/ if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &newcred, NULL, &gss_code) ) { dprintf(("[%d] reloading credentials\n", getpid())); gss_release_cred(&min_stat, &mycred); mycred = newcred; - } else { dprintf(("[%d] reloading credentials failed\n", getpid())); } + } else { dprintf(("[%d] reloading credentials failed, using old ones\n", getpid())); } +/* break; case -1: dprintf(("[%d] edg_wll_gss_watch_creds failed\n", getpid())); break; } +*/ if ( edg_wll_InitContext(&ctx) ) { @@ -821,6 +825,8 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) default: if (debug) fprintf(stderr, "gethostbyaddr(%s): %s", inet_ntoa(a.sin_addr), hstrerror(h_errno)); dprintf(("[%d] connection from %s:%d\n", getpid(), inet_ntoa(a.sin_addr), ntohs(a.sin_port))); + free(ctx->connections->serverConnection->peerName); + ctx->connections->serverConnection->peerName = strdup(inet_ntoa(a.sin_addr)); break; } @@ -879,17 +885,32 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) ctx->srvPort = ntohs(a.sin_port); } +/* XXX: ugly workaround, we may detect false expired certificated + * probably due to bug in Globus GSS/SSL. Treated as fatal, + * restarting the server solves the problem */ + +#define _EXPIRED_CERTIFICATE_MESSAGE "certificate has expired" + if ( (ret = edg_wll_gss_accept(mycred, conn, timeout, &ctx->connections->serverConnection->gss, &gss_code)) ) { if ( ret == EDG_WLL_GSS_ERROR_TIMEOUT ) { - dprintf(("[%d] Client authentication failed - timeout reached, closing.\n", getpid())); - if (!debug) syslog(LOG_ERR, "Client authentication failed - timeout reached"); + dprintf(("[%d] %s: Client authentication failed - timeout reached, closing.\n", getpid(),ctx->connections->serverConnection->peerName)); + if (!debug) syslog(LOG_ERR, "%s: Client authentication failed - timeout reached",ctx->connections->serverConnection->peerName); + } + else if (ret == EDG_WLL_GSS_ERROR_GSS) { + edg_wll_SetErrorGss(ctx,"Client authentication",&gss_code); + if (strstr(ctx->errDesc,_EXPIRED_CERTIFICATE_MESSAGE)) { + dprintf(("[%d] %s: false expired certificate: %s\n",getpid(),ctx->connections->serverConnection->peerName,ctx->errDesc)); + if (!debug) syslog(LOG_ERR,"[%d] %s: false expired certificate: %s",getpid(),ctx->connections->serverConnection->peerName,ctx->errDesc); + edg_wll_FreeContext(ctx); + return -1; + } } else { - dprintf(("[%d] Client authentication failed, closing.\n", getpid())); - if (!debug) syslog(LOG_ERR, "Client authentication failed"); + dprintf(("[%d] %s: Client authentication failed, closing.\n", getpid(),ctx->connections->serverConnection->peerName)); + if (!debug) syslog(LOG_ERR, "%s: Client authentication failed",ctx->connections->serverConnection->peerName); } edg_wll_FreeContext(ctx); @@ -1415,8 +1436,9 @@ static int read_roots(const char *file) int cnt = 0; if (!roots) { - perror(file); - return 1; + syslog(LOG_WARNING,"%s: %m, continuing without --super-users-file",file); + dprintf(("%s: %s, continuing without --super-users-file\n",file,strerror(errno))); + return 0; } while (!feof(roots)) { diff --git a/org.glite.lb.server/src/lb_plugin.c b/org.glite.lb.server/src/lb_plugin.c index 2aff2e2..2727228 100644 --- a/org.glite.lb.server/src/lb_plugin.c +++ b/org.glite.lb.server/src/lb_plugin.c @@ -16,6 +16,7 @@ #include "glite/lb/events.h" #include "glite/lb/events_parse.h" #include "glite/lb/trio.h" +#include "glite/lb/producer.h" #include "jobstat.h" #include "get_events.h" @@ -49,7 +50,7 @@ typedef struct _lb_historyStatus { typedef struct _lb_handle { edg_wll_Event **events; edg_wll_JobStat status; - lb_historyStatus **fullStatusHistory, **lastStatusHistory; + lb_historyStatus **fullStatusHistory, **lastStatusHistory*finalStatus; glite_jpps_fplug_data_t* classad_plugin; } lb_handle; @@ -118,8 +119,9 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { char *line; int retval; edg_wll_Context context; - int nevents, maxnevents, i; - glite_jp_error_t err; + int nevents, maxnevents, i; + glite_jp_error_t err; + char *id0 = NULL,*id = NULL; glite_jp_clear_error(ctx); h = calloc(1, sizeof(lb_handle)); @@ -162,6 +164,24 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { free(ed); goto fail; } + if (nevents == 0) { + id0 = edg_wlc_JobIdGetUnique(h->events[nevents]->any.jobId ); + } else { + id = edg_wlc_JobIdGetUnique(h->events[nevents]->any.jobId ); + if (strcmp(id0,id) != 0) { + char et[BUFSIZ]; + retval = EINVAL; + err.code = retval; + snprintf(et,sizeof et,"Attempt to process different jobs. Id '%s' (event n.%d) differs from '%s'",id,nevents+1,id0); + et[BUFSIZ-1] = 0; + err.desc = et; + err.source = "lb_plugin.c:edg_wlc_JobIdGetUnique()"; + glite_jp_stack_error(ctx,&err); + goto fail; + } + } + + if (id) free(id); id = NULL; nevents++; } free(line); @@ -203,7 +223,7 @@ static int lb_open(void *fpctx, void *bhandle, const char *uri, void **handle) { } cont: - /* count state and status hiftory of the job given by the loaded events */ + /* count state and status history of the job given by the loaded events */ if ((retval = lb_status(h)) != 0) goto fail; *handle = (void *)h; @@ -211,12 +231,17 @@ cont: return 0; fail: +#ifdef PLUGIN_DEBUG + fprintf(stderr,"lb_plugin: open ERROR\n"); +#endif for (i = 0; i < nevents; i++) { edg_wll_FreeEvent(h->events[i]); free(h->events[i]); } free(h->events); free(buffer.buf); + if (id0) free(id0); + if (id) free(id); edg_wll_FreeContext(context); free(h); *handle = NULL; @@ -255,6 +280,9 @@ static int lb_close(void *fpctx,void *handle) { free (h->fullStatusHistory[i]); i++; } + h->fullStatusHistory = NULL; + h->lastStatusHistory = NULL; + h->finalStatus = NULL; } free(h); @@ -388,13 +416,12 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ strcmp(attr, GLITE_JP_LB_rQType) == 0 || strcmp(attr, GLITE_JP_LB_eDuration) == 0) { /* have to be retrieved from JDL, but probably obsolete and not needed at all */ - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOSYS; - trio_asprintf(&et,"Attribute '%s' not implemented yet.",attr); - err.desc = strdup(et); - free(et); - free(ns); + snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } else if (strcmp(attr, GLITE_JP_LB_RB) == 0) { if (h->status.network_server) { @@ -421,13 +448,20 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_UIHost) == 0) { - if (h->status.location) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->status.location); - av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; - } + i = 0; + while (h->events[i]) { + if (h->events[i]->type == EDG_WLL_EVENT_REGJOB) { + if (h->events[i]->any.host) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->events[i]->any.host); + av[0].size = -1; + av[0].timestamp = h->events[i]->any.timestamp.tv_sec; + } + break; + } + i++; + } } else if (strcmp(attr, GLITE_JP_LB_CPUTime) == 0) { if (h->status.cpuTime) { av = calloc(2, sizeof(glite_jp_attrval_t)); @@ -438,23 +472,38 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ } } else if (strcmp(attr, GLITE_JP_LB_NProc) == 0) { /* currently LB hasn't got the info */ - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOSYS; - trio_asprintf(&et,"Attribute '%s' not implemented yet.",attr); - err.desc = strdup(et); - free(et); - free(ns); + snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } else if (strcmp(attr, GLITE_JP_LB_finalStatus) == 0) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); - av[0].value = edg_wll_StatToString(h->status.state); + if (h->finalStatus) { + av[0].value = edg_wll_StatToString(h->finalStatus->state); + av[0].timestamp = h->finalStatus->timestamp.tv_sec; + } else { + av[0].value = edg_wll_StatToString(h->status.state); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; + } av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; } else if (strcmp(attr, GLITE_JP_LB_finalStatusDate) == 0) { struct tm *t = NULL; - if ((t = gmtime(&h->status.lastUpdateTime.tv_sec)) != NULL) { + if ( (h->finalStatus) && + ((t = gmtime(&h->finalStatus->timestamp.tv_sec)) != NULL) ) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ + trio_asprintf(&av[0].value,"%04d-%02d-%02dT%02d:%02d:%02d.%06d", + 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, + t->tm_hour, t->tm_min, t->tm_sec, + h->finalStatus->timestamp.tv_usec); + av[0].size = -1; + av[0].timestamp = h->finalStatus->timestamp.tv_sec; + } else if ((t = gmtime(&h->status.lastUpdateTime.tv_sec)) != NULL) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); /* dateTime format: yyyy-mm-ddThh:mm:ss.uuuuuu */ @@ -466,7 +515,13 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_finalStatusReason) == 0) { - if (h->status.reason) { + if (h->finalStatus && h->finalStatus->reason) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->finalStatus->reason); + av[0].size = -1; + av[0].timestamp = h->finalStatus->timestamp.tv_sec; + } else if (h->status.reason) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); av[0].value = strdup(h->status.reason); @@ -474,26 +529,40 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else if (strcmp(attr, GLITE_JP_LB_LRMSDoneStatus) == 0) { + i = 0; + j = -1; + while (h->events[i]) { + if ( (h->events[i]->type == EDG_WLL_EVENT_DONE) && + (h->events[i]->any.source == EDG_WLL_SOURCE_LRMS) ) + j = i; + i++; + } av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); - av[0].value = edg_wll_DoneStatus_codeToString(h->status.done_code); av[0].size = -1; - av[0].timestamp = h->status.lastUpdateTime.tv_sec; + if ( j != -1) { + av[0].value = edg_wll_DoneStatus_codeToString(h->events[j]->done.status_code); + av[0].timestamp = h->events[j]->any.timestamp.tv_sec; + } else { + av[0].value = edg_wll_DoneStatus_codeToString(h->status.done_code); + av[0].timestamp = h->status.lastUpdateTime.tv_sec; + } } else if (strcmp(attr, GLITE_JP_LB_LRMSStatusReason) == 0) { i = 0; + j = -1; while (h->events[i]) { - if (h->events[i]->type == EDG_WLL_EVENT_DONE) { - if (h->events[i]->done.reason) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->events[i]->done.reason); - av[0].size = -1; - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - } - break; - } + if ( (h->events[i]->type == EDG_WLL_EVENT_DONE) && + (h->events[i]->any.source == EDG_WLL_SOURCE_LRMS) ) + j = i; i++; } + if ( ( j != -1) && (h->events[j]->done.reason) ) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->events[j]->done.reason); + av[0].size = -1; + av[0].timestamp = h->events[j]->any.timestamp.tv_sec; + } } else if (strcmp(attr, GLITE_JP_LB_retryCount) == 0) { av = calloc(2, sizeof(glite_jp_attrval_t)); av[0].name = strdup(attr); @@ -502,13 +571,12 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ av[0].timestamp = h->status.lastUpdateTime.tv_sec; } else if (strcmp(attr, GLITE_JP_LB_additionalReason) == 0) { /* what is it? */ - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOSYS; - trio_asprintf(&et,"Attribute '%s' not implemented yet.",attr); - err.desc = strdup(et); - free(et); - free(ns); + snprintf(et,sizeof et,"Attribute '%s' not implemented yet.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } else if (strcmp(attr, GLITE_JP_LB_jobType) == 0) { av = calloc(2, sizeof(glite_jp_attrval_t)); @@ -536,8 +604,7 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ old_val = strdup (""); for (i=0; istatus.children_num; i++) { trio_asprintf(&val,"%s\t\t%s\n", - old_val, ""); -// FIXME: h->status.children[i] ? h->status.children[i] : ""); + old_val, h->status.children[i] ? h->status.children[i] : ""); if (old_val) free(old_val); old_val = val; val = NULL; } @@ -547,13 +614,12 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ av[0].size = -1; av[0].timestamp = h->status.lastUpdateTime.tv_sec; } else { - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOENT; - trio_asprintf(&et,"Value unknown for attribute '%s', there are no subjobs.",attr); - err.desc = strdup(et); - free(et); - free(ns); + snprintf(et,sizeof et,"Value unknown for attribute '%s', there are no subjobs.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } } else if (strcmp(attr, GLITE_JP_LB_lastStatusHistory) == 0) { @@ -689,27 +755,20 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ } } } else if (strcmp(attr, GLITE_JP_LB_JDL) == 0) { - i = 0; - while (h->events[i]) { - if ((h->events[i]->type == EDG_WLL_EVENT_REGJOB) && - (h->events[i]->regJob.jdl) ) { - av = calloc(2, sizeof(glite_jp_attrval_t)); - av[0].name = strdup(attr); - av[0].value = strdup(h->events[i]->regJob.jdl); - av[0].timestamp = h->events[i]->any.timestamp.tv_sec; - av[0].size = -1; - break; - } - i++; + if (h->status.jdl) { + av = calloc(2, sizeof(glite_jp_attrval_t)); + av[0].name = strdup(attr); + av[0].value = strdup(h->status.jdl); + av[0].size = -1; + av[0].timestamp = h->status.lastUpdateTime.tv_sec; } } else { - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = EINVAL; - trio_asprintf(&et,"No such attribute '%s'.",attr); - err.desc = strdup(et); - free(et); - free(ns); + snprintf(et,sizeof et,"No such attribute '%s'.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; return glite_jp_stack_error(ctx,&err); } @@ -720,12 +779,12 @@ static int lb_query(void *fpctx,void *handle, const char *attr,glite_jp_attrval_ *attrval = av; return 0; } else { - char *et; + char et[BUFSIZ]; *attrval = NULL; err.code = ENOENT; - trio_asprintf(&et,"Value unknown for attribute '%s'.",attr); - err.desc = strdup(et); - free(et); + snprintf(et,sizeof et,"Value unknown for attribute '%s'.",attr); + et[BUFSIZ-1] = 0; + err.desc = et; if (av) glite_jp_attrval_free(av,1); // XXX: probably not needed return glite_jp_stack_error(ctx,&err); } @@ -764,7 +823,7 @@ static int lb_status(void *handle) { lb_handle *h = (lb_handle *) handle; intJobStat *js; - int maxnstates, nstates, i, be_strict = 0; + int maxnstates, nstates, i, be_strict = 0, retval; char *errstring; edg_wll_JobStatCode old_state = EDG_WLL_JOB_UNDEF; @@ -777,6 +836,7 @@ static int lb_status(void *handle) { nstates = 0; h->fullStatusHistory = calloc(maxnstates, sizeof(lb_historyStatus *)); h->lastStatusHistory = NULL; + h->finalStatus = NULL; i = 0; while (h->events[i]) { @@ -805,9 +865,14 @@ static int lb_status(void *handle) { h->fullStatusHistory[nstates]->timestamp.tv_sec = js->pub.stateEnterTime.tv_sec; h->fullStatusHistory[nstates]->timestamp.tv_usec = js->pub.stateEnterTime.tv_usec; h->fullStatusHistory[nstates]->reason = check_strdup(js->pub.reason); + /* lastStatusHistory starts from the last WAITING state */ if (js->pub.state == EDG_WLL_JOB_WAITING) { h->lastStatusHistory = &(h->fullStatusHistory[nstates]); } + /* finalStatus is the one preceeding the CLEARED state */ + if ( (js->pub.state == EDG_WLL_JOB_CLEARED) && (nstates > 0) ) { + h->finalStatus = h->fullStatusHistory[nstates-1]; + } old_state = js->pub.state; nstates++; } @@ -815,6 +880,31 @@ static int lb_status(void *handle) { i++; } h->fullStatusHistory[nstates] = NULL; + /* if there is no CLEARED state, finalStatus is just the last status + and if there is no such thing, leave h->finalStatus NULL and for the attribute + try to read something from the h->status */ + if ( (h->finalStatus == NULL) && (nstates > 0) ) { + h->finalStatus = h->fullStatusHistory[nstates-1]; + } + + /* fill in also subjobs */ + if (js->pub.children_num > 0) { + edg_wll_Context context; + edg_wlc_JobId *subjobs; + + if ((retval = edg_wll_InitContext(&context)) != 0) return retval; + subjobs = calloc(js->pub.children_num, sizeof (*subjobs)); + if ((retval = edg_wll_GenerateSubjobIds(context, + js->pub.jobId, js->pub.children_num, js->pub.seed, &subjobs) ) != 0 ) { + goto err; + } + js->pub.children = calloc(js->pub.children_num + 1, sizeof (*js->pub.children)); + for (i=0; ipub.children_num; i++) { + js->pub.children[i] = edg_wlc_JobIdUnparse(subjobs[i]); + } + edg_wll_FreeContext(context); + free(subjobs); + } memcpy(&h->status, &js->pub, sizeof(edg_wll_JobStat)); diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index 0d77044..7cbcc6e 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -400,8 +400,10 @@ limit_cycle_cleanup: edg_wll_FreeStmt(&sh); } while ( limit_loop ); - if ( eperm && !*jobs_out ) - edg_wll_SetError(ctx, EPERM, "matching jobs found but authorization failed"); + if ( !*jobs_out ) { + if (eperm) edg_wll_SetError(ctx, EPERM, "matching jobs found but authorization failed"); + else edg_wll_SetError(ctx, ENOENT, "no matching jobs found"); + } if ( i && (ret == 0) ) { diff --git a/org.glite.lb.server/src/ws_fault.c b/org.glite.lb.server/src/ws_fault.c index 90bb132..869cf01 100644 --- a/org.glite.lb.server/src/ws_fault.c +++ b/org.glite.lb.server/src/ws_fault.c @@ -2,32 +2,45 @@ #include "glite/lb/context-int.h" #include "soap_version.h" +#include "glite/security/glite_gscompat.h" #include "bk_ws_H.h" #include "bk_ws_Stub.h" +#if GSOAP_VERSION >= 20709 + #define GFITEM reason + #define GFNUM SOAP_TYPE_lbt__genericFault +#else + #define GFITEM lbe__genericFault + #define GFNUM SOAP_TYPE__genericFault +#endif + + void edg_wll_ErrToFault(const edg_wll_Context ctx,struct soap *soap) { char *et,*ed; struct SOAP_ENV__Detail *detail = soap_malloc(soap,sizeof *detail); +#if GSOAP_VERSION >= 20709 + struct lbt__genericFault *f = soap_malloc(soap,sizeof *f); +#else struct _genericFault *f = soap_malloc(soap,sizeof *f); +#endif + f->GFITEM = soap_malloc(soap,sizeof *f->GFITEM); + memset(f->GFITEM, 0, sizeof(*f->GFITEM)); - f->lbe__genericFault = soap_malloc(soap,sizeof *f->lbe__genericFault); - memset(f->lbe__genericFault, 0, sizeof(*f->lbe__genericFault)); - - f->lbe__genericFault->code = edg_wll_Error(ctx,&et,&ed); - f->lbe__genericFault->text = soap_malloc(soap,strlen(et)+1); - strcpy(f->lbe__genericFault->text,et); + f->GFITEM->code = edg_wll_Error(ctx,&et,&ed); + f->GFITEM->text = soap_malloc(soap,strlen(et)+1); + strcpy(f->GFITEM->text,et); free(et); if (ed) { - f->lbe__genericFault->description = soap_malloc(soap,strlen(ed)+1); - strcpy(f->lbe__genericFault->description,ed); + f->GFITEM->description = soap_malloc(soap,strlen(ed)+1); + strcpy(f->GFITEM->description,ed); free(ed); } - detail->__type = SOAP_TYPE__genericFault; + detail->__type = GFNUM; #if GSOAP_VERSION >= 20700 detail->fault = f; #else @@ -43,13 +56,19 @@ void edg_wll_ErrToFault(const edg_wll_Context ctx,struct soap *soap) void edg_wll_FaultToErr(const struct soap *soap,edg_wll_Context ctx) { - struct SOAP_ENV__Detail *detail = soap->version == 2 ? - soap->fault->SOAP_ENV__Detail : soap->fault->detail; - + struct SOAP_ENV__Detail *detail; struct lbt__genericFault *f; - if (detail->__type == SOAP_TYPE__genericFault) { -#if GSOAP_VERSION >= 20700 + if (!soap->fault) { + edg_wll_SetError(ctx,EINVAL,"SOAP: (no error info)"); + return; + } + + detail = soap->version == 2 ? soap->fault->SOAP_ENV__Detail : soap->fault->detail; + if (detail->__type == GFNUM) { +#if GSOAP_VERSION >= 20709 + f = detail->lbe__genericFault; +#elif GSOAP_VERSION >= 20700 f = ((struct _genericFault *) detail->fault) ->lbe__genericFault; #else @@ -62,7 +81,7 @@ void edg_wll_FaultToErr(const struct soap *soap,edg_wll_Context ctx) char *s; asprintf(&s,"SOAP: %s", soap->version == 2 ? - soap->fault->SOAP_ENV__Reason : soap->fault->faultstring); + GLITE_SECURITY_GSOAP_REASON(soap) : soap->fault->faultstring); edg_wll_SetError(ctx,EINVAL,s); free(s); } diff --git a/org.glite.lb.server/src/ws_query.c b/org.glite.lb.server/src/ws_query.c index 814f0ad..58086aa 100644 --- a/org.glite.lb.server/src/ws_query.c +++ b/org.glite.lb.server/src/ws_query.c @@ -1,10 +1,12 @@ #include -#include "glite/security/glite_gsplugin.h" - #include "glite/lb/context-int.h" #include "glite/lb/consumer.h" +#include "soap_version.h" +#include "glite/security/glite_gsplugin.h" +#include "glite/security/glite_gscompat.h" + #include "jobstat.h" #include "query.h" #include "bk_ws_H.h" @@ -12,8 +14,6 @@ #include "ws_fault.h" #include "ws_typeref.h" -#include "soap_version.h" - #if GSOAP_VERSION <= 20602 #define __lb__GetVersion __ns1__GetVersion #define __lb__JobStatus __ns1__JobStatus @@ -66,7 +66,8 @@ SOAP_FMAC5 int SOAP_FMAC6 __lb__JobStatus( return SOAP_FAULT; } - edg_wll_StatusToSoap(soap, &s, &(out->stat)); + out->stat = soap_malloc(soap, sizeof(*out->stat)); + edg_wll_StatusToSoap(soap, &s, out->stat); return SOAP_OK; } diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T index 425a8bd..361cab1 100644 --- a/org.glite.lb.server/src/ws_typeref.c.T +++ b/org.glite.lb.server/src/ws_typeref.c.T @@ -10,6 +10,16 @@ #include "glite/lb/consumer.h" /* XXX: references only, src and dest share pointers */ +#include "glite/security/glite_gscompat.h" + +#define VALUEEV_GET(X, V) GLITE_SECURITY_GSOAP_CHOICE_GET((X), V, event, 1) +#define VALUEEV_SET(X, V, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET((X), V, lbt, event, 1, VALUE) +#define VALUEEV_ISTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE((X), V, lbt, event, 1) +#define VALUEQR_GET(X, V) GLITE_SECURITY_GSOAP_CHOICE_GET((X), V, queryRecValue, 2) +#define VALUEQR_SETTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_SETTYPE((X), V, lbt, queryRecValue, 2) +#define VALUEQR_SET(X, V, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET((X), V, lbt, queryRecValue, 2, VALUE) +#define VALUEQR_ISTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE((X), V, lbt, queryRecValue, 2) + @@@{ # # generate the command for move native data to soap web services structures @@ -33,7 +43,7 @@ sub eventFieldAssign { $soap_fn = $1.ucfirst($2); }; $source = "$src->$native_en.$native_fn"; - $dest = "$dst->$soap_en->$soap_fn"; + $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn"; # print STDERR "$src, $dst, $soap_en, $soap_fn, $native_fn, $tn, $usuc\n"; if ($tn eq 'int') { @@ -61,7 +71,8 @@ sub eventFieldAssign { } elsif ($tn eq 'string' || $tn eq 'notifid') { gen $indent."$dest = soap_strdup(soap, $source);\n"; } elsif ($tn eq 'jobstat') { - gen $indent."edg_wll_StatusToSoap(soap, $source, &$dest);\n"; + gen $indent."$dest = soap_malloc(soap, sizeof(struct lbt__jobStatus))"; + gen $indent."edg_wll_StatusToSoap(soap, $source, $dest);\n"; } elsif ($tn eq 'timeval') { gen $indent."$dest = soap_malloc(soap, sizeof(struct lbt__timeval));\n"; gen $indent."$dest->tvSec = $source.tv_sec;\n"; @@ -92,7 +103,7 @@ sub eventFieldFree { while ($soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) { $soap_fn = $1.ucfirst($2); }; - $dest = "$dst->$soap_en->$soap_fn"; + $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn"; if ($tn eq 'int' || $tn eq 'port' || $tn eq 'bool' || $tn eq 'logsrc') { if ($f->{optional}) { @@ -148,13 +159,11 @@ void edg_wll_SoapToJobStatCode(enum lbt__statName in, edg_wll_JobStatCode *out) } } -int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt__jobStatus **dest) +int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt__jobStatus *js) { int i,j; char *s; - struct lbt__jobStatus *js; - if ( !(js = soap_malloc(soap, sizeof(*js))) ) return SOAP_FAULT; memset(js, 0, sizeof(*js)); edg_wll_JobStatCodeToSoap(src->state, &(js->state)); @@@{ @@ -180,14 +189,14 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt gen qq{ ! /* XXX: don't count UNDEF */ ! if (src->$_) { -! struct lbt__${usuc}Item **h = soap_malloc(soap,sizeof *h * (EDG_WLL_NUMBER_OF_STATCODES-1)); -! js->__size$usuc = EDG_WLL_NUMBER_OF_STATCODES-1; +! GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, ${usuc}Item) h; +! +! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, ${usuc}, struct lbt__${usuc}Item, EDG_WLL_NUMBER_OF_STATCODES-1); +! h = js->${usuc}; ! for (i=1; istate); -! h[i-1]->$fmap{$_} = src->$_\[i]; +! edg_wll_JobStatCodeToSoap(i,&GLITE_SECURITY_GSOAP_LIST_GET(h, i-1)->state); +! GLITE_SECURITY_GSOAP_LIST_GET(h, i-1)->$fmap{$_} = src->$_\[i]; ! } -! js->$usuc = h; ! } ! else { ! js->__size$usuc = 0; @@ -197,30 +206,22 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt } elsif ($ft eq 'taglist') { gen qq{ ! { -! struct lbt__tagValue *t,**tl = NULL; +! struct lbt__tagValue *t; +! +! for (i=0; src->$_ && src->$_\[i].tag; i++); +! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__tagValue, i); ! for (i=0; src->$_ && src->$_\[i].tag; i++) { -! t = soap_malloc(soap,sizeof *t); -! tl = realloc(tl,(i+1) * sizeof *tl); +! t = GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, i); ! t->tag = soap_strdup(soap,src->$_\[i].tag); ! t->value = soap_strdup(soap,src->$_\[i].value); -! tl[i] = t; ! } -! js->__size$usuc = i; -! if (i) { -! js->$usuc = soap_malloc(soap,i * sizeof *tl); -! memcpy(js->$usuc,tl,i * sizeof *tl); -! free(tl); -! } else js->$usuc = NULL; ! } }; } elsif ($ft eq 'stslist') { gen qq{ ! for (i=0; src->$_ && src->$_\[i].state; i++); -! if ((js->__size$usuc = i)) { -! js->$usuc = soap_malloc(soap,i * sizeof *js->$usuc); -! for (j=0; j$_+j,&js->$usuc\[j]); -! } -! else js->$usuc = NULL; +! GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__jobStatus, i); +! for (j=0; j$_+j,GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, j)); }; } elsif ($ft eq 'timeval') { gen "\tjs->$usuc = soap_malloc(soap,sizeof *js->$usuc);\n"; @@ -232,7 +233,6 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt } @@@} - *dest = js; return SOAP_OK; } @@ -267,9 +267,9 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg ! dest->$_\[0] = src->__size$usuc; ! for (i=0; i__size$usuc; i++) { ! edg_wll_JobStatCode s; -! edg_wll_SoapToJobStatCode(src->$usuc\[i]->state,&s); +! edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->state,&s); ! assert(s>=0); assert(s$_\[s+1] = src->$usuc\[i]->$fmap{$_}; +! dest->$_\[s+1] = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->$fmap{$_}; ! } ! } ! else dest->$_ = NULL; @@ -278,7 +278,7 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg gen qq{ ! if (src->__size$usuc) { ! dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_); -! for (i=0; i__size$usuc; i++) edg_wll_SoapToStatus(soap,src->$usuc\[i],dest->$_ + i); +! for (i=0; i__size$usuc; i++) edg_wll_SoapToStatus(soap,GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i),dest->$_ + i); ! } ! else dest->$_ = NULL; }; @@ -287,8 +287,8 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg if (src->__size$usuc) { dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_); for (i=0; i__size$usuc; i++) { - soap_unlink(soap,dest->$_\[i].tag = src->$usuc\[i]->tag); - soap_unlink(soap,dest->$_\[i].tag = src->$usuc\[i]->tag); + soap_unlink(soap,dest->$_\[i].tag = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->tag); + soap_unlink(soap,dest->$_\[i].tag = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->tag); } } else dest->$_ = NULL; @@ -422,18 +422,18 @@ int edg_wll_SoapToQueryVal( union edg_wll_QueryVal *out) { assert(in); assert(out); - if ( in->c ) { + if ( VALUEQR_ISTYPE(in, c) ) { if ( attr == EDG_WLL_QUERY_ATTR_JOBID || attr == EDG_WLL_QUERY_ATTR_PARENT ) { - if ( edg_wlc_JobIdParse(in->c, &(out->j)) ) return -1; + if ( edg_wlc_JobIdParse(VALUEQR_GET(in, c), &(out->j)) ) return -1; } else { - if ( !(out->c = strdup(in->c)) ) return -1; + if ( !(out->c = strdup(VALUEQR_GET(in, c))) ) return -1; } } - else if ( in->t ) { - out->t.tv_sec = in->t->tvSec; - out->t.tv_usec = in->t->tvUsec; + else if ( VALUEQR_ISTYPE(in, t) ) { + out->t.tv_sec = VALUEQR_GET(in, t)->tvSec; + out->t.tv_usec = VALUEQR_GET(in, t)->tvUsec; } - else if ( in->i ) out->i = *(in->i); + else if ( VALUEQR_ISTYPE(in, i) ) out->i = *(VALUEQR_GET(in, i)); return 0; } @@ -453,21 +453,23 @@ int edg_wll_QueryValToSoap( case EDG_WLL_QUERY_ATTR_DESTINATION: case EDG_WLL_QUERY_ATTR_HOST: case EDG_WLL_QUERY_ATTR_INSTANCE: - if ( in->c && !(out->c = soap_strdup(soap, in->c)) ) return SOAP_FAULT; + VALUEQR_SET(out, c, in->c ? soap_strdup(soap, in->c) : NULL); + if (in->c && !VALUEQR_GET(out, c) ) return SOAP_FAULT; break; case EDG_WLL_QUERY_ATTR_JOBID: case EDG_WLL_QUERY_ATTR_PARENT: { char *s = edg_wlc_JobIdUnparse(in->j); - out->c = soap_strdup(soap, s); + VALUEQR_SET(out, c, soap_strdup(soap, s)); free(s); - if ( !out->c ) return SOAP_FAULT; + if ( !VALUEQR_GET(out, c) ) return SOAP_FAULT; } break; case EDG_WLL_QUERY_ATTR_TIME: - out->t = soap_malloc(soap, sizeof(*(out->t))); - if ( !out->t ) return SOAP_FAULT; - out->t->tvSec = in->t.tv_sec; - out->t->tvUsec = in->t.tv_usec; + VALUEQR_SET(out, t, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, t))))); + if ( !VALUEQR_GET(out, t) ) return SOAP_FAULT; + VALUEQR_SETTYPE(out, t); + VALUEQR_GET(out, t)->tvSec = in->t.tv_sec; + VALUEQR_GET(out, t)->tvUsec = in->t.tv_usec; break; case EDG_WLL_QUERY_ATTR_STATUS: case EDG_WLL_QUERY_ATTR_DONECODE: @@ -476,9 +478,9 @@ int edg_wll_QueryValToSoap( case EDG_WLL_QUERY_ATTR_EVENT_TYPE: case EDG_WLL_QUERY_ATTR_RESUBMITTED: default: - out->i = soap_malloc(soap, sizeof(*(out->i))); - if ( !out->i ) return SOAP_FAULT; - *(out->i) = in->i; + VALUEQR_SET(out, i, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, i))))); + if ( !VALUEQR_GET(out, i) ) return SOAP_FAULT; + *(VALUEQR_GET(out, i)) = in->i; break; } @@ -523,13 +525,9 @@ err: int edg_wll_QueryRecToSoap( struct soap *soap, const edg_wll_QueryRec *in, - struct lbt__queryRecord **out) + struct lbt__queryRecord *qr) { - struct lbt__queryRecord *qr; - - - assert(in); assert(out); - if ( !(qr = soap_malloc(soap, sizeof(*qr))) ) return SOAP_FAULT; + assert(in); assert(qr); memset(qr, 0, sizeof(*qr)); if ( !in ) goto ret; edg_wll_QueryOpToSoap(in->op, &(qr->op)); @@ -545,7 +543,6 @@ int edg_wll_QueryRecToSoap( } ret: - *out = qr; return SOAP_OK; } @@ -563,7 +560,7 @@ int edg_wll_SoapToQueryConds(const struct lbt__queryConditions *in, edg_wll_Quer assert(in); assert(out); if ( !(qr = calloc(in->__sizerecord+1, sizeof(*qr))) ) goto err; for ( i = 0; i < in->__sizerecord; i++ ) - if ( edg_wll_SoapToQueryRec(in, in->record[i], qr+i) ) goto err; + if ( edg_wll_SoapToQueryRec(in, GLITE_SECURITY_GSOAP_LIST_GET(in->record, i), qr+i) ) goto err; *out = qr; return 0; @@ -578,15 +575,12 @@ err: int edg_wll_QueryCondsToSoap( struct soap *soap, const edg_wll_QueryRec *in, - struct lbt__queryConditions **out) + struct lbt__queryConditions *qc) { int i; - struct lbt__queryConditions *qc; - assert(out); - if ( !(qc = soap_malloc(soap, sizeof(*qc))) ) - return SOAP_FAULT; + assert(qc); memset(qc, 0, sizeof(*qc)); if ( !in ) goto ret; @@ -603,22 +597,21 @@ int edg_wll_QueryCondsToSoap( if ( !qc->tagName ) return SOAP_FAULT; } - qc->__sizerecord = 0; - while ( in[qc->__sizerecord].attr ) qc->__sizerecord++; + i = 0; + while ( in[i].attr ) i++; - if ( !qc->__sizerecord ) + if ( !i ) goto ret; - qc->record = soap_malloc(soap, sizeof(*(qc->record)) * qc->__sizerecord); + GLITE_SECURITY_GSOAP_LIST_CREATE(soap, qc, record, struct lbt__queryRecord, i); if ( !qc->record ) return SOAP_FAULT; for ( i = 0; in[i].attr; i++ ) - if ( edg_wll_QueryRecToSoap(soap, &in[i], &(qc->record[i])) ) + if ( edg_wll_QueryRecToSoap(soap, &in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc->record, i)) ) return SOAP_FAULT; ret: - *out = qc; return SOAP_OK; } @@ -628,7 +621,7 @@ ret: * \param IN in array of soap query condition * \param OUT out target array of queryRec */ -int edg_wll_SoapToQueryCondsExt(const struct lbt__queryConditions **in, int __sizecondition, edg_wll_QueryRec ***out) +int edg_wll_SoapToQueryCondsExt(GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in, int __sizecondition, edg_wll_QueryRec ***out) { int i; edg_wll_QueryRec **qr; @@ -636,7 +629,7 @@ int edg_wll_SoapToQueryCondsExt(const struct lbt__queryConditions **in, int __si assert(out); if ( !(qr = calloc(__sizecondition + 1, sizeof(*qr))) ) return -1; for ( i = 0; i < __sizecondition; i++ ) - if ( edg_wll_SoapToQueryConds(in[i], qr+i) ) goto err; + if ( edg_wll_SoapToQueryConds(GLITE_SECURITY_GSOAP_LIST_GET(in, i), qr+i) ) goto err; *out = qr; return 0; @@ -666,12 +659,10 @@ int edg_wll_QueryCondsExtToSoap( struct soap *soap, const edg_wll_QueryRec **in, int *out_size, - struct lbt__queryConditions ***out) + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *out) { int i, size; - struct lbt__queryConditions **qc; - - + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) qc; assert(in); assert(out); size = 0; @@ -679,12 +670,11 @@ int edg_wll_QueryCondsExtToSoap( if ( !size ) goto ret; - - qc = soap_malloc(soap, sizeof(*qc) * size); + GLITE_SECURITY_GSOAP_LIST_CREATE0(soap, qc, size, struct lbt__queryConditions, size); if ( !qc ) return SOAP_FAULT; for ( i = 0; in[i]; i++ ) - if ( edg_wll_QueryCondsToSoap(soap, in[i], &qc[i]) ) + if ( edg_wll_QueryCondsToSoap(soap, in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc, i)) ) return SOAP_FAULT; ret: @@ -723,12 +713,11 @@ int edg_wll_JobsQueryResToSoap( } if ( states ) { for ( i = 0; states[i].state; i++ ) ; - out->states = soap_malloc(soap, sizeof(*(out->states))*i); + GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, states, struct lbt__jobStatus, i); if ( !out->states ) return SOAP_FAULT; - out->__sizestates = i; for ( i = 0; states[i].state; i++ ) - if ( edg_wll_StatusToSoap(soap, states+i, out->states+i) ) + if ( edg_wll_StatusToSoap(soap, states+i, GLITE_SECURITY_GSOAP_LIST_GET(out->states, i)) ) return SOAP_FAULT; } @@ -881,13 +870,9 @@ static void edg_wll_SourceToSoap(edg_wll_Source in, enum lbt__eventSource *out) * \param IN event source event * \param OUT sevent target Soap event */ -int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lbt__event **sevent) { +int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lbt__event *sevent) { char *s; - *sevent = soap_malloc(soap, sizeof(**sevent)); - memset(*sevent, 0, sizeof(**sevent)); - if (!*sevent) return 0; - switch (event->any.type) { @@@{ my ($soap_en); @@ -903,14 +888,14 @@ int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lb }; gen qq { ! case EDG_WLL_EVENT_$u: -! (*sevent)->$soap_en = soap_malloc(soap, sizeof(struct lbt__event$soap_en)); +! VALUEEV_SET(sevent, $soap_en, soap_malloc(soap, sizeof(struct lbt__event$soap_en))); }; selectType $event '_common_'; for (getFieldsOrdered $event) { my ($f); $f = selectField $event $_; - eventFieldAssign("\t\t\t", "event", "(*sevent)", $e, $f, 1); + eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 1); } gen "\n"; @@ -920,7 +905,7 @@ gen qq { my ($f); $f = selectField $event $_; - eventFieldAssign("\t\t\t", "event", "(*sevent)", $e, $f, 0); + eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 0); } gen qq { ! break; @@ -951,7 +936,7 @@ void edg_wll_FreeSoapEvent(struct soap *soap, struct lbt__event *sevent) { $soap_en = $e; $soap_en = $1.ucfirst $2 while $soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen "\tif (sevent->$soap_en) {\n"; + gen "\tif (VALUEEV_ISTYPE(sevent, $soap_en)) {\n"; selectType $event '_common_'; for (getFieldsOrdered $event) { @@ -968,11 +953,14 @@ void edg_wll_FreeSoapEvent(struct soap *soap, struct lbt__event *sevent) { $f = selectField $event $_; eventFieldFree("\t\t", "sevent", $e, $f); } - gen qq "\t\tsoap_dealloc(soap, sevent->$soap_en);\n"; + gen qq "\t\tsoap_dealloc(soap, VALUEEV_GET(sevent, $soap_en));\n"; gen qq "\t}\n"; } @@@} + // XXX: element dealocation belongs to higher layer +#if GSOAP_VERSION <= 20706 soap_dealloc(soap, sevent); +#endif } @@ -1002,7 +990,7 @@ int edg_wll_EventsQueryResToSoap( const edg_wll_Event *events, struct _lbe__QueryEventsResponse *out) { - int memsize, i; + int i; struct lbt__event *event; /* alloc the events array */ @@ -1010,23 +998,27 @@ int edg_wll_EventsQueryResToSoap( memset(out, 0, sizeof(*out)); for (out->__sizeevents = 0; events[out->__sizeevents].any.type != EDG_WLL_EVENT_UNDEF; out->__sizeevents++); if (!out->__sizeevents) return SOAP_OK; - memsize = out->__sizeevents * sizeof(*out->events); - out->events = soap_malloc(soap, memsize); - memset(out->events, 0, memsize); + GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, events, struct lbt__event, out->__sizeevents); + for (i = 0; i < out->__sizeevents; i++) + memset(GLITE_SECURITY_GSOAP_LIST_GET(out->events, i), 0, sizeof(struct lbt__event)); if (!out->events) return SOAP_FAULT; for (i = 0; i < out->__sizeevents; i++) { - if (!edg_wll_EventToSoap(soap, &events[i], &out->events[i])) goto err; + if (!edg_wll_EventToSoap(soap, &events[i], GLITE_SECURITY_GSOAP_LIST_GET(out->events, i))) goto err; } return SOAP_OK; err: - event = out->events[0]; + event = GLITE_SECURITY_GSOAP_LIST_GET(out->events, 0); while (event) { edg_wll_FreeSoapEvent(soap, event); event++; } + /* + * XXX: better list destroy here w/o deallocstion in + * edg_wll_FreeSoapEvent + */ soap_dealloc(soap, out->events); return SOAP_FAULT; @@ -1045,7 +1037,7 @@ static int edg_wll_SoapToEvent( { my $comment = getTypeComment $event $name; $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]_]*)/; - gen "\t\tif (in->$name) {\n"; + gen "\t\tif (VALUEEV_ISTYPE(in, $name)) {\n"; my $event_type = uc $name; gen "\t\t\tout->type = EDG_WLL_EVENT_$event_type;\n"; @@ -1068,37 +1060,38 @@ static int edg_wll_SoapToEvent( $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/); my $fuc = ucfirst($usuc); + my $src = "VALUEEV_GET(in, $name)->$usuc"; if ($ft eq 'jobid') { - gen "\t\t\tif (in->$name->$usuc)\n"; - gen "\t\t\t\tedg_wlc_JobIdParse(in->$name->$usuc,&out->$act.$fn);\n"; + gen "\t\t\tif ($src)\n"; + gen "\t\t\t\tedg_wlc_JobIdParse($src,&out->$act.$fn);\n"; } elsif ($ft eq 'timeval') { - gen "\t\t\tout->$act.$fn.tv_sec = in->$name->$usuc->tvSec;\n"; - gen "\t\t\tout->$act.$fn.tv_usec = in->$name->$usuc->tvUsec;\n"; + gen "\t\t\tout->$act.$fn.tv_sec = $src->tvSec;\n"; + gen "\t\t\tout->$act.$fn.tv_usec = $src->tvUsec;\n"; } elsif ($ft eq 'string') { - gen "\t\t\tout->$act.$fn = in->$name->$usuc;\n"; - gen "\t\t\tsoap_unlink(soap,in->$name->$usuc);\n"; + gen "\t\t\tout->$act.$fn = $src;\n"; + gen "\t\t\tsoap_unlink(soap,$src);\n"; } elsif ($ft eq 'int') { if ($f->{codes}) { if ($type eq '_common_') { - gen "\t\t\tedg_wll_SoapTo$fuc(in->$name->$usuc,&(out->$act.$fn));\n"; + gen "\t\t\tedg_wll_SoapTo$fuc($src,&(out->$act.$fn));\n"; } else { - gen "\t\t\tedg_wll_SoapTo$name$fuc(in->$name->$usuc,&(out->$act.$fn));\n"; + gen "\t\t\tedg_wll_SoapTo$name$fuc($src,&(out->$act.$fn));\n"; } } elsif ($f->{optional}) { - gen "\t\t\tout->$act.$fn = *in->$name->$usuc;\n"; + gen "\t\t\tout->$act.$fn = *$src;\n"; } else { - gen "\t\t\tout->$act.$fn = in->$name->$usuc;\n"; + gen "\t\t\tout->$act.$fn = $src;\n"; } } elsif ($ft eq 'logsrc') { - gen "\t\t\tedg_wll_SoapToSource(in->$name->$usuc, &(out->$act.$fn));\n"; + gen "\t\t\tedg_wll_SoapToSource($src, &(out->$act.$fn));\n"; } else { - gen "\t\t\tout->$act.$fn = in->$name->$usuc;\n"; + gen "\t\t\tout->$act.$fn = $src;\n"; } } } @@ -1131,7 +1124,7 @@ int edg_wll_SoapToEventsQueryRes( if (!events) return SOAP_FAULT; for (i=0; i < in.__sizeevents; i++) { - if (edg_wll_SoapToEvent(soap, in.events[i], &events[i]) != SOAP_OK) { + if (edg_wll_SoapToEvent(soap, GLITE_SECURITY_GSOAP_LIST_GET(in.events, i), &events[i]) != SOAP_OK) { free_events(events); return SOAP_FAULT; } diff --git a/org.glite.lb.server/src/ws_typeref.h b/org.glite.lb.server/src/ws_typeref.h index e458ab9..924cc51 100644 --- a/org.glite.lb.server/src/ws_typeref.h +++ b/org.glite.lb.server/src/ws_typeref.h @@ -8,7 +8,7 @@ extern "C" { extern void edg_wll_JobStatCodeToSoap(edg_wll_JobStatCode, enum lbt__statName *); extern void edg_wll_SoapToJobStatCode(enum lbt__statName, edg_wll_JobStatCode *); -extern void edg_wll_StatusToSoap(struct soap *, edg_wll_JobStat const *, struct lbt__jobStatus **); +extern void edg_wll_StatusToSoap(struct soap *, edg_wll_JobStat const *, struct lbt__jobStatus *); extern void edg_wll_SoapToStatus(struct soap *, struct lbt__jobStatus const *, edg_wll_JobStat *); extern void edg_wll_SoapToJobStatFlags(struct lbt__jobFlags const *, int *); @@ -39,7 +39,7 @@ extern int edg_wll_SoapToQueryRec( edg_wll_QueryRec *out); extern int edg_wll_QueryRecToSoap(struct soap *, const edg_wll_QueryRec *, - struct lbt__queryRecord **); + struct lbt__queryRecord *); extern int edg_wll_SoapToQueryConds( @@ -47,16 +47,16 @@ extern int edg_wll_SoapToQueryConds( edg_wll_QueryRec **); extern int edg_wll_QueryCondsToSoap(struct soap *, const edg_wll_QueryRec *, - struct lbt__queryConditions **); + struct lbt__queryConditions *); extern int edg_wll_SoapToQueryCondsExt( - const struct lbt__queryConditions **, + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in, int __sizecondition, edg_wll_QueryRec ***); extern int edg_wll_QueryCondsExtToSoap(struct soap *, const edg_wll_QueryRec **, int *, - struct lbt__queryConditions ***); + GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *); extern int edg_wll_JobsQueryResToSoap(struct soap *, edg_wlc_JobId *, @@ -72,7 +72,7 @@ extern int edg_wll_SoapToEventsQueryRes( edg_wll_Event **); -extern int edg_wll_EventToSoap(struct soap*, const edg_wll_Event *, struct lbt__event **); +extern int edg_wll_EventToSoap(struct soap*, const edg_wll_Event *, struct lbt__event *); extern void edg_wll_FreeSoapEvent(struct soap *, struct lbt__event *); #ifdef __cplusplus diff --git a/org.glite.lb.server/test/test_soap_conv.cpp b/org.glite.lb.server/test/test_soap_conv.cpp index f57d744..10770dd 100644 --- a/org.glite.lb.server/test/test_soap_conv.cpp +++ b/org.glite.lb.server/test/test_soap_conv.cpp @@ -287,10 +287,12 @@ void SoapConvTest::Conditions() struct edgwll__QueryConditions *soapConds, *soapConds2; edg_wll_QueryRec **stdConds2; int ret; + int size; + void *tmp1; ret = edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec**)stdConds, &soapConds); CPPUNIT_ASSERT_MESSAGE("edg_wll_QueryCondsExtToSoap()", ret == SOAP_OK); - ret = edg_wll_SoapToQueryCondsExt(soapConds, &stdConds2); + ret = edg_wll_SoapToQueryCondsExt(soapConds, &stdConds2, &size, &tmp); CPPUNIT_ASSERT_MESSAGE("edg_wll_SoapToQueryCondsExt()", !ret); CPPUNIT_ASSERT_MESSAGE("Converted std results differs", !stdCondsCmp(stdConds, stdConds2)); -- 1.8.2.3