00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "msoDriversMS.h"
00010
00011
00012
00013
00014 #if defined(MSO_SRB)
00015
00016 #ifdef __cplusplus
00017 extern "C" {
00018 #endif
00019
00020
00021 #include "srbmso.h"
00022
00023 int
00024 connectToRemotesrb(char * inStr, srbConn **rcComm)
00025 {
00026
00027 int port;
00028 char *t, *s;
00029 char *host = NULL;
00030 char *user = NULL;
00031 char *zone = NULL;
00032 char *pass = NULL;
00033 char *str;
00034 char portEnv[100];
00035 char userEnv[100];
00036 char domainEnv[100];
00037
00038
00039
00040
00041
00042
00043 str = strdup(inStr);
00044 if ((t = strstr(str, "/")) == NULL){
00045 free(str);
00046 return(USER_INPUT_FORMAT_ERR);
00047 }
00048 else
00049 *t = '\0';
00050 if ((t = strstr(str, ":")) == NULL) {
00051 free(str);
00052 return(USER_INPUT_FORMAT_ERR);
00053 }
00054 s = t+1;
00055 port = -1;
00056 host = s;
00057 while ((t = strstr(s, ":")) != NULL) {
00058 *t = '\0';
00059 s = t+1;
00060 if (port == -1 && user == NULL && isdigit(*s))
00061 port = atoi(s);
00062 else if (user == NULL)
00063 user = s;
00064 else if (pass == NULL){
00065 pass = s;
00066 break;
00067 }
00068 }
00069
00070
00071 if (user == NULL)
00072 strcpy(user, ANONYMOUS_USER);
00073 if ((t = strstr(user, "@")) != NULL) {
00074 *t = '\0';
00075 zone = t+1;
00076 }
00077 else {
00078 free(str);
00079 return(USER_INPUT_FORMAT_ERR);
00080 }
00081 if (port == -1)
00082 port = 1247;
00083 if (pass != NULL) {
00084
00085 t++;
00086 }
00087
00088
00089 printf("MM: host=%s,port=%i,user=%s,domain=%s,pass=%s\n",host, port, user,zone,pass);
00090
00091 sprintf(portEnv,"%i",port);
00092 sprintf(userEnv,"srbUser=%s",user);
00093 sprintf(domainEnv,"mdasDomainName=%s",zone);
00094 *rcComm = srbConnect (host, portEnv, pass, user, zone, "ENCRYPT1" , NULL);
00095 if (clStatus(*rcComm) != CLI_CONNECTION_OK) {
00096 printf("Connection to SRB server failed.\n");
00097 clFinish(*rcComm);
00098 free( str );
00099 return(REMOTE_SRB_CONNECT_ERR);
00100 }
00101 free( str );
00102 return(0);
00103 }
00104 #ifdef __cplusplus
00105 }
00106 #endif
00107
00108 #endif
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 int
00149 msiobjget_srb(msParam_t* inRequestPath, msParam_t* inFileMode,
00150 msParam_t* inFileFlags, msParam_t* inCacheFilename,
00151 ruleExecInfo_t* rei )
00152 {
00153 #if defined(MSO_SRB)
00154 char *locStr;
00155 int mode, flags;
00156 char *cacheFilename;
00157 char *str, *t;
00158 int status, bytesRead, bytesWritten;
00159 int destFd, i;
00160 srbConn *rcComm = NULL;
00161
00162 int objFD;
00163 char locDir[MAX_NAME_LEN];
00164 char locFile[MAX_NAME_LEN];
00165 char buf[BUFSIZE];
00166
00167
00168
00169
00170 RE_TEST_MACRO( " Calling msiobjget_srb" );
00171
00172
00173 if (inRequestPath == NULL ||
00174 strcmp(inRequestPath->type , STR_MS_T) != 0 ||
00175 inRequestPath->inOutStruct == NULL)
00176 return(USER_PARAM_TYPE_ERR);
00177
00178 if (inFileMode == NULL ||
00179 strcmp(inFileMode->type , STR_MS_T) != 0 ||
00180 inFileMode->inOutStruct == NULL)
00181 return(USER_PARAM_TYPE_ERR);
00182
00183 if (inFileFlags == NULL ||
00184 strcmp(inFileFlags->type , STR_MS_T) != 0 ||
00185 inFileFlags->inOutStruct == NULL)
00186 return(USER_PARAM_TYPE_ERR);
00187
00188 if (inCacheFilename == NULL ||
00189 strcmp(inCacheFilename->type , STR_MS_T) != 0 ||
00190 inCacheFilename->inOutStruct == NULL)
00191 return(USER_PARAM_TYPE_ERR);
00192
00193
00194 str = strdup((char *) inRequestPath->inOutStruct);
00195 if ((t = strstr(str, ":")) != NULL) {
00196 locStr = t+1;
00197 if ((t = strstr(locStr,"/"))!= NULL)
00198 locStr = t;
00199 else {
00200 free(str);
00201 return(USER_INPUT_FORMAT_ERR);
00202 }
00203 }
00204
00205 else {
00206 free(str);
00207 return(USER_INPUT_FORMAT_ERR);
00208 }
00209
00210
00211 cacheFilename = (char *) inCacheFilename->inOutStruct;
00212 mode = atoi((char *) inFileMode->inOutStruct);
00213 flags = atoi((char *) inFileFlags->inOutStruct);
00214
00215
00216
00217 i = connectToRemotesrb((char *) inRequestPath->inOutStruct, &rcComm);
00218 if (i < 0) {
00219 printf("msiputobj_srb: error connecting to remote srb: %s:%i\n",
00220 (char *) inRequestPath->inOutStruct,i);
00221 free(str);
00222 return(i);
00223 }
00224
00225
00226 splitPathByKey (locStr, locDir, locFile, '/');
00227 free(str);
00228
00229
00230 objFD = srbObjOpen (rcComm, locFile, O_RDONLY, locDir);
00231
00232 if (objFD < 0) {
00233 printf("msigetobj_srb: Unable to open file %s/%s:%i\n", locDir, locFile, objFD);
00234 clFinish(rcComm);
00235 return(objFD);
00236 }
00237
00238 destFd = open (cacheFilename, O_WRONLY | O_CREAT | O_TRUNC, mode);
00239 if (destFd < 0) {
00240 status = UNIX_FILE_OPEN_ERR - errno;
00241 printf (
00242 "msigetobj_srb: open error for cacheFilename %s, status = %d",
00243 cacheFilename, status);
00244 clFinish(rcComm);
00245 return status;
00246 }
00247
00248 while ((bytesRead = srbObjRead (rcComm, objFD, buf, BUFSIZE)) > 0) {
00249 bytesWritten = write (destFd, buf, bytesRead);
00250 if (bytesWritten != bytesRead ) {
00251 close (destFd);
00252 srbObjClose (rcComm, objFD);
00253 clFinish(rcComm);
00254 printf(
00255 "msigetobj_srb: In Cache File %s bytesWritten %d != returned objLen %i\n",
00256 cacheFilename, bytesWritten, bytesRead);
00257 return SYS_COPY_LEN_ERR;
00258 }
00259 }
00260 close (destFd);
00261 i = srbObjClose (rcComm, objFD);
00262 clFinish(rcComm);
00263 return(i);
00264 #else
00265 return(MICRO_SERVICE_OBJECT_TYPE_UNDEFINED);
00266 #endif
00267
00268 }
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 int
00311 msiobjput_srb(msParam_t* inMSOPath, msParam_t* inCacheFilename,
00312 msParam_t* inFileSize, ruleExecInfo_t* rei )
00313 {
00314 #if defined(MSO_SRB)
00315 char *reqStr;
00316 char *str, *t;
00317 char *cacheFilename;
00318 srb_long_t dataSize;
00319 int status, i;
00320 int srcFd;
00321 char *myBuf;
00322 int bytesRead;
00323 int bytesWritten;
00324 int outDesc;
00325 srbConn *rcComm = NULL;
00326 char locDir[MAX_NAME_LEN];
00327 char locFile[MAX_NAME_LEN];
00328 int writeBufLen;
00329
00330
00331 RE_TEST_MACRO( " Calling msiobjput_srb" );
00332
00333
00334 if (inMSOPath == NULL ||
00335 strcmp(inMSOPath->type , STR_MS_T) != 0 ||
00336 inMSOPath->inOutStruct == NULL)
00337 return(USER_PARAM_TYPE_ERR);
00338
00339 if (inCacheFilename == NULL ||
00340 strcmp(inCacheFilename->type , STR_MS_T) != 0 ||
00341 inCacheFilename->inOutStruct == NULL)
00342 return(USER_PARAM_TYPE_ERR);
00343
00344 if (inFileSize == NULL ||
00345 strcmp(inFileSize->type , STR_MS_T) != 0 ||
00346 inFileSize->inOutStruct == NULL)
00347 return(USER_PARAM_TYPE_ERR);
00348
00349
00350
00351 str = strdup((char *) inMSOPath->inOutStruct);
00352 if ((t = strstr(str, ":")) != NULL) {
00353 reqStr = t+1;
00354 if ((t = strstr(reqStr,"/"))!= NULL)
00355 reqStr = t;
00356 else {
00357 free(str);
00358 return(USER_INPUT_FORMAT_ERR);
00359 }
00360 }
00361 else {
00362 free(str);
00363 return(USER_INPUT_FORMAT_ERR);
00364 }
00365
00366 cacheFilename = (char *) inCacheFilename->inOutStruct;
00367 dataSize = atol((char *) inFileSize->inOutStruct);
00368
00369 i = connectToRemotesrb((char *) inMSOPath->inOutStruct, &rcComm);
00370 if (i < 0) {
00371 printf("msiputobj_srb: error connecting to remote srb: %s:%i\n",
00372 (char *) inMSOPath->inOutStruct,i);
00373 free(str);
00374 return(i);
00375 }
00376
00377
00378 srcFd = open (cacheFilename, O_RDONLY, 0);
00379 if (srcFd < 0) {
00380 status = UNIX_FILE_OPEN_ERR - errno;
00381 printf ("msiputobj_srb: open error for %s, status = %d\n",
00382 cacheFilename, status);
00383 free(str);
00384 return status;
00385 }
00386
00387
00388 splitPathByKey (reqStr, locDir, locFile, '/');
00389 free(str);
00390
00391 outDesc = srbObjOpen (rcComm, locFile, O_RDWR|SRB_O_TRUNC, locDir);
00392 if (outDesc < 0) {
00393 printf ("msiputobj_srb: Unable to open file %s/%s:%i\n", locDir, locFile,outDesc);
00394 clFinish(rcComm);
00395 close( srcFd );
00396 return(outDesc);
00397 }
00398
00399 if (dataSize > MAX_SZ_FOR_SINGLE_BUF)
00400 writeBufLen = MAX_SZ_FOR_SINGLE_BUF;
00401 else
00402 writeBufLen = dataSize;
00403
00404 myBuf = (char *) malloc (writeBufLen);
00405
00406 while ( (bytesRead = read(srcFd, (void *) myBuf, writeBufLen)) > 0) {
00407 bytesWritten = srbObjWrite(rcComm, outDesc, myBuf, bytesRead);
00408 if (bytesWritten != bytesRead) {
00409 free(myBuf);
00410 close (srcFd);
00411 srbObjClose (rcComm, outDesc);
00412 clFinish(rcComm);
00413 printf ("msiputobj_srb: Write Error: bytesRead %d != bytesWritten %d\n",
00414 bytesRead, bytesWritten);
00415 return SYS_COPY_LEN_ERR;
00416 }
00417 }
00418 free(myBuf);
00419 close (srcFd);
00420 i = srbObjClose (rcComm, outDesc);
00421 clFinish(rcComm);
00422
00423 return(i);
00424 #else
00425 return(MICRO_SERVICE_OBJECT_TYPE_UNDEFINED);
00426 #endif
00427 }
00428
00429