XProofProtUtils.cxx

Go to the documentation of this file.
00001 // @(#)root/proofd:$Id: XProofProtUtils.cxx 29580 2009-07-25 12:31:53Z ganis $
00002 // Author: Gerardo Ganis  12/12/2005
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // XProofProtUtils.cxx                                                  //
00015 //                                                                      //
00016 // Authors: G. Ganis, CERN 2005                                         //
00017 //                                                                      //
00018 // Utility functions prototypes for client-to-server                    //
00019 //                                                                      //
00020 //////////////////////////////////////////////////////////////////////////
00021 
00022 #ifdef __APPLE__
00023 #   ifndef __macos__
00024 #      define __macos__
00025 #   endif
00026 #endif
00027 #ifdef __sun
00028 #   ifndef __solaris__
00029 #      define __solaris__
00030 #   endif
00031 #endif
00032 #ifndef WIN32
00033 #include <sys/types.h>
00034 #include <netinet/in.h>
00035 #endif
00036 #include "XrdSys/XrdSysPlatform.hh"
00037 #include "XProofProtocol.h"
00038 #include "XProofProtUtils.h"
00039 #include "Bytes.h"
00040 
00041 
00042 namespace XPD {
00043 
00044 //___________________________________________________________________________
00045 int clientMarshall(XPClientRequest* str)
00046 {
00047    // This function applies the network byte order on those
00048    // parts of the 16-bytes buffer, only if it is composed
00049    // by some binary part
00050    // Return 0 if OK, -1 in case the ID is unknown
00051 
00052    switch(str->header.requestid) {
00053 
00054    case kXP_login:
00055       str->login.pid = htonl(str->login.pid);
00056       break;
00057    case kXP_auth:
00058       // no swap on ASCII fields
00059       break;
00060    case kXP_create:
00061       // no swap on ASCII fields
00062       str->proof.int1 = htonl(str->proof.int1);
00063       break;
00064    case kXP_destroy:
00065       str->proof.sid = htonl(str->proof.sid);
00066       break;
00067    case kXP_attach:
00068       str->proof.sid = htonl(str->proof.sid);
00069       break;
00070    case kXP_detach:
00071       str->proof.sid = htonl(str->proof.sid);
00072       break;
00073    case kXP_cleanup:
00074       str->proof.sid = htonl(str->proof.sid);
00075       str->proof.int1 = htonl(str->proof.int1);
00076       str->proof.int2 = htonl(str->proof.int2);
00077       break;
00078    case kXP_sendmsg:
00079       str->sendrcv.sid = htonl(str->sendrcv.sid);
00080       str->sendrcv.opt = htonl(str->sendrcv.opt);
00081       str->sendrcv.cid = htonl(str->sendrcv.cid);
00082       break;
00083    case kXP_admin:
00084       str->proof.sid = htonl(str->proof.sid);
00085       str->proof.int1 = htonl(str->proof.int1);
00086       str->proof.int2 = htonl(str->proof.int2);
00087       str->proof.int3 = htonl(str->proof.int3);
00088       break;
00089    case kXP_readbuf:
00090       str->readbuf.ofs = htonll(str->readbuf.ofs);
00091       str->readbuf.len = htonl(str->readbuf.len);
00092       str->readbuf.int1 = htonl(str->readbuf.int1);
00093       break;
00094    case kXP_interrupt:
00095       str->interrupt.sid = htonl(str->interrupt.sid);
00096       str->interrupt.type = htonl(str->interrupt.type);
00097       break;
00098    case kXP_ping:
00099       str->sendrcv.sid = htonl(str->sendrcv.sid);
00100       str->sendrcv.opt = htonl(str->sendrcv.opt);
00101       break;
00102    case kXP_urgent:
00103       str->proof.sid = htonl(str->proof.sid);
00104       str->proof.int1 = htonl(str->proof.int1);
00105       str->proof.int2 = htonl(str->proof.int2);
00106       str->proof.int3 = htonl(str->proof.int3);
00107       break;
00108    case kXP_touch:
00109       str->sendrcv.sid = htonl(str->sendrcv.sid);
00110       break;
00111    case kXP_ctrlc:
00112       str->proof.sid = htonl(str->sendrcv.sid);
00113       break;
00114    default:
00115       fprintf(stderr,"clientMarshall: unknown req ID: %d (0x%x)\n",
00116                       str->header.requestid, str->header.requestid);
00117       return -1;
00118       break;
00119    }
00120 
00121    str->header.requestid = htons(str->header.requestid);
00122    str->header.dlen      = htonl(str->header.dlen);
00123 
00124    return 0;
00125 }
00126 
00127 //_________________________________________________________________________
00128 void clientUnmarshall(struct ServerResponseHeader* str)
00129 {
00130    str->status = ntohs(str->status);
00131    str->dlen   = ntohl(str->dlen);
00132 }
00133 
00134 //_________________________________________________________________________
00135 void ServerResponseHeader2NetFmt(struct ServerResponseHeader *srh)
00136 {
00137    srh->status = htons(srh->status);
00138    srh->dlen   = htonl(srh->dlen);
00139 }
00140 
00141 //_________________________________________________________________________
00142 void ServerInitHandShake2HostFmt(struct ServerInitHandShake *srh)
00143 {
00144    srh->msglen  = ntohl(srh->msglen);
00145    srh->protover = ntohl(srh->protover);
00146    srh->msgval  = ntohl(srh->msgval);
00147 }
00148 
00149 //_________________________________________________________________________
00150 char *convertRequestIdToChar(kXR_int16 requestid)
00151 {
00152    // This procedure convert the request code id (an integer defined in
00153    // XProtocol.hh) in the ascii label (human readable)
00154 
00155    switch(requestid) {
00156 
00157    case kXP_login:
00158       return (char *)"kXP_login";
00159    case kXP_auth:
00160       return (char *)"kXP_auth";
00161    case kXP_create:
00162       return (char *)"kXP_create";
00163    case kXP_destroy:
00164       return (char *)"kXP_destroy";
00165    case kXP_attach:
00166       return (char *)"kXP_attach";
00167    case kXP_detach:
00168       return (char *)"kXP_detach";
00169    case kXP_sendmsg:
00170       return (char *)"kXP_sendmsg";
00171    case kXP_admin:
00172       return (char *)"kXP_admin";
00173    case kXP_readbuf:
00174       return (char *)"kXP_readbuf";
00175    case kXP_interrupt:
00176       return (char *)"kXP_interrupt";
00177    case kXP_ping:
00178       return (char *)"kXP_ping";
00179    case kXP_cleanup:
00180       return (char *)"kXP_cleanup";
00181    case kXP_urgent:
00182       return (char *)"kXP_urgent";
00183    case kXP_touch:
00184       return (char *)"kXP_touch";
00185    case kXP_ctrlc:
00186       return (char *)"kXP_ctrlc";
00187    default:
00188       return (char *)"kXP_UNKNOWN";
00189    }
00190 }
00191 
00192 //___________________________________________________________________________
00193 char *convertRespStatusToChar(kXR_int16 status)
00194 {
00195    switch( status) {
00196    case kXP_ok:
00197       return (char *)"kXP_ok";
00198       break;
00199    case kXP_oksofar:
00200       return (char *)"kXP_oksofar";
00201       break;
00202    case kXP_attn:
00203       return (char *)"kXP_attn";
00204       break;
00205    case kXP_authmore:
00206       return (char *)"kXP_authmore";
00207       break;
00208    case kXP_error:
00209       return (char *)"kXP_error";
00210       break;
00211    case kXP_wait:
00212       return (char *)"kXP_wait";
00213       break;
00214    default:
00215       return (char *)"kXP_UNKNOWN";
00216       break;
00217    }
00218 }
00219 
00220 //___________________________________________________________________________
00221 void smartPrintClientHeader(XPClientRequest* hdr)
00222 {
00223    printf("\n\n================= DUMPING CLIENT REQUEST HEADER =================\n");
00224 
00225    printf("%40s0x%.2x 0x%.2x\n", "ClientHeader.streamid = ",
00226           hdr->header.streamid[0], hdr->header.streamid[1]);
00227 
00228    printf("%40s%s (%d)\n", "ClientHeader.requestid = ",
00229           convertRequestIdToChar(hdr->header.requestid), hdr->header.requestid);
00230 
00231    void *tmp;
00232    switch(hdr->header.requestid) {
00233 
00234    case kXP_login:
00235       printf("%40s%d \n", "ClientHeader.login.pid = ", hdr->login.pid);
00236       printf("%40s%s\n", "ClientHeader.login_body.username = ", hdr->login.username);
00237       tmp = &hdr->login.reserved[0];
00238       printf("%40s0 repeated %d times\n", "ClientHeader.login.reserved = ",
00239              *((kXR_int16 *)tmp)); // use tmp to avoid type punned warning
00240       printf("%40s%d\n", "ClientHeader.login.role = ", (kXR_int32)hdr->login.role[0]);
00241       break;
00242    case kXP_auth:
00243       printf("%40s0 repeated %d times\n", "ClientHeader.auth.reserved = ",
00244              (kXR_int32)sizeof(hdr->auth.reserved));
00245       printf("  ClientHeader.auth.credtype= 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",
00246              hdr->auth.credtype[0], hdr->auth.credtype[1],
00247              hdr->auth.credtype[2], hdr->auth.credtype[3]);
00248       break;
00249    case kXP_create:
00250       break;
00251    case kXP_destroy:
00252       printf("%40s%d \n", "ClientHeader.proof.sid = ", hdr->proof.sid);
00253       break;
00254    case kXP_attach:
00255       printf("%40s%d \n", "ClientHeader.proof.sid = ", hdr->proof.sid);
00256       break;
00257    case kXP_detach:
00258       printf("%40s%d \n", "ClientHeader.proof.sid = ", hdr->proof.sid);
00259       break;
00260    case kXP_ctrlc:
00261       printf("%40s%d \n", "ClientHeader.proof.sid = ", hdr->proof.sid);
00262       break;
00263    case kXP_cleanup:
00264       printf("%40s%d \n", "ClientHeader.proof.sid = ", hdr->proof.sid);
00265       printf("%40s%d \n", "ClientHeader.proof.int1 = ", hdr->proof.int1);
00266       printf("%40s%d \n", "ClientHeader.proof.int2 = ", hdr->proof.int2);
00267       break;
00268    case kXP_sendmsg:
00269       printf("%40s%d \n", "ClientHeader.sendrcv.sid = ", hdr->sendrcv.sid);
00270       printf("%40s%d \n", "ClientHeader.sendrcv.opt = ", hdr->sendrcv.opt);
00271       printf("%40s%d \n", "ClientHeader.sendrcv.cid = ", hdr->sendrcv.cid);
00272       break;
00273    case kXP_interrupt:
00274       printf("%40s%d \n", "ClientHeader.interrupt.sid = ", hdr->interrupt.sid);
00275       printf("%40s%d \n", "ClientHeader.interrupt.type = ", hdr->interrupt.type);
00276       break;
00277    case kXP_ping:
00278       printf("%40s%d \n", "ClientHeader.sendrcv.sid = ", hdr->sendrcv.sid);
00279       printf("%40s%d \n", "ClientHeader.sendrcv.opt = ", hdr->sendrcv.opt);
00280       break;
00281    case kXP_touch:
00282       printf("%40s%d \n", "ClientHeader.sendrcv.sid = ", hdr->sendrcv.sid);
00283       break;
00284    case kXP_admin:
00285    case kXP_urgent:
00286       printf("%40s%d \n", "ClientHeader.proof.sid = ", hdr->proof.sid);
00287       printf("%40s%d \n", "ClientHeader.proof.int1 = ", hdr->proof.int1);
00288       printf("%40s%d \n", "ClientHeader.proof.int2 = ", hdr->proof.int2);
00289       printf("%40s%d \n", "ClientHeader.proof.int3 = ", hdr->proof.int3);
00290       break;
00291     case kXP_readbuf:
00292       printf("%40s%lld \n", "ClientHeader.readbuf.ofs = ", hdr->readbuf.ofs);
00293       printf("%40s%d \n", "ClientHeader.readbuf.len = ", hdr->readbuf.len);
00294       break;
00295     default:
00296       printf("Unknown request ID: %d ! \n", hdr->header.requestid);
00297   }
00298 
00299    printf("%40s%d", "ClientHeader.header.dlen = ", hdr->header.dlen);
00300    printf("\n=================== END CLIENT HEADER DUMPING ===================\n\n");
00301 }
00302 
00303 //___________________________________________________________________________
00304 void smartPrintServerHeader(struct ServerResponseHeader* hdr)
00305 {
00306    printf("\n\n======== DUMPING SERVER RESPONSE HEADER ========\n");
00307    printf("%30s0x%.2x 0x%.2x\n", "ServerHeader.streamid = ",
00308           hdr->streamid[0], hdr->streamid[1]);
00309    switch(hdr->status) {
00310    case kXP_ok:
00311       printf("%30skXP_ok", "ServerHeader.status = ");
00312       break;
00313    case kXP_attn:
00314       printf("%30skXP_attn", "ServerHeader.status = ");
00315       break;
00316    case kXP_authmore:
00317       printf("%30skXP_authmore", "ServerHeader.status = ");
00318       break;
00319    case kXP_error:
00320       printf("%30skXP_error", "ServerHeader.status = ");
00321       break;
00322    case kXP_oksofar:
00323       printf("%30skXP_oksofar", "ServerHeader.status = ");
00324       break;
00325    case kXP_wait:
00326       printf("%30skXP_wait", "ServerHeader.status = ");
00327       break;
00328    }
00329    printf(" (%d)\n", hdr->status);
00330    printf("%30s%d", "ServerHeader.dlen = ", hdr->dlen);
00331    printf("\n========== END DUMPING SERVER HEADER ===========\n\n");
00332 }
00333 
00334 } // namespace ROOT

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