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 0x00000297
00049 #define kXR_PROTOCOLVSTRING "2.9.7"
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 XLoginCapVer {
00138 kXR_lcvnone = 0,
00139 kXR_vermask = 63,
00140 kXR_asyncap = 128
00141 };
00142
00143
00144
00145 enum XLoginVersion {
00146 kXR_ver000 = 0,
00147 kXR_ver001 = 1,
00148 kXR_ver002 = 2,
00149 kXR_ver003 = 3
00150 };
00151
00152 enum XStatRequestOption {
00153 kXR_vfs = 1
00154 };
00155
00156 enum XStatRespFlags {
00157 kXR_file = 0,
00158 kXR_xset = 1,
00159 kXR_isDir = 2,
00160 kXR_other = 4,
00161 kXR_offline = 8,
00162 kXR_readable=16,
00163 kXR_writable=32,
00164 kXR_poscpend=64
00165 };
00166
00167 enum XDirlistRequestOption {
00168 kXR_online = 1
00169 };
00170
00171 enum XOpenRequestOption {
00172 kXR_compress = 1,
00173 kXR_delete = 2,
00174 kXR_force = 4,
00175 kXR_new = 8,
00176 kXR_open_read= 16,
00177 kXR_open_updt= 32,
00178 kXR_async = 64,
00179 kXR_refresh = 128,
00180 kXR_mkpath = 256,
00181 kXR_open_apnd= 512,
00182 kXR_retstat = 1024,
00183 kXR_replica = 2048,
00184 kXR_posc = 4096,
00185 kXR_nowait = 8192,
00186 kXR_seqio =16384
00187 };
00188
00189 enum XQueryType {
00190 kXR_QStats = 1,
00191 kXR_QPrep = 2,
00192 kXR_Qcksum = 3,
00193 kXR_Qxattr = 4,
00194 kXR_Qspace = 5,
00195 kXR_Qckscan= 6,
00196 kXR_Qconfig= 7,
00197 kXR_Qvisa = 8,
00198 kXR_Qopaque=16,
00199 kXR_Qopaquf=32
00200 };
00201
00202 enum XVerifyType {
00203 kXR_nocrc = 0,
00204 kXR_crc32 = 1
00205 };
00206
00207 enum XLogonType {
00208 kXR_useruser = 0,
00209 kXR_useradmin = 1
00210 };
00211
00212
00213 enum XPrepRequestOption {
00214 kXR_cancel = 1,
00215 kXR_notify = 2,
00216 kXR_noerrs = 4,
00217 kXR_stage = 8,
00218 kXR_wmode = 16,
00219 kXR_coloc = 32,
00220 kXR_fresh = 64
00221 };
00222
00223
00224
00225
00226
00227 enum XResponseType {
00228 kXR_ok = 0,
00229 kXR_oksofar = 4000,
00230 kXR_attn,
00231 kXR_authmore,
00232 kXR_error,
00233 kXR_redirect,
00234 kXR_wait,
00235 kXR_waitresp,
00236 kXR_noResponsesYet = 10000
00237 };
00238
00239
00240
00241
00242
00243 enum XActionCode {
00244 kXR_asyncab = 5000,
00245 kXR_asyncdi,
00246 kXR_asyncms,
00247 kXR_asyncrd,
00248 kXR_asyncwt,
00249 kXR_asyncav,
00250 kXR_asynunav,
00251 kXR_asyncgo,
00252 kXR_asynresp
00253 };
00254
00255
00256
00257
00258
00259 enum XErrorCode {
00260 kXR_ArgInvalid = 3000,
00261 kXR_ArgMissing,
00262 kXR_ArgTooLong,
00263 kXR_FileLocked,
00264 kXR_FileNotOpen,
00265 kXR_FSError,
00266 kXR_InvalidRequest,
00267 kXR_IOError,
00268 kXR_NoMemory,
00269 kXR_NoSpace,
00270 kXR_NotAuthorized,
00271 kXR_NotFound,
00272 kXR_ServerError,
00273 kXR_Unsupported,
00274 kXR_noserver,
00275 kXR_NotFile,
00276 kXR_isDirectory,
00277 kXR_Cancelled,
00278 kXR_ChkLenErr,
00279 kXR_ChkSumErr,
00280 kXR_inProgress,
00281 kXR_noErrorYet = 10000
00282 };
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 struct ClientAdminRequest {
00299 kXR_char streamid[2];
00300 kXR_unt16 requestid;
00301 kXR_char reserved[16];
00302 kXR_int32 dlen;
00303 };
00304 struct ClientAuthRequest {
00305 kXR_char streamid[2];
00306 kXR_unt16 requestid;
00307 kXR_char reserved[12];
00308 kXR_char credtype[4];
00309 kXR_int32 dlen;
00310 };
00311 struct ClientBindRequest {
00312 kXR_char streamid[2];
00313 kXR_unt16 requestid;
00314 kXR_char sessid[16];
00315 kXR_int32 dlen;
00316 };
00317 struct ClientChmodRequest {
00318 kXR_char streamid[2];
00319 kXR_unt16 requestid;
00320 kXR_char reserved[14];
00321 kXR_unt16 mode;
00322 kXR_int32 dlen;
00323 };
00324 struct ClientCloseRequest {
00325 kXR_char streamid[2];
00326 kXR_unt16 requestid;
00327 kXR_char fhandle[4];
00328 kXR_int64 fsize;
00329 kXR_char reserved[4];
00330 kXR_int32 dlen;
00331 };
00332 struct ClientDirlistRequest {
00333 kXR_char streamid[2];
00334 kXR_unt16 requestid;
00335 kXR_char reserved[15];
00336 kXR_char options[1];
00337 kXR_int32 dlen;
00338 };
00339 struct ClientEndsessRequest {
00340 kXR_char streamid[2];
00341 kXR_unt16 requestid;
00342 kXR_char sessid[16];
00343 kXR_int32 dlen;
00344 };
00345 struct ClientGetfileRequest {
00346 kXR_char streamid[2];
00347 kXR_unt16 requestid;
00348 kXR_int32 options;
00349 kXR_char reserved[8];
00350 kXR_int32 buffsz;
00351 kXR_int32 dlen;
00352 };
00353 struct ClientLocateRequest {
00354 kXR_char streamid[2];
00355 kXR_unt16 requestid;
00356 kXR_unt16 options;
00357 kXR_char reserved[14];
00358 kXR_int32 dlen;
00359 };
00360 struct ClientLoginRequest {
00361 kXR_char streamid[2];
00362 kXR_unt16 requestid;
00363 kXR_int32 pid;
00364 kXR_char username[8];
00365 kXR_char reserved[2];
00366 kXR_char capver[1];
00367 kXR_char role[1];
00368 kXR_int32 dlen;
00369 };
00370 struct ClientMkdirRequest {
00371 kXR_char streamid[2];
00372 kXR_unt16 requestid;
00373 kXR_char options[1];
00374 kXR_char reserved[13];
00375 kXR_unt16 mode;
00376 kXR_int32 dlen;
00377 };
00378 struct ClientMvRequest {
00379 kXR_char streamid[2];
00380 kXR_unt16 requestid;
00381 kXR_char reserved[16];
00382 kXR_int32 dlen;
00383 };
00384 struct ClientOpenRequest {
00385 kXR_char streamid[2];
00386 kXR_unt16 requestid;
00387 kXR_unt16 mode;
00388 kXR_unt16 options;
00389 kXR_char reserved[12];
00390 kXR_int32 dlen;
00391 };
00392
00393 struct ClientPingRequest {
00394 kXR_char streamid[2];
00395 kXR_unt16 requestid;
00396 kXR_char reserved[16];
00397 kXR_int32 dlen;
00398 };
00399 struct ClientProtocolRequest {
00400 kXR_char streamid[2];
00401 kXR_unt16 requestid;
00402 kXR_int32 clientpv;
00403 kXR_char reserved[12];
00404 kXR_int32 dlen;
00405 };
00406 struct ClientPrepareRequest {
00407 kXR_char streamid[2];
00408 kXR_unt16 requestid;
00409 kXR_char options;
00410 kXR_char prty;
00411 kXR_unt16 port;
00412 kXR_char reserved[12];
00413 kXR_int32 dlen;
00414 };
00415 struct ClientPutfileRequest {
00416 kXR_char streamid[2];
00417 kXR_unt16 requestid;
00418 kXR_int32 options;
00419 kXR_char reserved[8];
00420 kXR_int32 buffsz;
00421 kXR_int32 dlen;
00422 };
00423 struct ClientQueryRequest {
00424 kXR_char streamid[2];
00425 kXR_unt16 requestid;
00426 kXR_unt16 infotype;
00427 kXR_char reserved1[2];
00428 kXR_char fhandle[4];
00429 kXR_char reserved2[8];
00430 kXR_int32 dlen;
00431 };
00432 struct ClientReadRequest {
00433 kXR_char streamid[2];
00434 kXR_unt16 requestid;
00435 kXR_char fhandle[4];
00436 kXR_int64 offset;
00437 kXR_int32 rlen;
00438 kXR_int32 dlen;
00439 };
00440 struct ClientReadVRequest {
00441 kXR_char streamid[2];
00442 kXR_unt16 requestid;
00443 kXR_char reserved[15];
00444 kXR_char pathid;
00445 kXR_int32 dlen;
00446 };
00447 struct ClientRmRequest {
00448 kXR_char streamid[2];
00449 kXR_unt16 requestid;
00450 kXR_char reserved[16];
00451 kXR_int32 dlen;
00452 };
00453 struct ClientRmdirRequest {
00454 kXR_char streamid[2];
00455 kXR_unt16 requestid;
00456 kXR_char reserved[16];
00457 kXR_int32 dlen;
00458 };
00459 struct ClientSetRequest {
00460 kXR_char streamid[2];
00461 kXR_unt16 requestid;
00462 kXR_char reserved[16];
00463 kXR_int32 dlen;
00464 };
00465 struct ClientStatRequest {
00466 kXR_char streamid[2];
00467 kXR_unt16 requestid;
00468 kXR_char options;
00469 kXR_char reserved[11];
00470 kXR_char fhandle[4];
00471 kXR_int32 dlen;
00472 };
00473 struct ClientSyncRequest {
00474 kXR_char streamid[2];
00475 kXR_unt16 requestid;
00476 kXR_char fhandle[4];
00477 kXR_char reserved[12];
00478 kXR_int32 dlen;
00479 };
00480 struct ClientTruncateRequest {
00481 kXR_char streamid[2];
00482 kXR_unt16 requestid;
00483 kXR_char fhandle[4];
00484 kXR_int64 offset;
00485 kXR_char reserved[4];
00486 kXR_int32 dlen;
00487 };
00488 struct ClientWriteRequest {
00489 kXR_char streamid[2];
00490 kXR_unt16 requestid;
00491 kXR_char fhandle[4];
00492 kXR_int64 offset;
00493 kXR_char pathid;
00494 kXR_char reserved[3];
00495 kXR_int32 dlen;
00496 };
00497 struct ClientVerifywRequest {
00498 kXR_char streamid[2];
00499 kXR_unt16 requestid;
00500 kXR_char fhandle[4];
00501 kXR_int64 offset;
00502 kXR_char pathid;
00503 kXR_char vertype;
00504 kXR_char reserved[2];
00505 kXR_int32 dlen;
00506 };
00507
00508 struct ClientRequestHdr {
00509 kXR_char streamid[2];
00510 kXR_unt16 requestid;
00511 kXR_char body[16];
00512 kXR_int32 dlen;
00513 };
00514
00515 typedef union {
00516 struct ClientRequestHdr header;
00517 struct ClientAdminRequest admin;
00518 struct ClientAuthRequest auth;
00519 struct ClientBindRequest bind;
00520 struct ClientChmodRequest chmod;
00521 struct ClientCloseRequest close;
00522 struct ClientDirlistRequest dirlist;
00523 struct ClientEndsessRequest endsess;
00524 struct ClientGetfileRequest getfile;
00525 struct ClientLocateRequest locate;
00526 struct ClientLoginRequest login;
00527 struct ClientMkdirRequest mkdir;
00528 struct ClientMvRequest mv;
00529 struct ClientOpenRequest open;
00530 struct ClientPingRequest ping;
00531 struct ClientPrepareRequest prepare;
00532 struct ClientProtocolRequest protocol;
00533 struct ClientPutfileRequest putfile;
00534 struct ClientQueryRequest query;
00535 struct ClientReadRequest read;
00536 struct ClientReadVRequest readv;
00537 struct ClientRmRequest rm;
00538 struct ClientRmdirRequest rmdir;
00539 struct ClientSetRequest set;
00540 struct ClientStatRequest stat;
00541 struct ClientSyncRequest sync;
00542 struct ClientTruncateRequest truncate;
00543 struct ClientWriteRequest write;
00544 } ClientRequest;
00545
00546 struct readahead_list {
00547 kXR_char fhandle[4];
00548 kXR_int32 rlen;
00549 kXR_int64 offset;
00550 };
00551
00552 struct read_args {
00553 kXR_char pathid;
00554 kXR_char reserved[7];
00555
00556 };
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570 struct ServerResponseHeader {
00571 kXR_char streamid[2];
00572 kXR_unt16 status;
00573 kXR_int32 dlen;
00574 };
00575
00576
00577 struct ServerResponseBody_Bind {
00578 kXR_char substreamid;
00579 };
00580
00581
00582 struct ServerResponseBody_Open {
00583 kXR_char fhandle[4];
00584 kXR_int32 cpsize;
00585 kXR_char cptype[4];
00586 };
00587
00588
00589 struct ServerResponseBody_Protocol {
00590 kXR_int32 pval;
00591 kXR_int32 flags;
00592 };
00593
00594 struct ServerResponseBody_Login {
00595 kXR_char sessid[16];
00596 kXR_char sec[4096];
00597 };
00598
00599 struct ServerResponseBody_Redirect {
00600 kXR_int32 port;
00601 char host[4096];
00602 };
00603
00604 struct ServerResponseBody_Error {
00605 kXR_int32 errnum;
00606 char errmsg[4096];
00607 };
00608
00609 struct ServerResponseBody_Wait {
00610 kXR_int32 seconds;
00611 char infomsg[4096];
00612 };
00613
00614 struct ServerResponseBody_Waitresp {
00615 kXR_int32 seconds;
00616 };
00617
00618 struct ServerResponseBody_Attn {
00619 kXR_int32 actnum;
00620 char parms[4096];
00621 };
00622
00623 struct ServerResponseBody_Attn_asyncrd {
00624 kXR_int32 actnum;
00625 kXR_int32 port;
00626 char host[4092];
00627 };
00628
00629 struct ServerResponseBody_Attn_asynresp {
00630 kXR_int32 actnum;
00631 char reserved[4];
00632 ServerResponseHeader resphdr;
00633 char respdata[4096];
00634 };
00635
00636 struct ServerResponseBody_Attn_asyncwt {
00637 kXR_int32 actnum;
00638 kXR_int32 wsec;
00639 };
00640
00641 struct ServerResponseBody_Attn_asyncdi {
00642 kXR_int32 actnum;
00643 kXR_int32 wsec;
00644 kXR_int32 msec;
00645 };
00646
00647 struct ServerResponseBody_Authmore {
00648 char data[4096];
00649 };
00650
00651 struct ServerResponseBody_Buffer {
00652 char data[4096];
00653 };
00654
00655 struct ServerResponse
00656 {
00657 ServerResponseHeader hdr;
00658 union
00659 {
00660 ServerResponseBody_Error error;
00661 ServerResponseBody_Authmore authmore;
00662 ServerResponseBody_Wait wait;
00663 ServerResponseBody_Waitresp waitresp;
00664 ServerResponseBody_Redirect redirect;
00665 ServerResponseBody_Attn attn;
00666 ServerResponseBody_Protocol protocol;
00667 ServerResponseBody_Login login;
00668 ServerResponseBody_Buffer buffer;
00669 ServerResponseBody_Bind bind;
00670 } body;
00671 };
00672
00673 void ServerResponseHeader2NetFmt(struct ServerResponseHeader *srh);
00674
00675
00676 struct ClientInitHandShake {
00677 kXR_int32 first;
00678 kXR_int32 second;
00679 kXR_int32 third;
00680 kXR_int32 fourth;
00681 kXR_int32 fifth;
00682 };
00683
00684
00685 struct ServerInitHandShake {
00686 kXR_int32 msglen;
00687 kXR_int32 protover;
00688 kXR_int32 msgval;
00689 };
00690
00691
00692
00693 typedef kXR_int32 ServerResponseType;
00694
00695 struct ALIGN_CHECK {char chkszreq[25-sizeof(ClientRequest)];
00696 char chkszrsp[ 9-sizeof(ServerResponseHeader)];
00697 };
00698
00699
00700
00701
00702
00703 #include <errno.h>
00704 #if defined(WIN32)
00705 #if !defined(ENOTBLK)
00706 # define ENOTBLK 15
00707 #endif
00708 #if !defined(ETXTBSY)
00709 #define ETXTBSY 26
00710 #endif
00711 #if !defined(ENOBUFS)
00712 #define ENOBUFS 105
00713 #endif
00714 #if !defined(ENETUNREACH)
00715 #define ENETUNREACH 114
00716 #endif
00717 #endif
00718
00719 class XProtocol
00720 {
00721 public:
00722
00723
00724
00725 static int mapError(int rc)
00726 {if (rc < 0) rc = -rc;
00727 switch(rc)
00728 {case ENOENT: return kXR_NotFound;
00729 case EPERM: return kXR_NotAuthorized;
00730 case EACCES: return kXR_NotAuthorized;
00731 case EIO: return kXR_IOError;
00732 case ENOMEM: return kXR_NoMemory;
00733 case ENOBUFS: return kXR_NoMemory;
00734 case ENOSPC: return kXR_NoSpace;
00735 case ENAMETOOLONG: return kXR_ArgTooLong;
00736 case ENETUNREACH: return kXR_noserver;
00737 case ENOTBLK: return kXR_NotFile;
00738 case EISDIR: return kXR_isDirectory;
00739 case EEXIST: return kXR_InvalidRequest;
00740 case ETXTBSY: return kXR_inProgress;
00741 default: return kXR_FSError;
00742 }
00743 }
00744 };
00745 #endif