00001 #ifndef __XPROTOCOL_H
00002 #define __XPROTOCOL_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifdef __CINT__
00041 #define __attribute__(x)
00042 #endif
00043
00044
00045
00046
00047
00048 #define kXR_PROTOCOLVERSION 0x00000300
00049 #define kXR_PROTOCOLVSTRING "3.0.0"
00050
00051 #include "XProtocol/XPtypes.hh"
00052
00053
00054
00055
00056 #define kXR_DataServer 1
00057 #define kXR_LBalServer 0
00058
00059
00060
00061 #define kXR_isManager 0x00000002
00062 #define kXR_isServer 0x00000001
00063 #define kXR_attrMeta 0x00000100
00064 #define kXR_attrProxy 0x00000200
00065 #define kXR_attrSuper 0x00000400
00066
00067 #define kXR_maxReqRetry 10
00068
00069
00070
00071
00072 enum XReqErrorType {
00073 kGENERICERR = 0,
00074 kREAD,
00075 kWRITE,
00076 kREDIRCONNECT,
00077 kOK,
00078 kNOMORESTREAMS
00079
00080 };
00081
00082
00083
00084
00085
00086 enum XRequestTypes {
00087 kXR_auth = 3000,
00088 kXR_query,
00089 kXR_chmod,
00090 kXR_close,
00091 kXR_dirlist,
00092 kXR_getfile,
00093 kXR_protocol,
00094 kXR_login,
00095 kXR_mkdir,
00096 kXR_mv,
00097 kXR_open,
00098 kXR_ping,
00099 kXR_putfile,
00100 kXR_read,
00101 kXR_rm,
00102 kXR_rmdir,
00103 kXR_sync,
00104 kXR_stat,
00105 kXR_set,
00106 kXR_write,
00107 kXR_admin,
00108 kXR_prepare,
00109 kXR_statx,
00110 kXR_endsess,
00111 kXR_bind,
00112 kXR_readv,
00113 kXR_verifyw,
00114 kXR_locate,
00115 kXR_truncate
00116 };
00117
00118
00119 enum XOpenRequestMode {
00120 kXR_ur = 0x100,
00121 kXR_uw = 0x080,
00122 kXR_ux = 0x040,
00123 kXR_gr = 0x020,
00124 kXR_gw = 0x010,
00125 kXR_gx = 0x008,
00126 kXR_or = 0x004,
00127 kXR_ow = 0x002,
00128 kXR_ox = 0x001
00129 };
00130
00131 enum XMkdirOptions {
00132 kXR_mknone = 0,
00133 kXR_mkdirpath = 1
00134 };
00135
00136
00137 enum XLoginAbility {
00138 kXR_nothing = 0,
00139 kXR_fullurl = 1,
00140 kXR_multipr = 3,
00141 kXR_readrdok= 4,
00142 kXR_hasipv64= 8
00143 };
00144
00145
00146 enum XLoginCapVer {
00147 kXR_lcvnone = 0,
00148 kXR_vermask = 63,
00149 kXR_asyncap = 128
00150 };
00151
00152
00153
00154 enum XLoginVersion {
00155 kXR_ver000 = 0,
00156 kXR_ver001 = 1,
00157 kXR_ver002 = 2,
00158 kXR_ver003 = 3
00159 };
00160
00161 enum XStatRequestOption {
00162 kXR_vfs = 1
00163 };
00164
00165 enum XStatRespFlags {
00166 kXR_file = 0,
00167 kXR_xset = 1,
00168 kXR_isDir = 2,
00169 kXR_other = 4,
00170 kXR_offline = 8,
00171 kXR_readable=16,
00172 kXR_writable=32,
00173 kXR_poscpend=64,
00174 kXR_bkpexist=128
00175 };
00176
00177 enum XDirlistRequestOption {
00178 kXR_online = 1,
00179 kXR_dstat = 2
00180 };
00181
00182 enum XOpenRequestOption {
00183 kXR_compress = 1,
00184 kXR_delete = 2,
00185 kXR_force = 4,
00186 kXR_new = 8,
00187 kXR_open_read= 16,
00188 kXR_open_updt= 32,
00189 kXR_async = 64,
00190 kXR_refresh = 128,
00191 kXR_mkpath = 256,
00192 kXR_prefname = 256,
00193 kXR_open_apnd= 512,
00194 kXR_retstat = 1024,
00195 kXR_replica = 2048,
00196 kXR_posc = 4096,
00197 kXR_nowait = 8192,
00198 kXR_seqio =16384,
00199 kXR_open_wrto=32768
00200 };
00201
00202 enum XQueryType {
00203 kXR_QStats = 1,
00204 kXR_QPrep = 2,
00205 kXR_Qcksum = 3,
00206 kXR_Qxattr = 4,
00207 kXR_Qspace = 5,
00208 kXR_Qckscan= 6,
00209 kXR_Qconfig= 7,
00210 kXR_Qvisa = 8,
00211 kXR_Qopaque=16,
00212 kXR_Qopaquf=32,
00213 kXR_Qopaqug=64
00214 };
00215
00216 enum XVerifyType {
00217 kXR_nocrc = 0,
00218 kXR_crc32 = 1
00219 };
00220
00221 enum XLogonType {
00222 kXR_useruser = 0,
00223 kXR_useradmin = 1
00224 };
00225
00226
00227 enum XPrepRequestOption {
00228 kXR_cancel = 1,
00229 kXR_notify = 2,
00230 kXR_noerrs = 4,
00231 kXR_stage = 8,
00232 kXR_wmode = 16,
00233 kXR_coloc = 32,
00234 kXR_fresh = 64
00235 };
00236
00237
00238
00239
00240
00241 enum XResponseType {
00242 kXR_ok = 0,
00243 kXR_oksofar = 4000,
00244 kXR_attn,
00245 kXR_authmore,
00246 kXR_error,
00247 kXR_redirect,
00248 kXR_wait,
00249 kXR_waitresp,
00250 kXR_noResponsesYet = 10000
00251 };
00252
00253
00254
00255
00256
00257 enum XActionCode {
00258 kXR_asyncab = 5000,
00259 kXR_asyncdi,
00260 kXR_asyncms,
00261 kXR_asyncrd,
00262 kXR_asyncwt,
00263 kXR_asyncav,
00264 kXR_asynunav,
00265 kXR_asyncgo,
00266 kXR_asynresp
00267 };
00268
00269
00270
00271
00272
00273 enum XErrorCode {
00274 kXR_ArgInvalid = 3000,
00275 kXR_ArgMissing,
00276 kXR_ArgTooLong,
00277 kXR_FileLocked,
00278 kXR_FileNotOpen,
00279 kXR_FSError,
00280 kXR_InvalidRequest,
00281 kXR_IOError,
00282 kXR_NoMemory,
00283 kXR_NoSpace,
00284 kXR_NotAuthorized,
00285 kXR_NotFound,
00286 kXR_ServerError,
00287 kXR_Unsupported,
00288 kXR_noserver,
00289 kXR_NotFile,
00290 kXR_isDirectory,
00291 kXR_Cancelled,
00292 kXR_ChkLenErr,
00293 kXR_ChkSumErr,
00294 kXR_inProgress,
00295 kXR_noErrorYet = 10000
00296 };
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 struct ClientAdminRequest {
00313 kXR_char streamid[2];
00314 kXR_unt16 requestid;
00315 kXR_char reserved[16];
00316 kXR_int32 dlen;
00317 };
00318 struct ClientAuthRequest {
00319 kXR_char streamid[2];
00320 kXR_unt16 requestid;
00321 kXR_char reserved[12];
00322 kXR_char credtype[4];
00323 kXR_int32 dlen;
00324 };
00325 struct ClientBindRequest {
00326 kXR_char streamid[2];
00327 kXR_unt16 requestid;
00328 kXR_char sessid[16];
00329 kXR_int32 dlen;
00330 };
00331 struct ClientChmodRequest {
00332 kXR_char streamid[2];
00333 kXR_unt16 requestid;
00334 kXR_char reserved[14];
00335 kXR_unt16 mode;
00336 kXR_int32 dlen;
00337 };
00338 struct ClientCloseRequest {
00339 kXR_char streamid[2];
00340 kXR_unt16 requestid;
00341 kXR_char fhandle[4];
00342 kXR_int64 fsize;
00343 kXR_char reserved[4];
00344 kXR_int32 dlen;
00345 };
00346 struct ClientDirlistRequest {
00347 kXR_char streamid[2];
00348 kXR_unt16 requestid;
00349 kXR_char reserved[15];
00350 kXR_char options[1];
00351 kXR_int32 dlen;
00352 };
00353 struct ClientEndsessRequest {
00354 kXR_char streamid[2];
00355 kXR_unt16 requestid;
00356 kXR_char sessid[16];
00357 kXR_int32 dlen;
00358 };
00359 struct ClientGetfileRequest {
00360 kXR_char streamid[2];
00361 kXR_unt16 requestid;
00362 kXR_int32 options;
00363 kXR_char reserved[8];
00364 kXR_int32 buffsz;
00365 kXR_int32 dlen;
00366 };
00367 struct ClientLocateRequest {
00368 kXR_char streamid[2];
00369 kXR_unt16 requestid;
00370 kXR_unt16 options;
00371 kXR_char reserved[14];
00372 kXR_int32 dlen;
00373 };
00374 struct ClientLoginRequest {
00375 kXR_char streamid[2];
00376 kXR_unt16 requestid;
00377 kXR_int32 pid;
00378 kXR_char username[8];
00379 kXR_char reserved;
00380 kXR_char ability;
00381 kXR_char capver[1];
00382 kXR_char role[1];
00383 kXR_int32 dlen;
00384 };
00385 struct ClientMkdirRequest {
00386 kXR_char streamid[2];
00387 kXR_unt16 requestid;
00388 kXR_char options[1];
00389 kXR_char reserved[13];
00390 kXR_unt16 mode;
00391 kXR_int32 dlen;
00392 };
00393 struct ClientMvRequest {
00394 kXR_char streamid[2];
00395 kXR_unt16 requestid;
00396 kXR_char reserved[16];
00397 kXR_int32 dlen;
00398 };
00399 struct ClientOpenRequest {
00400 kXR_char streamid[2];
00401 kXR_unt16 requestid;
00402 kXR_unt16 mode;
00403 kXR_unt16 options;
00404 kXR_char reserved[12];
00405 kXR_int32 dlen;
00406 };
00407
00408 struct ClientPingRequest {
00409 kXR_char streamid[2];
00410 kXR_unt16 requestid;
00411 kXR_char reserved[16];
00412 kXR_int32 dlen;
00413 };
00414 struct ClientProtocolRequest {
00415 kXR_char streamid[2];
00416 kXR_unt16 requestid;
00417 kXR_int32 clientpv;
00418 kXR_char reserved[12];
00419 kXR_int32 dlen;
00420 };
00421 struct ClientPrepareRequest {
00422 kXR_char streamid[2];
00423 kXR_unt16 requestid;
00424 kXR_char options;
00425 kXR_char prty;
00426 kXR_unt16 port;
00427 kXR_char reserved[12];
00428 kXR_int32 dlen;
00429 };
00430 struct ClientPutfileRequest {
00431 kXR_char streamid[2];
00432 kXR_unt16 requestid;
00433 kXR_int32 options;
00434 kXR_char reserved[8];
00435 kXR_int32 buffsz;
00436 kXR_int32 dlen;
00437 };
00438 struct ClientQueryRequest {
00439 kXR_char streamid[2];
00440 kXR_unt16 requestid;
00441 kXR_unt16 infotype;
00442 kXR_char reserved1[2];
00443 kXR_char fhandle[4];
00444 kXR_char reserved2[8];
00445 kXR_int32 dlen;
00446 };
00447 struct ClientReadRequest {
00448 kXR_char streamid[2];
00449 kXR_unt16 requestid;
00450 kXR_char fhandle[4];
00451 kXR_int64 offset;
00452 kXR_int32 rlen;
00453 kXR_int32 dlen;
00454 };
00455 struct ClientReadVRequest {
00456 kXR_char streamid[2];
00457 kXR_unt16 requestid;
00458 kXR_char reserved[15];
00459 kXR_char pathid;
00460 kXR_int32 dlen;
00461 };
00462 struct ClientRmRequest {
00463 kXR_char streamid[2];
00464 kXR_unt16 requestid;
00465 kXR_char reserved[16];
00466 kXR_int32 dlen;
00467 };
00468 struct ClientRmdirRequest {
00469 kXR_char streamid[2];
00470 kXR_unt16 requestid;
00471 kXR_char reserved[16];
00472 kXR_int32 dlen;
00473 };
00474 struct ClientSetRequest {
00475 kXR_char streamid[2];
00476 kXR_unt16 requestid;
00477 kXR_char reserved[16];
00478 kXR_int32 dlen;
00479 };
00480 struct ClientStatRequest {
00481 kXR_char streamid[2];
00482 kXR_unt16 requestid;
00483 kXR_char options;
00484 kXR_char reserved[11];
00485 kXR_char fhandle[4];
00486 kXR_int32 dlen;
00487 };
00488 struct ClientSyncRequest {
00489 kXR_char streamid[2];
00490 kXR_unt16 requestid;
00491 kXR_char fhandle[4];
00492 kXR_char reserved[12];
00493 kXR_int32 dlen;
00494 };
00495 struct ClientTruncateRequest {
00496 kXR_char streamid[2];
00497 kXR_unt16 requestid;
00498 kXR_char fhandle[4];
00499 kXR_int64 offset;
00500 kXR_char reserved[4];
00501 kXR_int32 dlen;
00502 };
00503 struct ClientWriteRequest {
00504 kXR_char streamid[2];
00505 kXR_unt16 requestid;
00506 kXR_char fhandle[4];
00507 kXR_int64 offset;
00508 kXR_char pathid;
00509 kXR_char reserved[3];
00510 kXR_int32 dlen;
00511 };
00512 struct ClientVerifywRequest {
00513 kXR_char streamid[2];
00514 kXR_unt16 requestid;
00515 kXR_char fhandle[4];
00516 kXR_int64 offset;
00517 kXR_char pathid;
00518 kXR_char vertype;
00519 kXR_char reserved[2];
00520 kXR_int32 dlen;
00521 };
00522
00523 struct ClientRequestHdr {
00524 kXR_char streamid[2];
00525 kXR_unt16 requestid;
00526 kXR_char body[16];
00527 kXR_int32 dlen;
00528 };
00529
00530 typedef union {
00531 struct ClientRequestHdr header;
00532 struct ClientAdminRequest admin;
00533 struct ClientAuthRequest auth;
00534 struct ClientBindRequest bind;
00535 struct ClientChmodRequest chmod;
00536 struct ClientCloseRequest close;
00537 struct ClientDirlistRequest dirlist;
00538 struct ClientEndsessRequest endsess;
00539 struct ClientGetfileRequest getfile;
00540 struct ClientLocateRequest locate;
00541 struct ClientLoginRequest login;
00542 struct ClientMkdirRequest mkdir;
00543 struct ClientMvRequest mv;
00544 struct ClientOpenRequest open;
00545 struct ClientPingRequest ping;
00546 struct ClientPrepareRequest prepare;
00547 struct ClientProtocolRequest protocol;
00548 struct ClientPutfileRequest putfile;
00549 struct ClientQueryRequest query;
00550 struct ClientReadRequest read;
00551 struct ClientReadVRequest readv;
00552 struct ClientRmRequest rm;
00553 struct ClientRmdirRequest rmdir;
00554 struct ClientSetRequest set;
00555 struct ClientStatRequest stat;
00556 struct ClientSyncRequest sync;
00557 struct ClientTruncateRequest truncate;
00558 struct ClientWriteRequest write;
00559 } ClientRequest;
00560
00561 struct readahead_list {
00562 kXR_char fhandle[4];
00563 kXR_int32 rlen;
00564 kXR_int64 offset;
00565 };
00566
00567 struct read_args {
00568 kXR_char pathid;
00569 kXR_char reserved[7];
00570
00571 };
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585 struct ServerResponseHeader {
00586 kXR_char streamid[2];
00587 kXR_unt16 status;
00588 kXR_int32 dlen;
00589 };
00590
00591
00592 struct ServerResponseBody_Bind {
00593 kXR_char substreamid;
00594 };
00595
00596
00597 struct ServerResponseBody_Open {
00598 kXR_char fhandle[4];
00599 kXR_int32 cpsize;
00600 kXR_char cptype[4];
00601 };
00602
00603
00604 struct ServerResponseBody_Protocol {
00605 kXR_int32 pval;
00606 kXR_int32 flags;
00607 };
00608
00609 struct ServerResponseBody_Login {
00610 kXR_char sessid[16];
00611 kXR_char sec[4096];
00612 };
00613
00614 struct ServerResponseBody_Redirect {
00615 kXR_int32 port;
00616 char host[4096];
00617 };
00618
00619 struct ServerResponseBody_Error {
00620 kXR_int32 errnum;
00621 char errmsg[4096];
00622 };
00623
00624 struct ServerResponseBody_Wait {
00625 kXR_int32 seconds;
00626 char infomsg[4096];
00627 };
00628
00629 struct ServerResponseBody_Waitresp {
00630 kXR_int32 seconds;
00631 };
00632
00633 struct ServerResponseBody_Attn {
00634 kXR_int32 actnum;
00635 char parms[4096];
00636 };
00637
00638 struct ServerResponseBody_Attn_asyncrd {
00639 kXR_int32 actnum;
00640 kXR_int32 port;
00641 char host[4092];
00642 };
00643
00644 struct ServerResponseBody_Attn_asynresp {
00645 kXR_int32 actnum;
00646 char reserved[4];
00647 ServerResponseHeader resphdr;
00648 char respdata[4096];
00649 };
00650
00651 struct ServerResponseBody_Attn_asyncwt {
00652 kXR_int32 actnum;
00653 kXR_int32 wsec;
00654 };
00655
00656 struct ServerResponseBody_Attn_asyncdi {
00657 kXR_int32 actnum;
00658 kXR_int32 wsec;
00659 kXR_int32 msec;
00660 };
00661
00662 struct ServerResponseBody_Authmore {
00663 char data[4096];
00664 };
00665
00666 struct ServerResponseBody_Buffer {
00667 char data[4096];
00668 };
00669
00670 struct ServerResponse
00671 {
00672 ServerResponseHeader hdr;
00673 union
00674 {
00675 ServerResponseBody_Error error;
00676 ServerResponseBody_Authmore authmore;
00677 ServerResponseBody_Wait wait;
00678 ServerResponseBody_Waitresp waitresp;
00679 ServerResponseBody_Redirect redirect;
00680 ServerResponseBody_Attn attn;
00681 ServerResponseBody_Protocol protocol;
00682 ServerResponseBody_Login login;
00683 ServerResponseBody_Buffer buffer;
00684 ServerResponseBody_Bind bind;
00685 } body;
00686 };
00687
00688 void ServerResponseHeader2NetFmt(struct ServerResponseHeader *srh);
00689
00690
00691 struct ClientInitHandShake {
00692 kXR_int32 first;
00693 kXR_int32 second;
00694 kXR_int32 third;
00695 kXR_int32 fourth;
00696 kXR_int32 fifth;
00697 };
00698
00699
00700 struct ServerInitHandShake {
00701 kXR_int32 msglen;
00702 kXR_int32 protover;
00703 kXR_int32 msgval;
00704 };
00705
00706
00707
00708 typedef kXR_int32 ServerResponseType;
00709
00710 struct ALIGN_CHECK {char chkszreq[25-sizeof(ClientRequest)];
00711 char chkszrsp[ 9-sizeof(ServerResponseHeader)];
00712 };
00713
00714
00715
00716
00717
00718 #include <errno.h>
00719 #if defined(WIN32)
00720 #if !defined(ENOTBLK)
00721 # define ENOTBLK 15
00722 #endif
00723 #if !defined(ETXTBSY)
00724 #define ETXTBSY 26
00725 #endif
00726 #if !defined(ENOBUFS)
00727 #define ENOBUFS 105
00728 #endif
00729 #if !defined(ENETUNREACH)
00730 #define ENETUNREACH 114
00731 #endif
00732 #endif
00733
00734 class XProtocol
00735 {
00736 public:
00737
00738
00739
00740 static int mapError(int rc)
00741 {if (rc < 0) rc = -rc;
00742 switch(rc)
00743 {case ENOENT: return kXR_NotFound;
00744 case EPERM: return kXR_NotAuthorized;
00745 case EACCES: return kXR_NotAuthorized;
00746 case EIO: return kXR_IOError;
00747 case ENOMEM: return kXR_NoMemory;
00748 case ENOBUFS: return kXR_NoMemory;
00749 case ENOSPC: return kXR_NoSpace;
00750 case ENAMETOOLONG: return kXR_ArgTooLong;
00751 case ENETUNREACH: return kXR_noserver;
00752 case ENOTBLK: return kXR_NotFile;
00753 case EISDIR: return kXR_isDirectory;
00754 case EEXIST: return kXR_InvalidRequest;
00755 case ETXTBSY: return kXR_inProgress;
00756 default: return kXR_FSError;
00757 }
00758 }
00759 };
00760 #endif