XrdClientProtocol.cc

Go to the documentation of this file.
00001 //////////////////////////////////////////////////////////////////////////
00002 //                                                                      //
00003 // XrdProtocol                                                          // 
00004 //                                                                      //
00005 // Author: Fabrizio Furano (INFN Padova, 2004)                          //
00006 // Adapted from TXNetFile (root.cern.ch) originally done by             //
00007 //  Alvise Dorigo, Fabrizio Furano                                      //
00008 //          INFN Padova, 2003                                           //
00009 //                                                                      //
00010 // utility functions to deal with the protocol                          //
00011 //                                                                      //
00012 //////////////////////////////////////////////////////////////////////////
00013 
00014 //         $Id: XrdClientProtocol.cc 30949 2009-11-02 16:37:58Z ganis $
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> // needed to use htonl/htons byte swap functions
00024 #endif
00025 #include <string.h> // proto for memcpy (wanted by Solaris compiler)
00026 #include <stdio.h>
00027 
00028 #define _htonll(x) htonll(x)
00029 
00030 // //____________________________________________________________________________
00031 // kXR_int64 _htonll(kXR_int64 n)
00032 // {
00033 //    // custom client routine to convert long long (64 bit integers) from
00034 //    // host to network byte order
00035 //    return (kXR_int64)host2net(n);
00036 // }
00037 
00038 //___________________________________________________________________________
00039 void clientMarshall(ClientRequest* str)
00040 {
00041    // This function applies the network byte order on those
00042    // parts of the 16-bytes buffer, only if it is composed 
00043    // by some binary part
00044 
00045    kXR_int64 tmpl;
00046 
00047    switch(str->header.requestid) {
00048    case kXR_auth:
00049       // no swap on ASCII fields
00050       break;
00051    case kXR_chmod:
00052       str->chmod.mode = htons(str->chmod.mode);
00053       break;
00054    case kXR_close:
00055       // no swap on ASCII fields
00056       break;
00057    case kXR_dirlist:
00058       // no swap on ASCII fields
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       // no swap on ASCII fields
00072       str->mkdir.mode = htons(str->mkdir.mode);
00073       break;
00074    case kXR_mv:
00075       // no swap on ASCII fields
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       // no swap on ASCII fields
00083       break;
00084    case kXR_protocol:
00085       // no swap on ASCII fields
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       // no swap on ASCII fields
00102       // and the swap of the list is done in
00103       // clientMarshallReadAheadList
00104       break;
00105    case kXR_rm:
00106       // no swap on ASCII fields
00107       break;
00108    case kXR_rmdir:
00109       // no swap on ASCII fields
00110       break;
00111    case kXR_set:
00112       // no swap on ASCII fields
00113       break;
00114    case kXR_stat:
00115       // no swap on ASCII fields
00116       break;
00117    case kXR_sync:
00118       // no swap on ASCII fields
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    // This function applies the network byte order on the
00140    // vector of read-ahead information
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    // This function applies the network byte order on the
00155    // vector of read-ahead information
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    // Recognizes if the response contains a redirection
00193 
00194    return ( (ServerResponse->status == kXR_redirect) ? true : false);
00195 }
00196 
00197 //_________________________________________________________________________
00198 char *convertRequestIdToChar(kXR_unt16 requestid)
00199 {
00200    // This procedure convert the request code id (an integer defined in
00201    // XProtocol.hhh) in the ascii label (human readable)
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    // this function inserts a filehandle in a generic request header
00300    // already composed
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 

Generated on Tue Jul 5 14:46:18 2011 for ROOT_528-00b_version by  doxygen 1.5.1