From: Aleš Křenek Date: Tue, 29 Mar 2005 15:44:57 +0000 (+0000) Subject: - use server-bones and gsoap plugin X-Git-Tag: gridsite-core_R_1_1_8~51 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=f9dd3fcfee6631fab94e22d149e52c1035c8feaa;p=jra1mw.git - use server-bones and gsoap plugin - first steps towards file-type plugin --- diff --git a/org.glite.jp.primary/Makefile b/org.glite.jp.primary/Makefile index 2e9b3c4..bfcac49 100644 --- a/org.glite.jp.primary/Makefile +++ b/org.glite.jp.primary/Makefile @@ -29,9 +29,11 @@ GLOBUS_LIBS:=-L${globus_prefix}/lib \ -lglobus_common_${nothrflavour} \ -lglobus_gssapi_gsi_${nothrflavour} +GLOBUS_CFLAGS:=-I${globus_prefix}/include/${nothrflavour} + DEBUG:=-g -O0 -DDEBUG -CFLAGS:=${DEBUG} -I. -I${top_srcdir}/src -I${gsoap_prefix}/include -I${stagedir}/include +CFLAGS:=${DEBUG} -I. -I${top_srcdir}/src -I${gsoap_prefix}/include -I${stagedir}/include ${GLOBUS_CFLAGS} LDFLAGS:=-L${stagedir}/lib LINK:=libtool --mode=link ${CC} ${LDFLAGS} @@ -49,7 +51,7 @@ gsoap_version=`${gsoap_prefix}/bin/soapcpp2 -version 2>&1 | cut -d' ' -f4 | perl CFLAGS+=-DGSOAP_VERSION=${gsoap_version} -SRCS:= simple_server.c soap_ops.c \ +SRCS:= bones_server.c soap_ops.c \ ftp_backend.c \ feed.c tags.c\ is_client.c \ @@ -64,17 +66,19 @@ OBJS:=${SRCS:.c=.o} EXA_OBJS:=${EXA_SRCS:.c=.o} COMMONLIB:=-lglite_jp_common -GSOAPLIB:=-L${gsoap_prefix}/lib -lgsoap${GSOAP_DEBUG} +BONESLIB:=-lglite_lb_server_bones +GSOAPLIB:=-lglite_security_gsoap_plugin_${nothrflavour} -lglite_security_gss_${nothrflavour} \ + -L${gsoap_prefix}/lib -lgsoap${GSOAP_DEBUG} -L${ares_prefix}/lib -lares default all: compile compile: ${daemon} ${example} ${daemon}: ${OBJS} - ${LINK} -o $@ ${OBJS} ${COMMONLIB} ${GSOAPLIB} ${GLOBUS_LIBS} + ${LINK} -o $@ ${OBJS} ${BONESLIB} ${COMMONLIB} ${GSOAPLIB} ${GLOBUS_LIBS} ${example}: ${EXA_OBJS} - ${LINK} -o $@ ${EXA_OBJS} ${GSOAPLIB} + ${LINK} -o $@ ${EXA_OBJS} ${GSOAPLIB} ${GLOBUS_LIBS} JobProvenanceIS.xh JobProvenancePS.xh: %.xh: %.wsdl JobProvenanceTypes.wsdl typemap.dat cp ${stagedir}/interface/JobProvenanceTypes.wsdl . @@ -105,7 +109,7 @@ env_C.c env_Server.c: # -simple_server.o: ${is_prefix}H.h ${ps_prefix}H.h +bones_server.o simple_server.o: ${is_prefix}H.h ${ps_prefix}H.h check: -echo nothing yet diff --git a/org.glite.jp.primary/examples/jpps-test.c b/org.glite.jp.primary/examples/jpps-test.c index 8cf9c6f..638005a 100644 --- a/org.glite.jp.primary/examples/jpps-test.c +++ b/org.glite.jp.primary/examples/jpps-test.c @@ -3,6 +3,8 @@ #include #include +#include "glite/security/glite_gsplugin.h" + #include "jpps_H.h" #include "jpps_.nsmap" @@ -13,7 +15,7 @@ static void usage(const char *me) fprintf(stderr,"%s: [-s server-url] operation args \n\n" " operations are:\n" " RegisterJob jobid\n" - " StartUpload jobid class(0,1,2) commit_before mimetype\n" + " StartUpload jobid class commit_before mimetype\n" " CommitUpload destination\n" " RecordTag jobid tagname sequence stringvalue\n" " GetJob jobid\n" @@ -90,6 +92,8 @@ int main(int argc,char *argv[]) soap_init(soap); soap_set_namespaces(soap, jpps__namespaces); + soap_register_plugin(soap,glite_gsplugin); + while ((opt = getopt(argc,argv,"s:")) >= 0) switch (opt) { case 's': server = optarg; argv += 2; @@ -109,7 +113,7 @@ int main(int argc,char *argv[]) if (argc != 6) usage(argv[0]); if (!check_fault(soap, soap_call_jpsrv__StartUpload(soap, server, "", - argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], &r))) { + argv[2], argv[3], "", atoi(argv[4]), argv[5], &r))) { printf("Destination: %s\nCommit before: %s\n", r.destination, ctime(&r.commitBefore)); } } else if (!strcasecmp(argv[1], "CommitUpload")) { diff --git a/org.glite.jp.primary/interface/file_plugin.h b/org.glite.jp.primary/interface/file_plugin.h new file mode 100644 index 0000000..32f1cb0 --- /dev/null +++ b/org.glite.jp.primary/interface/file_plugin.h @@ -0,0 +1,51 @@ +#ifndef __GLITE_JP_FILEPLUGIN +#define __GLITE_JP_FILEPLUGIN + +/** Methods of the file plugin. */ + +typedef struct _glite_jp_fplug_op_t { + +/** Open a file. +\param[in] fpctx Context of the plugin, returned by its init. +\param[in] bhandle Handle of the file via JPPS backend. +\param[out] handle Handle to the opened file structure, to be passed to other plugin functions. +*/ + int (*open)(void *fpctx,void *bhandle,void **handle); + +/** Close the file. Free data associated to a handle */ + int (*close)(void *fpctx,void *handle); + +/** Retrieve value(s) of an attribute. +\param[in] fpctx Plugin context. +\param[in] handle Handle of the opened file. +\param[in] attr Queried attribute. +\param[out] attrval GLITE_JP_ATTR_UNDEF-terminated list of value(s) of the attribute. + If there are more and there is an interpretation of their order + they must be sorted, eg. current value of tag is the last one. +\retval 0 success +\retval ENOSYS this attribute is not defined by this type of file +\retval ENOENT no value is present +*/ + int (*attr)(void *fpctx,void *handle,glite_jp_attr_t attr,glite_jp_attrval_t **attrval); + +/** File type specific operation. +\param[in] fpctx Plugin context. +\param[in] handle Handle of the opened file. +\param[in] oper Code of the operation, specific for a concrete plugin. +*/ + int (*op)(void *fpctx,void *handle,int oper,...); + +} glite_jp_fplug_op_t; + +/** Initialisation function of the plugin. + Called after dlopen(), must be named "init". +\param[in] ctx JPPS context +\param[out] uris NULL-terminated list of file types (URIs) handled by the plugin +\param[out] ops Plugin methods. +\param[out] fpctx Initialised plugin context, to be passed to the methods. +*/ + +typedef int (*glite_jp_fplug_init_t)(glite_jp_context_t ctx,char ***uris,glite_jp_fplug_op_t *ops,void **fpctx); + + +#endif diff --git a/org.glite.jp.primary/src/backend.h b/org.glite.jp.primary/src/backend.h index bb143e9..538361c 100644 --- a/org.glite.jp.primary/src/backend.h +++ b/org.glite.jp.primary/src/backend.h @@ -23,7 +23,8 @@ int glite_jppsbe_register_job( int glite_jppsbe_start_upload( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, /* must be filesystem-friendly */ + const char *name, /* optional name within the class */ const char *content_type, char **destination_out, time_t *commit_before_inout @@ -38,20 +39,22 @@ int glite_jppsbe_destination_info( glite_jp_context_t ctx, const char *destination, char **job_out, - glite_jp_fileclass_t *class_out + char **class_out ); int glite_jppsbe_get_job_url( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, + const char *name, /* optional within class */ char **url_out ); int glite_jppsbe_open_file( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, + const char *name, /* optional within class */ int mode, void **handle_out ); diff --git a/org.glite.jp.primary/src/bones_server.c b/org.glite.jp.primary/src/bones_server.c new file mode 100644 index 0000000..ac348b1 --- /dev/null +++ b/org.glite.jp.primary/src/bones_server.c @@ -0,0 +1,251 @@ +#include +#include +#include +#include + +#include "glite/jp/types.h" +#include "glite/jp/context.h" + +#include "glite/lb/srvbones.h" +#include "glite/security/glite_gss.h" + +#include +#include "glite/security/glite_gsplugin.h" + + + +#include "jpps_H.h" + +#define CONN_QUEUE 20 + +extern SOAP_NMAC struct Namespace jpis__namespaces[],jpps__namespaces[]; + +static int newconn(int,struct timeval *,void *); +static int request(int,struct timeval *,void *); +static int reject(int); +static int disconn(int,struct timeval *,void *); +static int data_init(void **data); + +static struct glite_srvbones_service stab = { + "JP Primary Storage", -1, newconn, request, reject, disconn +}; + +static time_t cert_mtime; +static char *server_cert, *server_key, *cadir; +static gss_cred_id_t mycred = GSS_C_NO_CREDENTIAL; +static char *mysubj; + +static char *port = "8901"; +static int debug = 1; + +static glite_jp_context_t ctx; + +int main(int argc, char *argv[]) +{ + int one = 1; + edg_wll_GssStatus gss_code; + struct sockaddr_in a; + + /* XXX: read options */ + + glite_jp_init_context(&ctx); + + if (glite_jppsbe_init(ctx, &argc, argv)) { + /* XXX log */ + fputs(glite_jp_error_chain(ctx), stderr); + exit(1); + } + + srand48(time(NULL)); /* feed id generation */ + + stab.conn = socket(PF_INET, SOCK_STREAM, 0); + if (stab.conn < 0) { + perror("socket"); + return 1; + } + + setsockopt(stab.conn,SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); + + a.sin_family = AF_INET; + a.sin_addr.s_addr = INADDR_ANY; + a.sin_port = htons(atoi(port)); + if (bind(stab.conn,(struct sockaddr *) &a, sizeof(a)) ) { + char buf[200]; + + snprintf(buf,sizeof(buf),"bind(%d)",atoi(port)); + perror(buf); + return 1; + } + + if (listen(stab.conn,CONN_QUEUE)) { + perror("listen()"); + return 1; + } + + if (!server_cert || !server_key) + fprintf(stderr, "%s: WARNING: key or certificate file not specified," + "can't watch them for changes\n", + argv[0]); + + if ( cadir ) setenv("X509_CERT_DIR", cadir, 1); + edg_wll_gss_watch_creds(server_cert, &cert_mtime); + + if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &mysubj, &gss_code)) + fprintf(stderr,"Server idenity: %s\n",mysubj); + else fputs("WARNING: Running unauthenticated\n",stderr); + + /* XXX: daemonise */ + + glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT,1); + glite_srvbones_run(data_init,&stab,1 /* XXX: entries in stab */,debug); + + return 0; +} + +static int data_init(void **data) +{ + *data = (void *) soap_new(); + + printf("[%d] slave started\n",getpid()); + + return 0; +} + +static int newconn(int conn,struct timeval *to,void *data) +{ + struct soap *soap = (struct soap *) data; + glite_gsplugin_Context plugin_ctx; + + gss_cred_id_t newcred = GSS_C_NO_CREDENTIAL; + edg_wll_GssStatus gss_code; + gss_name_t client_name = GSS_C_NO_NAME; + gss_buffer_desc token = GSS_C_EMPTY_BUFFER; + OM_uint32 maj_stat,min_stat; + + + int ret = 0; + + soap_init2(soap,SOAP_IO_KEEPALIVE,SOAP_IO_KEEPALIVE); + soap_set_namespaces(soap,jpps__namespaces); + soap->user = (void *) ctx; /* XXX: one instance per slave */ + +/* not yet: client to JP index + ctx->other_soap = soap_new(); + soap_init(ctx->other_soap); + soap_set_namespaces(ctx->other_soap,jpis__namespaces); +*/ + + + glite_gsplugin_init_context(&plugin_ctx); + plugin_ctx->connection = calloc(1,sizeof *plugin_ctx->connection); + soap_register_plugin_arg(soap,glite_gsplugin,plugin_ctx); + + 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)) + { + + printf("[%d] reloading credentials\n",getpid()); /* XXX: log */ + gss_release_cred(&min_stat,&mycred); + mycred = newcred; + } + break; + case -1: + printf("[%d] edg_wll_gss_watch_creds failed\n", getpid()); /* XXX: log */ + break; + } + + /* TODO: DNS paranoia etc. */ + + if (edg_wll_gss_accept(mycred,conn,to,plugin_ctx->connection,&gss_code)) { + printf("[%d] GSS connection accept failed, closing.\n", getpid()); + ret = 1; + goto cleanup; + } + + maj_stat = gss_inquire_context(&min_stat,plugin_ctx->connection->context, + &client_name, NULL, NULL, NULL, NULL, NULL, NULL); + + if (!GSS_ERROR(maj_stat)) + maj_stat = gss_display_name(&min_stat,client_name,&token,NULL); + + if (ctx->peer) free(ctx->peer); + if (!GSS_ERROR(maj_stat)) { + printf("[%d] client DN: %s\n",getpid(),(char *) token.value); /* XXX: log */ + + ctx->peer = strdup(token.value); + memset(&token, 0, sizeof(token)); + } + else { + printf("[%d] annonymous client\n",getpid()); + ctx->peer = NULL; + } + + if (client_name != GSS_C_NO_NAME) gss_release_name(&min_stat, &client_name); + if (token.value) gss_release_buffer(&min_stat, &token); + + return 0; + +cleanup: + glite_gsplugin_free_context(plugin_ctx); + soap_end(soap); + + return ret; +} + +static int request(int conn,struct timeval *to,void *data) +{ + struct soap *soap = data; + glite_jp_context_t ctx = soap->user; + + glite_gsplugin_set_timeout(glite_gsplugin_get_context(soap),to); + +/* FIXME: does not work, ask nykolas */ + soap->max_keep_alive = 1; /* XXX: prevent gsoap to close connection */ + soap_begin(soap); + if (soap_begin_recv(soap)) { + if (soap->error < SOAP_STOP) { + soap_send_fault(soap); + return -1; + } + return ENOTCONN; + } + + if (soap_envelope_begin_in(soap) + || soap_recv_header(soap) + || soap_body_begin_in(soap) + || jpps__serve_request(soap) +#if GSOAP_VERSION >= 20700 + || (soap->fserveloop && soap->fserveloop(soap)) +#endif + ) + { + soap_send_fault(soap); + return -1; + } + + glite_jp_run_deferred(ctx); +} + +static int reject(int conn) +{ + int flags = fcntl(conn, F_GETFL, 0); + + fcntl(conn,F_SETFL,flags | O_NONBLOCK); + edg_wll_gss_reject(conn); + + return 0; +} + +static int disconn(int conn,struct timeval *to,void *data) +{ + struct soap *soap = (struct soap *) data; + soap_end(soap); // clean up everything and close socket + + return 0; +} + + +/* XXX: we don't use it */ +SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} }; diff --git a/org.glite.jp.primary/src/ftp_backend.c b/org.glite.jp.primary/src/ftp_backend.c index b598f0a..6a7fcf6 100644 --- a/org.glite.jp.primary/src/ftp_backend.c +++ b/org.glite.jp.primary/src/ftp_backend.c @@ -45,6 +45,8 @@ static struct option ftpbe_opts[] = { { NULL, 0, NULL, 0 } }; +/* obsolete */ +#if 0 static struct { glite_jp_fileclass_t type; char * fname; @@ -77,6 +79,7 @@ static glite_jp_fileclass_t fname_to_class(char* fname) return GLITE_JP_FILECLASS_UNDEF; } +#endif static int config_check( glite_jp_context_t ctx, @@ -375,7 +378,8 @@ static int remove_from_gridmap(glite_jp_context_t ctx, const char *dn) int glite_jppsbe_start_upload( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, + const char *name, /* TODO */ const char *content_type, char **destination_out, time_t *commit_before_inout @@ -385,7 +389,6 @@ int glite_jppsbe_start_upload( char *lock_fname = NULL; FILE *lockfile = NULL; FILE *regfile = NULL; - char *fname = NULL; char *data_dir = NULL; char *data_lock = NULL; char *ju = NULL; @@ -403,8 +406,7 @@ int glite_jppsbe_start_upload( assert(job!=NULL); assert(destination_out!=NULL); - fname = class_to_fname(class); - assert(fname!=NULL); + assert(class!=NULL); if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { err.code = ctx->error->code; @@ -446,7 +448,7 @@ int glite_jppsbe_start_upload( } if (asprintf(&lock_fname, "%s/%s" LOCK_SUFFIX, - data_dir, fname) == -1) { + data_dir, class) == -1) { err.code = ENOMEM; goto error_out; } @@ -476,7 +478,7 @@ int glite_jppsbe_start_upload( } if (asprintf(destination_out, "%s/data/%s/%d/%s/%s" UPLOAD_SUFFIX, - config->external_path, ownerhash, regtime_trunc(reg_time), ju, fname) == -1) { + config->external_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) { err.code = ENOMEM; goto error_out; } @@ -616,7 +618,7 @@ int glite_jppsbe_destination_info( glite_jp_context_t ctx, const char *destination, char **job, - glite_jp_fileclass_t *class + char **class ) { size_t dest_len; @@ -669,12 +671,15 @@ int glite_jppsbe_destination_info( goto error_out; } *classname++ ='\0'; - *class = fname_to_class(classname); + *class = strdup(classname); + +/* XXX: do we need similar check? if (!class == GLITE_JP_FILECLASS_UNDEF) { err.code = EINVAL; err.desc = "Forged destination path"; goto error_out; } +*/ if (asprintf(&dest_rw_info, "%s/_info", dest_rw) == -1) { err.code = ENOMEM; @@ -711,13 +716,13 @@ error_out: int glite_jppsbe_get_job_url( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, + const char *name, /* TODO */ char **url_out ) { FILE *regfile = NULL; char *int_fname = NULL; - char *fname = NULL; char *ju = NULL; char *ju_path = NULL; int info_version; @@ -730,11 +735,9 @@ int glite_jppsbe_get_job_url( err.source = __FUNCTION__; assert(job!=NULL); - assert(class != GLITE_JP_FILECLASS_UNDEF); assert(url_out != NULL); - fname = class_to_fname(class); - assert(fname!=NULL); + assert(class!=NULL); if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { err.code = ctx->error->code; @@ -766,7 +769,7 @@ int glite_jppsbe_get_job_url( fclose(regfile); if (asprintf(url_out, "%s/data/%s/%d/%s/%s", - config->external_path, ownerhash, regtime_trunc(reg_time), ju, fname) == -1) { + config->external_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) { err.code = ENOMEM; goto error_out; } @@ -784,12 +787,12 @@ error_out: static int get_job_fname( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, + const char *name, /* TODO */ char **fname_out ) { FILE *regfile = NULL; - char *fname = NULL; char *int_fname = NULL; char *ju = NULL; char *ju_path = NULL; @@ -803,11 +806,9 @@ static int get_job_fname( err.source = __FUNCTION__; assert(job!=NULL); - assert(class != GLITE_JP_FILECLASS_UNDEF); assert(fname_out != NULL); - fname = class_to_fname(class); - assert(fname!=NULL); + assert(class!=NULL); if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { err.code = ctx->error->code; @@ -839,7 +840,7 @@ static int get_job_fname( fclose(regfile); if (asprintf(fname_out, "%s/data/%s/%d/%s/%s", - config->internal_path, ownerhash, regtime_trunc(reg_time), ju, fname) == -1) { + config->internal_path, ownerhash, regtime_trunc(reg_time), ju, class) == -1) { err.code = ENOMEM; goto error_out; } @@ -857,7 +858,8 @@ error_out: int glite_jppsbe_open_file( glite_jp_context_t ctx, const char *job, - glite_jp_fileclass_t class, + const char *class, + const char *name, /* TODO */ int mode, void **handle_out ) @@ -872,7 +874,7 @@ int glite_jppsbe_open_file( memset(&err,0,sizeof err); err.source = __FUNCTION__; - if (get_job_fname(ctx, job, class, &fname)) { + if (get_job_fname(ctx, job, class, name, &fname)) { err.code = ctx->error->code; err.desc = "Cannot construct internal filename"; return glite_jp_stack_error(ctx,&err); @@ -1187,7 +1189,10 @@ int glite_jppsbe_get_job_metadata( for (i = 0; attrs_inout[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { switch (attrs_inout[i].attr.type) { case GLITE_JP_ATTR_OWNER: + +/* must be implemented via filetype plugin case GLITE_JP_ATTR_TIME: +*/ if (!got_info) { if (get_job_info(ctx, job, &owner, &tv_reg)) { err.code = ctx->error->code; @@ -1197,6 +1202,8 @@ int glite_jppsbe_get_job_metadata( got_info = 1; } break; + +/* must be implemented via filetype plugin case GLITE_JP_ATTR_TAG: if (!got_tags) { if (glite_jppsbe_open_file(ctx, job, GLITE_JP_FILECLASS_TAGS, @@ -1215,6 +1222,7 @@ int glite_jppsbe_get_job_metadata( got_tags = 1; } break; +*/ default: err.code = EINVAL; err.desc = "Invalid attribute type"; @@ -1234,6 +1242,8 @@ int glite_jppsbe_get_job_metadata( case GLITE_JP_ATTR_TIME: attrs_inout[i].value.time = tv_reg; break; + +/* must be implemented via filetype plugin case GLITE_JP_ATTR_TAG: for (j = 0; tags[j].name != NULL; j++) { if (!strcmp(tags[j].name, attrs_inout[i].attr.name)) { @@ -1248,6 +1258,7 @@ int glite_jppsbe_get_job_metadata( } if (!tags[j].name) attrs_inout[i].value.tag.name = NULL; break; +*/ default: break; } @@ -1289,6 +1300,11 @@ static int compare_timeval(struct timeval a, struct timeval b) return 0; } + +/* FIXME: disabled -- clarification wrt. filetype plugin needed */ + +#if 0 + static int query_phase2( glite_jp_context_t ctx, const char *ownerhash, @@ -1692,6 +1708,28 @@ error_out: return glite_jp_stack_error(ctx,&err); } +#else + +/* placeholder instead */ +int glite_jppsbe_query( + glite_jp_context_t ctx, + const glite_jp_query_rec_t query[], + const glite_jp_attrval_t metadata[], + int (*callback)( + glite_jp_context_t ctx, + const char *job, + const glite_jp_attrval_t metadata[] + ) +) +{ + glite_jp_error_t err; + err.code = ENOSYS; + err.desc = "not implemented"; + return glite_jp_stack_error(ctx,&err); +} + +#endif + /* XXX: - no primary authorization yet - no concurrency control yet diff --git a/org.glite.jp.primary/src/soap_ops.c b/org.glite.jp.primary/src/soap_ops.c index 1e5534b..53fc46d 100644 --- a/org.glite.jp.primary/src/soap_ops.c +++ b/org.glite.jp.primary/src/soap_ops.c @@ -50,6 +50,7 @@ static void err2fault(const glite_jp_context_t ctx,struct soap *soap) else soap->fault->detail = detail; } +/* deprecated static glite_jp_fileclass_t s2jp_fileclass(enum jptype__UploadClass class) { switch (class) { @@ -59,6 +60,7 @@ static glite_jp_fileclass_t s2jp_fileclass(enum jptype__UploadClass class) default: return GLITE_JP_FILECLASS_UNDEF; } } +*/ static void s2jp_tag(const struct jptype__TagValue *stag,glite_jp_tagval_t *jptag) { @@ -106,16 +108,16 @@ SOAP_FMAC5 int SOAP_FMAC6 jpsrv__RegisterJob( SOAP_FMAC5 int SOAP_FMAC6 jpsrv__StartUpload( struct soap *soap, char *job, - enum jptype__UploadClass class, + char *class, + char *name, time_t commit_before, char *content_type, struct jpsrv__StartUploadResponse *response) { CONTEXT_FROM_SOAP(soap,ctx); - glite_jp_fileclass_t jclass = s2jp_fileclass(class); char *destination; - if (glite_jppsbe_start_upload(ctx,job,jclass,content_type,&destination,&commit_before)) { + if (glite_jppsbe_start_upload(ctx,job,class,name,content_type,&destination,&commit_before)) { err2fault(ctx,soap); return SOAP_FAULT; }