00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
00048
00049
00050
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
00059 break;
00060 case kXP_create:
00061
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
00153
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));
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 }