--- /dev/null
+/* $Id: */
+
+#include <stddef.h>
+#include <string.h>
+
+#include "glite/lb/consumer.h"
+#include "glite/lb/context-int.h"
+#include "glite/lb/consumer_fake.h"
+
+
+#define NUM_EVENTS 3
+
+
+static edg_wll_QueryEvents_cb_f *QueryEvents_cb = NULL;
+static edg_wll_QueryListener_cb_f *QueryListener_cb = NULL;
+
+
+/* register the query callback */
+int edg_wll_RegisterTestQueryEvents(edg_wll_QueryEvents_cb_f *cb) {
+ if (QueryEvents_cb) return 0;
+
+ QueryEvents_cb = cb;
+ return 1;
+}
+
+
+/* register the listener callback */
+int edg_wll_RegisterTestQueryListener(edg_wll_QueryListener_cb_f *cb) {
+ if (QueryListener_cb) return 0;
+
+ QueryListener_cb = cb;
+ return 1;
+}
+
+
+/* unregister the query callback */
+void edg_wll_UnregisterTestQueryEvents() {
+ QueryEvents_cb = NULL;
+}
+
+
+/* unregister the listener callback */
+void edg_wll_UnregisterTestQueryListener() {
+ QueryEvents_cb = NULL;
+}
+
+
+/* (belongs to common/src/events.c.T) */
+static void edg_wll_PrepareEvent(edg_wll_EventCode eventcode, edg_wll_Event *event) {
+ edg_wll_Event *tmpevent;
+
+ // hide not clean code here :-)
+ tmpevent = edg_wll_InitEvent(eventcode);
+ memcpy(event, tmpevent, sizeof(edg_wll_Event));
+ free(tmpevent);
+}
+
+
+/* fake implementation of QueryEvents() */
+int edg_wll_QueryEvents(
+ edg_wll_Context context,
+ const edg_wll_QueryRec *job_conditions,
+ const edg_wll_QueryRec *event_conditions,
+ edg_wll_Event **events
+) {
+ edg_wll_EventCode event_code;
+ int i, j, err;
+ edg_wlc_JobId jobid;
+
+ edg_wll_ResetError(context);
+
+ // get asked event type or use _EVENT_CHKPT
+ i = 0;
+ while (event_conditions[i].attr != EDG_WLL_QUERY_ATTR_UNDEF && (event_conditions[i].attr != EDG_WLL_QUERY_ATTR_EVENT_TYPE || event_conditions[i].op != EDG_WLL_QUERY_OP_EQUAL)) i++;
+ if (event_conditions[i].attr == EDG_WLL_QUERY_ATTR_UNDEF)
+ event_code = EDG_WLL_EVENT_CHKPT;
+ else
+ event_code = event_conditions[i].value.i;
+
+ // create events
+ *events = calloc(NUM_EVENTS + 1, sizeof(edg_wll_Event));
+ for (i = 0; i < NUM_EVENTS; i++) {
+ edg_wll_PrepareEvent(event_code, &(*events)[i]);
+ }
+ (*events)[NUM_EVENTS].type = EDG_WLL_EVENT_UNDEF;
+
+ // adjust events according to the query parameters
+ i = 0;
+ while (job_conditions[i].attr != EDG_WLL_QUERY_ATTR_UNDEF) {
+ if (job_conditions[i].attr == EDG_WLL_QUERY_ATTR_JOBID && job_conditions[i].op == EDG_WLL_QUERY_OP_EQUAL) {
+ jobid = job_conditions[i].value.j;
+ for (j = 0; j < NUM_EVENTS; j++) {
+ if ((err = edg_wlc_JobIdDup(jobid, &(*events)[i].any.jobId)) != 0) goto error;
+ }
+ break;
+ }
+ i++;
+ }
+
+ // adjusting callback
+ if (QueryEvents_cb)
+ QueryEvents_cb(context, events);
+
+ if ((err = edg_wll_Error(context, NULL, NULL)) == 0) return 0;
+
+error:
+ i = 0;
+ while ((*events)[i].type != EDG_WLL_EVENT_UNDEF) {
+ edg_wll_FreeEvent(&(*events)[i]);
+ i++;
+ }
+ free(*events);
+
+ return edg_wll_SetError(context, err, NULL);
+}
+
+
+/* fake implementation of QueryListener() */
+int edg_wll_QueryListener(
+ edg_wll_Context context,
+ edg_wlc_JobId jobId,
+ const char *name,
+ char **host,
+ uint16_t *port
+) {
+ edg_wll_ResetError(context);
+
+ if (QueryListener_cb) return QueryListener_cb(context, host, port);
+ else {
+ *host = strdup("localhost");
+ *port = 12345;
+
+ return edg_wll_Error(context, NULL, NULL);
+ }
+}
+
+
+/* cut'nd pasted from consumer.c */
+int edg_wll_JobLog(
+ edg_wll_Context ctx,
+ edg_wlc_JobId job,
+ edg_wll_Event **eventsOut)
+{
+ edg_wll_QueryRec j[2], e[2];
+
+ memset(j,0,sizeof j);
+ memset(e,0,sizeof e);
+
+ j[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
+ j[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ j[0].value.j = job;
+
+ e[0].attr = EDG_WLL_QUERY_ATTR_LEVEL;
+ e[0].op = EDG_WLL_QUERY_OP_LESS;
+ e[0].value.i = ctx->p_level + 1;
+
+ return edg_wll_QueryEvents(ctx,j,e,eventsOut);
+}
--- /dev/null
+#ident "$Header$"
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "glite/lb/events_parse.h"
+#include "glite/lb/consumer.h"
+#include "glite/wmsutils/jobid/cjobid.h"
+#ifdef USE_CALLBACKS
+ #include "glite/lb/consumer_fake.h"
+#endif
+
+static void free_events(edg_wll_Event *);
+
+static void help(const char* n)
+{
+ fprintf(stderr,"usage: %s [-r repeat] [-d delay] <jobid>\n", n);
+ exit(1);
+}
+
+#ifdef USE_CALLBACKS
+static int query_events_cb(edg_wll_Context context, edg_wll_Event **events) {
+ int i;
+ edg_wll_Event *event;
+
+ i = 0;
+ while ((event = (*events) + i)->type != EDG_WLL_EVENT_UNDEF) {
+ event->any.timestamp.tv_sec = (double)rand() / RAND_MAX * 1000000000;
+ event->any.timestamp.tv_usec = (double)rand() / RAND_MAX * 1000000;
+ i++;
+ }
+
+ return 0;
+}
+#endif
+
+int main(int argc,char **argv)
+{
+ edg_wll_Context ctx;
+ char *errt,*errd;
+ edg_wll_Event *events;
+ edg_wlc_JobId job;
+ int i,opt,delay = 1,count = 0;
+
+ if (argc < 2)
+ help(argv[0]);
+
+ while ((opt=getopt(argc,argv,"r:d:")) != -1)
+ switch (opt) {
+ case 'd': delay = atoi(optarg); break;
+ case 'r': count = atoi(optarg); break;
+ default:
+ help(argv[0]);
+ }
+
+ edg_wll_InitContext(&ctx);
+ if (edg_wlc_JobIdParse(argv[optind],&job)) {
+ fprintf(stderr,"%s: can't parse job ID\n",argv[1]);
+ return 1;
+ }
+
+#ifdef USE_CALLBACKS
+ edg_wll_RegisterTestQueryEvents(query_events_cb);
+#endif
+
+ if ( edg_wll_JobLog(ctx,job,&events) )
+ {
+ if ( edg_wll_Error(ctx, &errt, &errd) != E2BIG )
+ goto err;
+
+ fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd);
+ }
+
+ for ( i = 0; events[i].type != EDG_WLL_EVENT_UNDEF; i++ )
+ {
+ char *e = edg_wll_UnparseEvent(ctx,events+i);
+ fputs(e,stdout);
+ fputs("\n",stdout);
+ free(e);
+ }
+
+ free_events(events);
+ printf("\nFound %d events\n",i);
+
+ while (count--) {
+ puts("Sleeping ...");
+ sleep(delay);
+ if (edg_wll_JobLog(ctx,job,&events)) {
+ edg_wll_Error(ctx,&errt,&errd);
+ fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd);
+ free(errt); free(errd); errt = errd = NULL;
+ free_events(events);
+ }
+ else puts("OK");
+ }
+
+ edg_wlc_JobIdFree(job);
+ edg_wll_FreeContext(ctx);
+
+#ifdef USE_CALLBACKS
+ edg_wll_UnregisterTestQueryEvents();
+#endif
+
+ return 0;
+
+err:
+#ifdef USE_CALLBACKS
+ edg_wll_UnregisterTestQueryEvents();
+#endif
+ switch (edg_wll_Error(ctx,&errt,&errd)) {
+ case 0: break;
+ case ENOENT:
+ puts("No events found");
+ break;
+ default:
+ fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd);
+ return 1;
+ }
+
+ edg_wlc_JobIdFree(job);
+ edg_wll_FreeContext(ctx);
+
+ return 0;
+}
+
+static void free_events(edg_wll_Event *events)
+{
+ int i;
+
+ if (events) {
+ for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++) edg_wll_FreeEvent(&(events[i]));
+ edg_wll_FreeEvent(&(events[i])); /* free last line */
+ free(events);
+ events = NULL;
+ }
+}