00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 const char *XrdClientProtocolCVSID = "$Id: XrdClientProtocol.cc 30949 2009-11-02 16:37:58Z ganis $";
00017
00018 #include "XProtocol/XProtocol.hh"
00019 #include "XrdSys/XrdSysPlatform.hh"
00020 #include <sys/types.h>
00021 #ifndef WIN32
00022 #include <strings.h>
00023 #include <netinet/in.h>
00024 #endif
00025 #include <string.h>
00026 #include <stdio.h>
00027
00028 #define _htonll(x) htonll(x)
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 void clientMarshall(ClientRequest* str)
00040 {
00041
00042
00043
00044
00045 kXR_int64 tmpl;
00046
00047 switch(str->header.requestid) {
00048 case kXR_auth:
00049
00050 break;
00051 case kXR_chmod:
00052 str->chmod.mode = htons(str->chmod.mode);
00053 break;
00054 case kXR_close:
00055
00056 break;
00057 case kXR_dirlist:
00058
00059 break;
00060 case kXR_getfile:
00061 str->getfile.options = htonl(str->getfile.options);
00062 str->getfile.buffsz = htonl(str->getfile.buffsz);
00063 break;
00064 case kXR_locate:
00065 str->locate.options = htons(str->getfile.options);
00066 break;
00067 case kXR_login:
00068 str->login.pid = htonl(str->login.pid);
00069 break;
00070 case kXR_mkdir:
00071
00072 str->mkdir.mode = htons(str->mkdir.mode);
00073 break;
00074 case kXR_mv:
00075
00076 break;
00077 case kXR_open:
00078 str->open.mode = htons(str->open.mode);
00079 str->open.options = htons(str->open.options);
00080 break;
00081 case kXR_ping:
00082
00083 break;
00084 case kXR_protocol:
00085
00086 break;
00087 case kXR_putfile:
00088 str->putfile.options = htonl(str->putfile.options);
00089 str->putfile.buffsz = htonl(str->putfile.buffsz);
00090 break;
00091 case kXR_query:
00092 str->query.infotype = htons(str->query.infotype);
00093 break;
00094 case kXR_read:
00095 memcpy(&tmpl, &str->read.offset, sizeof(kXR_int64) );
00096 tmpl = _htonll(tmpl);
00097 memcpy(&str->read.offset, &tmpl, sizeof(kXR_int64) );
00098 str->read.rlen = htonl(str->read.rlen);
00099 break;
00100 case kXR_readv:
00101
00102
00103
00104 break;
00105 case kXR_rm:
00106
00107 break;
00108 case kXR_rmdir:
00109
00110 break;
00111 case kXR_set:
00112
00113 break;
00114 case kXR_stat:
00115
00116 break;
00117 case kXR_sync:
00118
00119 break;
00120 case kXR_write:
00121 memcpy(&tmpl, &str->write.offset, sizeof(kXR_int64) );
00122 tmpl = _htonll(tmpl);
00123 memcpy(&str->write.offset, &tmpl, sizeof(kXR_int64) );
00124 break;
00125 case kXR_truncate:
00126 memcpy(&tmpl, &str->truncate.offset, sizeof(kXR_int64) );
00127 tmpl = _htonll(tmpl);
00128 memcpy(&str->truncate.offset, &tmpl, sizeof(kXR_int64) );
00129 break;
00130 }
00131
00132 str->header.requestid = htons(str->header.requestid);
00133 str->header.dlen = htonl(str->header.dlen);
00134 }
00135
00136
00137 void clientMarshallReadAheadList(readahead_list *buf_list, kXR_int32 dlen)
00138 {
00139
00140
00141 kXR_int64 tmpl;
00142
00143 int n = dlen / (sizeof(struct readahead_list));
00144 for( int i = 0; i < n; i++ ) {
00145 memcpy(&tmpl, &(buf_list[i].offset), sizeof(kXR_int64) );
00146 tmpl = htonll(tmpl);
00147 memcpy(&(buf_list[i].offset), &tmpl, sizeof(kXR_int64) );
00148 buf_list[i].rlen = htonl(buf_list[i].rlen);
00149 }
00150 }
00151
00152 void clientUnMarshallReadAheadList(readahead_list *buf_list, kXR_int32 dlen)
00153 {
00154
00155
00156 kXR_int64 tmpl;
00157
00158 int n = dlen / (sizeof(struct readahead_list));
00159 for( int i = 0; i < n; i++ ) {
00160 memcpy(&tmpl, &(buf_list[i].offset), sizeof(kXR_int64) );
00161 tmpl = ntohll(tmpl);
00162 memcpy(&(buf_list[i].offset), &tmpl, sizeof(kXR_int64) );
00163 buf_list[i].rlen = ntohl(buf_list[i].rlen);
00164 }
00165 }
00166
00167
00168 void clientUnmarshall(struct ServerResponseHeader* str)
00169 {
00170 str->status = ntohs(str->status);
00171 str->dlen = ntohl(str->dlen);
00172 }
00173
00174
00175 void ServerResponseHeader2NetFmt(struct ServerResponseHeader *srh)
00176 {
00177 srh->status = htons(srh->status);
00178 srh->dlen = htonl(srh->dlen);
00179 }
00180
00181
00182 void ServerInitHandShake2HostFmt(struct ServerInitHandShake *srh)
00183 {
00184 srh->msglen = ntohl(srh->msglen);
00185 srh->protover = ntohl(srh->protover);
00186 srh->msgval = ntohl(srh->msgval);
00187 }
00188
00189
00190 bool isRedir(struct ServerResponseHeader *ServerResponse)
00191 {
00192
00193
00194 return ( (ServerResponse->status == kXR_redirect) ? true : false);
00195 }
00196
00197
00198 char *convertRequestIdToChar(kXR_unt16 requestid)
00199 {
00200
00201
00202
00203 switch(requestid) {
00204 case kXR_auth:
00205 return (char *)"kXR_auth";
00206 break;
00207 case kXR_chmod:
00208 return (char *)"kXR_chmod";
00209 break;
00210 case kXR_close:
00211 return (char *)"kXR_close";
00212 break;
00213 case kXR_dirlist:
00214 return (char *)"kXR_dirlist";
00215 break;
00216 case kXR_getfile:
00217 return (char *)"kXR_getfile";
00218 break;
00219 case kXR_locate:
00220 return (char *)"kXR_locate";
00221 break;
00222 case kXR_login:
00223 return (char *)"kXR_login";
00224 break;
00225 case kXR_mkdir:
00226 return (char *)"kXR_mkdir";
00227 break;
00228 case kXR_mv:
00229 return (char *)"kXR_mv";
00230 break;
00231 case kXR_open:
00232 return (char *)"kXR_open";
00233 break;
00234 case kXR_ping:
00235 return (char *)"kXR_ping";
00236 break;
00237 case kXR_protocol:
00238 return (char *)"kXR_protocol";
00239 break;
00240 case kXR_putfile:
00241 return (char *)"kXR_putfile";
00242 break;
00243 case kXR_query:
00244 return (char *)"kXR_query";
00245 break;
00246 case kXR_read:
00247 return (char *)"kXR_read";
00248 break;
00249 case kXR_readv:
00250 return (char *)"kXR_readv";
00251 break;
00252 case kXR_rm:
00253 return (char *)"kXR_rm";
00254 break;
00255 case kXR_rmdir:
00256 return (char *)"kXR_rmdir";
00257 break;
00258 case kXR_set:
00259 return (char *)"kXR_set";
00260 break;
00261 case kXR_stat:
00262 return (char *)"kXR_stat";
00263 break;
00264 case kXR_sync:
00265 return (char *)"kXR_sync";
00266 break;
00267 case kXR_write:
00268 return (char *)"kXR_write";
00269 break;
00270 case kXR_prepare:
00271 return (char *)"kXR_prepare";
00272 break;
00273 case kXR_admin:
00274 return (char *)"kXR_admin";
00275 break;
00276 case kXR_statx:
00277 return (char *)"kXR_statx";
00278 break;
00279 case kXR_endsess:
00280 return (char *)"kXR_endsess";
00281 break;
00282 case kXR_bind:
00283 return (char *)"kXR_bind";
00284 break;
00285 case kXR_truncate:
00286 return (char *)"kXR_truncate";
00287 break;
00288 default:
00289 return (char *)"kXR_UNKNOWN";
00290 break;
00291 }
00292
00293 return (char *)"kXR_UNKNOWN";
00294 }
00295
00296
00297 void PutFilehandleInRequest(ClientRequest* str, char *fHandle)
00298 {
00299
00300
00301
00302 switch(str->header.requestid) {
00303 case kXR_close:
00304 memcpy( str->close.fhandle, fHandle, sizeof(str->close.fhandle) );
00305 break;
00306 case kXR_read:
00307 memcpy( str->read.fhandle, fHandle, sizeof(str->read.fhandle) );
00308 break;
00309 case kXR_sync:
00310 memcpy( str->sync.fhandle, fHandle, sizeof(str->sync.fhandle) );
00311 break;
00312 case kXR_write:
00313 memcpy( str->write.fhandle, fHandle, sizeof(str->write.fhandle) );
00314 break;
00315 }
00316 }
00317
00318
00319 char *convertRespStatusToChar(kXR_unt16 status)
00320 {
00321 switch( status) {
00322 case kXR_ok:
00323 return (char *)"kXR_ok";
00324 break;
00325 case kXR_oksofar:
00326 return (char *)"kXR_oksofar";
00327 break;
00328 case kXR_attn:
00329 return (char *)"kXR_attn";
00330 break;
00331 case kXR_authmore:
00332 return (char *)"kXR_authmore";
00333 break;
00334 case kXR_error:
00335 return (char *)"kXR_error";
00336 break;
00337 case kXR_redirect:
00338 return (char *)"kXR_redirect";
00339 break;
00340 case kXR_wait:
00341 return (char *)"kXR_wait";
00342 break;
00343 case kXR_waitresp:
00344 return (char *)"kXR_waitresp";
00345 break;
00346 default:
00347 return (char *)"kXR_UNKNOWN";
00348 break;
00349 }
00350 }
00351
00352
00353
00354 void smartPrintClientHeader(ClientRequest* hdr)
00355 {
00356 kXR_int64 tmpl;
00357
00358 fprintf(stderr, "\n\n================= DUMPING CLIENT REQUEST HEADER =================\n");
00359
00360 fprintf(stderr, "%40s0x%.2x 0x%.2x\n", "ClientHeader.streamid = ",
00361 hdr->header.streamid[0],
00362 hdr->header.streamid[1]);
00363
00364 fprintf(stderr, "%40s%s (%d)\n",
00365 "ClientHeader.requestid = ",
00366 convertRequestIdToChar(hdr->header.requestid), hdr->header.requestid);
00367
00368 switch(hdr->header.requestid) {
00369 case kXR_admin:
00370 fprintf(stderr, "%40s0 repeated %d times\n",
00371 "ClientHeader.admin.reserved = ",
00372 (kXR_int32)sizeof(hdr->admin.reserved));
00373 break;
00374
00375 case kXR_auth:
00376 fprintf(stderr, "%40s0 repeated %d times\n",
00377 "ClientHeader.auth.reserved = ",
00378 (kXR_int32)sizeof(hdr->auth.reserved));
00379
00380 fprintf(stderr, " ClientHeader.auth.credtype= 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",
00381 hdr->auth.credtype[0],
00382 hdr->auth.credtype[1],
00383 hdr->auth.credtype[2],
00384 hdr->auth.credtype[3]);
00385 break;
00386
00387 case kXR_chmod:
00388 fprintf(stderr, "%40s0 repeated %d times\n",
00389 "ClientHeader.chmod.reserved = ",
00390 (kXR_int32)sizeof(hdr->chmod.reserved));
00391
00392 fprintf(stderr, " ClientHeader.chmod.mode= 0x%.2x 0x%.2x \n",
00393 *((kXR_char *)&hdr->chmod.mode),
00394 *(((kXR_char *)&hdr->chmod.mode)+1)
00395 );
00396 break;
00397
00398 case kXR_close:
00399 fprintf(stderr, "%40s0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",
00400 "ClientHeader.close.fhandle = ",
00401 hdr->close.fhandle[0],
00402 hdr->close.fhandle[1],
00403 hdr->close.fhandle[2],
00404 hdr->close.fhandle[3]);
00405
00406 fprintf(stderr, "%40s0 repeated %d times\n",
00407 "ClientHeader.close.reserved = ",
00408 (kXR_int32)sizeof(hdr->close.reserved));
00409 break;
00410
00411 case kXR_dirlist:
00412 fprintf(stderr, "%40s0 repeated %d times\n",
00413 "ClientHeader.dirlist.reserved = ",
00414 (kXR_int32)sizeof(hdr->dirlist.reserved));
00415 break;
00416 case kXR_locate:
00417 fprintf(stderr, " ClientHeader.locate.options= 0x%.2x 0x%.2x \n",
00418 *((kXR_char *)&hdr->locate.options),
00419 *(((kXR_char *)&hdr->locate.options)+1)
00420 );
00421
00422 fprintf(stderr, "%40s0 repeated %d times\n",
00423 "ClientHeader.locate.reserved = ",
00424 (kXR_int32)sizeof(hdr->locate.reserved));
00425 break;
00426 case kXR_login:
00427 fprintf(stderr, "%40s%d \n",
00428 "ClientHeader.login.pid = ",
00429 hdr->login.pid);
00430
00431 fprintf(stderr, "%40s%s\n",
00432 "ClientHeader.login_body.username = ",
00433 hdr->login.username);
00434
00435 fprintf(stderr, "%40s0 repeated %d times\n",
00436 "ClientHeader.login.reserved = ",
00437 (kXR_int32)sizeof(hdr->login.reserved));
00438
00439 fprintf(stderr, "%40s%d\n",
00440 "ClientHeader.login.capver = ",
00441 hdr->login.capver[0]);
00442
00443 fprintf(stderr, "%40s%d\n",
00444 "ClientHeader.login.role = ",
00445 hdr->login.role[0]);
00446 break;
00447
00448 case kXR_mkdir:
00449 fprintf(stderr, "%40s0 repeated %d times\n",
00450 "ClientHeader.mkdir.reserved = ",
00451 (kXR_int32)sizeof(hdr->mkdir.reserved));
00452
00453 fprintf(stderr, "%40s0x%.2x 0x%.2x\n",
00454 "ClientHeader.mkdir.mode = ",
00455 *((kXR_char*)&hdr->mkdir.mode),
00456 *(((kXR_char*)&hdr->mkdir.mode)+1)
00457 );
00458 break;
00459
00460 case kXR_mv:
00461 fprintf(stderr, "%40s0 repeated %d times\n",
00462 "ClientHeader.mv.reserved = ",
00463 (kXR_int32)sizeof(hdr->mv.reserved));
00464 break;
00465
00466 case kXR_open:
00467 fprintf(stderr, "%40s0x%.2x 0x%.2x\n",
00468 "ClientHeader.open.mode = ",
00469 *((kXR_char*)&hdr->open.mode),
00470 *(((kXR_char*)&hdr->open.mode)+1)
00471 );
00472
00473 fprintf(stderr, "%40s0x%.2x 0x%.2x\n",
00474 "ClientHeader.open.options = ",
00475 *((kXR_char*)&hdr->open.options),
00476 *(((kXR_char*)&hdr->open.options)+1));
00477
00478 fprintf(stderr, "%40s0 repeated %d times\n",
00479 "ClientHeader.open.reserved = ",
00480 (kXR_int32)sizeof(hdr->open.reserved));
00481 break;
00482
00483 case kXR_ping:
00484 fprintf(stderr, "%40s0 repeated %d times\n",
00485 "ClientHeader.ping.reserved = ",
00486 (kXR_int32)sizeof(hdr->ping.reserved));
00487 break;
00488
00489 case kXR_protocol:
00490 fprintf(stderr, "%40s0 repeated %d times\n",
00491 "ClientHeader.protocol.reserved = ",
00492 (kXR_int32)sizeof(hdr->protocol.reserved));
00493 break;
00494
00495 case kXR_prepare:
00496 fprintf(stderr, "%40s0x%.2x\n",
00497 "ClientHeader.prepare.options = ",
00498 hdr->prepare.options);
00499 fprintf(stderr, "%40s0x%.2x\n",
00500 "ClientHeader.prepare.prty = ",
00501 hdr->prepare.prty);
00502 fprintf(stderr, "%40s0 repeated %d times\n",
00503 "ClientHeader.prepare.reserved = ",
00504 (kXR_int32)sizeof(hdr->prepare.reserved));
00505 break;
00506
00507 case kXR_read:
00508 fprintf(stderr, "%40s0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",
00509 "ClientHeader.read.fhandle = ",
00510 hdr->read.fhandle[0],
00511 hdr->read.fhandle[1],
00512 hdr->read.fhandle[2],
00513 hdr->read.fhandle[3]);
00514
00515 memcpy(&tmpl, &hdr->read.offset, sizeof(kXR_int64) );
00516
00517 fprintf(stderr, "%40s%lld\n",
00518 "ClientHeader.read.offset = ",
00519 tmpl);
00520
00521 fprintf(stderr, "%40s%d\n",
00522 "ClientHeader.read.rlen = ",
00523 hdr->read.rlen);
00524 break;
00525
00526 case kXR_readv:
00527 fprintf(stderr, "%40s0 repeated %d times\n",
00528 "ClientHeader.readv.reserved = ",
00529 (kXR_int32)sizeof(hdr->readv.reserved));
00530
00531 break;
00532
00533 case kXR_rm:
00534 fprintf(stderr, "%40s0 repeated %d times\n",
00535 "ClientHeader.rm.reserved = ",
00536 (kXR_int32)sizeof(hdr->rm.reserved));
00537
00538 break;
00539
00540 case kXR_rmdir:
00541 fprintf(stderr, "%40s0 repeated %d times\n",
00542 "ClientHeader.rmdir.reserved = ",
00543 (kXR_int32)sizeof(hdr->rmdir.reserved));
00544 break;
00545
00546 case kXR_set:
00547 fprintf(stderr, "%40s0 repeated %d times\n",
00548 "ClientHeader.set.reserved = ",
00549 (kXR_int32)sizeof(hdr->set.reserved));
00550 break;
00551
00552 case kXR_stat:
00553 fprintf(stderr, "%40s0 repeated %d times\n",
00554 "ClientHeader.stat.reserved = ",
00555 (kXR_int32)sizeof(hdr->stat.reserved));
00556 break;
00557
00558 case kXR_sync:
00559 fprintf(stderr, "%40s0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",
00560 "ClientHeader.sync.fhandle = ",
00561 hdr->sync.fhandle[0],
00562 hdr->sync.fhandle[1],
00563 hdr->sync.fhandle[2],
00564 hdr->sync.fhandle[3]);
00565
00566 fprintf(stderr, "%40s0 repeated %d times\n",
00567 "ClientHeader.sync.reserved = ",
00568 (kXR_int32)sizeof(hdr->sync.reserved));
00569 break;
00570
00571 case kXR_write:
00572 fprintf(stderr, "%40s0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",
00573 "ClientHeader.write.fhandle = ",
00574 hdr->write.fhandle[0],
00575 hdr->write.fhandle[1],
00576 hdr->write.fhandle[2],
00577 hdr->write.fhandle[3]);
00578
00579 memcpy(&tmpl, &hdr->write.offset, sizeof(kXR_int64) );
00580
00581 fprintf(stderr, "%40s%lld\n",
00582 "ClientHeader.write.offset = ",
00583 tmpl);
00584
00585 fprintf(stderr, "%40s%d\n",
00586 "ClientHeader.write.pathid = ",
00587 hdr->write.pathid);
00588
00589 fprintf(stderr, "%40s0 repeated %d times\n",
00590 "ClientHeader.write.reserved = ",
00591 (kXR_int32)sizeof(hdr->write.reserved));
00592 break;
00593 }
00594
00595 fprintf(stderr, "%40s%d",
00596 "ClientHeader.header.dlen = ",
00597 hdr->header.dlen);
00598 fprintf(stderr, "\n=================== END CLIENT HEADER DUMPING ===================\n\n");
00599 }
00600
00601
00602 void smartPrintServerHeader(struct ServerResponseHeader* hdr)
00603 {
00604 fprintf(stderr, "\n\n======== DUMPING SERVER RESPONSE HEADER ========\n");
00605 fprintf(stderr, "%30s0x%.2x 0x%.2x\n",
00606 "ServerHeader.streamid = ",
00607 hdr->streamid[0],
00608 hdr->streamid[1]);
00609 switch(hdr->status) {
00610 case kXR_ok:
00611 fprintf(stderr, "%30skXR_ok",
00612 "ServerHeader.status = ");
00613 break;
00614 case kXR_attn:
00615 fprintf(stderr, "%30skXR_attn",
00616 "ServerHeader.status = ");
00617 break;
00618 case kXR_authmore:
00619 fprintf(stderr, "%30skXR_authmore",
00620 "ServerHeader.status = ");
00621 break;
00622 case kXR_error:
00623 fprintf(stderr, "%30skXR_error",
00624 "ServerHeader.status = ");
00625 break;
00626 case kXR_oksofar:
00627 fprintf(stderr, "%30skXR_oksofar",
00628 "ServerHeader.status = ");
00629 break;
00630 case kXR_redirect:
00631 fprintf(stderr, "%30skXR_redirect",
00632 "ServerHeader.status = ");
00633 break;
00634 case kXR_wait:
00635 fprintf(stderr, "%30skXR_wait",
00636 "ServerHeader.status = ");
00637 break;
00638 }
00639 fprintf(stderr, " (%d)\n", hdr->status);
00640 fprintf(stderr, "%30s%d",
00641 "ServerHeader.dlen = ", hdr->dlen);
00642 fprintf(stderr, "\n========== END DUMPING SERVER HEADER ===========\n\n");
00643 }
00644