00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "rsApiHandler.h"
00015 #include "reGlobalsExtern.h"
00016 #include "msoDriversMS.h"
00017
00018
00019 int
00020 getz3950Params(char *reqStr, char **locStr, char **queryStr, char **syntaxStr)
00021 {
00022 char *r, *t, *q, *s;
00023
00024 r = strdup(reqStr);
00025 if ((t = strstr(r,"?")) == NULL) {
00026 free(r);
00027 return(-1);
00028 }
00029 *t = '\0';
00030 *locStr = strdup(r);
00031 *t = '&';
00032
00033 q = strstr(t, "&query=");
00034 s = strstr(t, "&recordsyntax=");
00035
00036 if (q != NULL)
00037 *q = '\0';;
00038 if (s != NULL)
00039 *s = '\0';;
00040
00041 if (q == NULL) {
00042 if (s != t) {
00043 *queryStr = strdup(t);
00044 }
00045 else {
00046 free(r);
00047 return(-2);
00048 }
00049 }
00050 else {
00051 q = q + 7;
00052 *queryStr = strdup(q);
00053 }
00054 if (s == NULL)
00055 *syntaxStr = strdup("XML");
00056 else {
00057 s = s + 14;
00058 *syntaxStr = strdup(s);
00059 }
00060 free(r);
00061 return(0);
00062
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 int
00102 msiobjget_z3950(msParam_t* inRequestPath, msParam_t* inFileMode,
00103 msParam_t* inFileFlags, msParam_t* inCacheFilename,
00104 ruleExecInfo_t* rei )
00105 {
00106
00107 char *reqStr;
00108 int mode, flags;
00109 char *cacheFilename;
00110 char *str;
00111 int status, bytesWritten, objLen;
00112 int destFd;
00113 char *locStr, *queryStr, *syntaxStr;
00114 char *myMSICall;
00115 int i;
00116 ruleExecInfo_t rei2;
00117 msParamArray_t msParamArray;
00118 msParam_t *mP;
00119
00120
00121 RE_TEST_MACRO( " Calling msiobjget_z3950" );
00122
00123
00124 if (inRequestPath == NULL ||
00125 strcmp(inRequestPath->type , STR_MS_T) != 0 ||
00126 inRequestPath->inOutStruct == NULL)
00127 return(USER_PARAM_TYPE_ERR);
00128
00129 if (inFileMode == NULL ||
00130 strcmp(inFileMode->type , STR_MS_T) != 0 ||
00131 inFileMode->inOutStruct == NULL)
00132 return(USER_PARAM_TYPE_ERR);
00133
00134 if (inFileFlags == NULL ||
00135 strcmp(inFileFlags->type , STR_MS_T) != 0 ||
00136 inFileFlags->inOutStruct == NULL)
00137 return(USER_PARAM_TYPE_ERR);
00138
00139 if (inCacheFilename == NULL ||
00140 strcmp(inCacheFilename->type , STR_MS_T) != 0 ||
00141 inCacheFilename->inOutStruct == NULL)
00142 return(USER_PARAM_TYPE_ERR);
00143
00144
00145 reqStr = (char *) inRequestPath->inOutStruct;
00146 cacheFilename = (char *) inCacheFilename->inOutStruct;
00147 mode = atoi((char *) inFileMode->inOutStruct);
00148 flags = atoi((char *) inFileFlags->inOutStruct);
00149
00150
00151
00152
00153 if ((str = strstr(reqStr,":")) == NULL)
00154 str = reqStr;
00155 else
00156 str++;
00157
00158
00159 i = getz3950Params(str, &locStr, &queryStr, &syntaxStr);
00160 if (i != 0) {
00161 printf("msiobjget_z3950: Error in request format for %s:%i\n",str,i);
00162 return(USER_INPUT_FORMAT_ERR);
00163 }
00164
00165 myMSICall = (char *) malloc(strlen(reqStr) + 200);
00166
00167 sprintf(myMSICall, "msiz3950Submit(\"%s\",\"%s\",\"%s\",*OutBuffer)",
00168 locStr, queryStr, syntaxStr);
00169
00170
00171
00172
00173
00174 free(locStr);
00175 free(queryStr);
00176 free(syntaxStr);
00177 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00178 memset ((char*)&msParamArray, 0, sizeof(msParamArray_t));
00179
00180
00181 rei2.rsComm = rei->rsComm;
00182 if (rei2.rsComm != NULL) {
00183 rei2.uoic = &rei2.rsComm->clientUser;
00184 rei2.uoip = &rei2.rsComm->proxyUser;
00185 }
00186
00187
00188 #ifdef RULE_ENGINE_N
00189 i = applyRuleUpdateParams(myMSICall, &msParamArray, &rei2, NO_SAVE_REI);
00190 #else
00191 i = applyRule(myMSICall, &msParamArray, &rei2, NO_SAVE_REI);
00192 #endif
00193 if (i != 0) {
00194 printf("msiobjget_z3950: Error in calling %s: %i\n", myMSICall, i);
00195 free(myMSICall);
00196 return(i);
00197 }
00198 free(myMSICall);
00199 mP = getMsParamByLabel(&msParamArray,"*OutBuffer");
00200 if (mP == NULL) {
00201 printf("msiobjget_z3950: Error in Getting Parameter after call for *OutBuffer\n");
00202 return(UNKNOWN_PARAM_IN_RULE_ERR);
00203 }
00204 str = (char *) mP->inOutStruct;
00205 objLen = strlen(str);
00206
00207
00208 destFd = open (cacheFilename, O_WRONLY | O_CREAT | O_TRUNC, mode);
00209 if (destFd < 0) {
00210 status = UNIX_FILE_OPEN_ERR - errno;
00211 printf (
00212 "msigetobj_z3950: open error for cacheFilename %s, status = %d",
00213 cacheFilename, status);
00214 clearMsParamArray(&msParamArray,0);
00215 return status;
00216 }
00217 bytesWritten = write (destFd, str, objLen);
00218 close (destFd);
00219 clearMsParamArray(&msParamArray,0);
00220 if (bytesWritten != objLen) {
00221 printf(
00222 "msigetobj_z3950: In Cache File %s bytesWritten %d != returned objLen %i\n",
00223 cacheFilename, bytesWritten, objLen);
00224 return SYS_COPY_LEN_ERR;
00225 }
00226
00227
00228
00229
00230 return(0);
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 int
00274 msiobjput_z3950(msParam_t* inMSOPath, msParam_t* inCacheFilename,
00275 msParam_t* inFileSize, ruleExecInfo_t* rei )
00276 {
00277
00278 char *reqStr;
00279 char *cacheFilename;
00280 rodsLong_t dataSize;
00281 int status;
00282 int srcFd;
00283 char *myBuf;
00284 int bytesRead;
00285
00286
00287 RE_TEST_MACRO( " Calling msiobjput_z3950" );
00288
00289
00290 if (inMSOPath == NULL ||
00291 strcmp(inMSOPath->type , STR_MS_T) != 0 ||
00292 inMSOPath->inOutStruct == NULL)
00293 return(USER_PARAM_TYPE_ERR);
00294
00295 if (inCacheFilename == NULL ||
00296 strcmp(inCacheFilename->type , STR_MS_T) != 0 ||
00297 inCacheFilename->inOutStruct == NULL)
00298 return(USER_PARAM_TYPE_ERR);
00299
00300 if (inFileSize == NULL ||
00301 strcmp(inFileSize->type , STR_MS_T) != 0 ||
00302 inFileSize->inOutStruct == NULL)
00303 return(USER_PARAM_TYPE_ERR);
00304
00305
00306
00307 reqStr = (char *) inMSOPath->inOutStruct;
00308 cacheFilename = (char *) inCacheFilename->inOutStruct;
00309 dataSize = atol((char *) inFileSize->inOutStruct);
00310
00311
00312
00313
00314 srcFd = open (cacheFilename, O_RDONLY, 0);
00315 if (srcFd < 0) {
00316 status = UNIX_FILE_OPEN_ERR - errno;
00317 printf ("msiputobj_z3950: open error for %s, status = %d\n",
00318 cacheFilename, status);
00319 return status;
00320 }
00321 myBuf = (char *) malloc (dataSize);
00322 bytesRead = read (srcFd, (void *) myBuf, dataSize);
00323 close (srcFd);
00324 myBuf[dataSize-1] = '\0';
00325 if (bytesRead > 0 && bytesRead != dataSize) {
00326 printf ("msiputobj_z3950: bytesRead %d != dataSize %lld\n",
00327 bytesRead, dataSize);
00328 free(myBuf);
00329 return SYS_COPY_LEN_ERR;
00330 }
00331
00332 rodsLog(LOG_NOTICE,"MSO_Z3950 file contains: %s\n",myBuf);
00333 free(myBuf);
00334 return(0);
00335 }
00336