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
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #ifdef __CINT__
00063 #define __attribute__(x)
00064 #endif
00065
00066
00067
00068
00069
00070
00071 #define kXR_PROTOCOLVERSION 0x00000400
00072 #define kXR_PROTSIGNVERSION 0x00000310
00073 #define kXR_PROTOCOLVSTRING "4.0.0"
00074
00075 #include "XProtocol/XPtypes.hh"
00076
00077
00078
00079
00080 #define kXR_DataServer 1
00081 #define kXR_LBalServer 0
00082
00083
00084
00085
00086 #define kXR_isManager 0x00000002
00087 #define kXR_isServer 0x00000001
00088 #define kXR_attrMeta 0x00000100
00089 #define kXR_attrProxy 0x00000200
00090 #define kXR_attrSuper 0x00000400
00091 #define kXR_attrVirtRdr 0x00000800
00092
00093 #define kXR_maxReqRetry 10
00094
00095
00096
00097 enum XReqErrorType {
00098 kGENERICERR = 0,
00099 kREAD,
00100 kWRITE,
00101 kREDIRCONNECT,
00102 kOK,
00103 kNOMORESTREAMS
00104
00105 };
00106
00107
00108
00109
00110
00111 enum XRequestTypes {
00112 kXR_auth = 3000,
00113 kXR_query,
00114 kXR_chmod,
00115 kXR_close,
00116 kXR_dirlist,
00117 kXR_getfile,
00118 kXR_protocol,
00119 kXR_login,
00120 kXR_mkdir,
00121 kXR_mv,
00122 kXR_open,
00123 kXR_ping,
00124 kXR_putfile,
00125 kXR_read,
00126 kXR_rm,
00127 kXR_rmdir,
00128 kXR_sync,
00129 kXR_stat,
00130 kXR_set,
00131 kXR_write,
00132 kXR_admin,
00133 kXR_prepare,
00134 kXR_statx,
00135 kXR_endsess,
00136 kXR_bind,
00137 kXR_readv,
00138 kXR_verifyw,
00139 kXR_locate,
00140 kXR_truncate,
00141 kXR_sigver,
00142 kXR_decrypt,
00143 kXR_writev,
00144 kXR_REQFENCE
00145 };
00146
00147
00148 enum XOpenRequestMode {
00149 kXR_ur = 0x100,
00150 kXR_uw = 0x080,
00151 kXR_ux = 0x040,
00152 kXR_gr = 0x020,
00153 kXR_gw = 0x010,
00154 kXR_gx = 0x008,
00155 kXR_or = 0x004,
00156 kXR_ow = 0x002,
00157 kXR_ox = 0x001
00158 };
00159
00160 enum XMkdirOptions {
00161 kXR_mknone = 0,
00162 kXR_mkdirpath = 1
00163 };
00164
00165
00166 enum XLoginAbility {
00167 kXR_nothing = 0,
00168 kXR_fullurl = 1,
00169 kXR_multipr = 3,
00170 kXR_readrdok= 4,
00171 kXR_hasipv64= 8,
00172 kXR_onlyprv4= 16,
00173 kXR_onlyprv6= 32,
00174 kXR_lclfile = 64
00175 };
00176
00177
00178 enum XLoginCapVer {
00179 kXR_lcvnone = 0,
00180 kXR_vermask = 63,
00181 kXR_asyncap = 128
00182 };
00183
00184
00185
00186 enum XLoginVersion {
00187 kXR_ver000 = 0,
00188 kXR_ver001 = 1,
00189 kXR_ver002 = 2,
00190 kXR_ver003 = 3,
00191 kXR_ver004 = 4
00192 };
00193
00194 enum XStatRequestOption {
00195 kXR_vfs = 1
00196 };
00197
00198 enum XStatRespFlags {
00199 kXR_file = 0,
00200 kXR_xset = 1,
00201 kXR_isDir = 2,
00202 kXR_other = 4,
00203 kXR_offline = 8,
00204 kXR_readable=16,
00205 kXR_writable=32,
00206 kXR_poscpend=64,
00207 kXR_bkpexist=128
00208 };
00209
00210 enum XDirlistRequestOption {
00211 kXR_online = 1,
00212 kXR_dstat = 2
00213 };
00214
00215 enum XOpenRequestOption {
00216 kXR_compress = 1,
00217 kXR_delete = 2,
00218 kXR_force = 4,
00219 kXR_new = 8,
00220 kXR_open_read= 16,
00221 kXR_open_updt= 32,
00222 kXR_async = 64,
00223 kXR_refresh = 128,
00224 kXR_mkpath = 256,
00225 kXR_prefname = 256,
00226 kXR_open_apnd= 512,
00227 kXR_retstat = 1024,
00228 kXR_4dirlist = 1024,
00229 kXR_replica = 2048,
00230 kXR_posc = 4096,
00231 kXR_nowait = 8192,
00232 kXR_seqio =16384,
00233 kXR_open_wrto=32768
00234 };
00235
00236 enum XProtocolRequestFlags {
00237 kXR_secreqs = 1
00238 };
00239
00240 enum XQueryType {
00241 kXR_QStats = 1,
00242 kXR_QPrep = 2,
00243 kXR_Qcksum = 3,
00244 kXR_Qxattr = 4,
00245 kXR_Qspace = 5,
00246 kXR_Qckscan= 6,
00247 kXR_Qconfig= 7,
00248 kXR_Qvisa = 8,
00249 kXR_Qopaque=16,
00250 kXR_Qopaquf=32,
00251 kXR_Qopaqug=64
00252 };
00253
00254 enum XVerifyType {
00255 kXR_nocrc = 0,
00256 kXR_crc32 = 1
00257 };
00258
00259 enum XLogonType {
00260 kXR_useruser = 0,
00261 kXR_useradmin = 1
00262 };
00263
00264 enum XPrepRequestOption {
00265 kXR_cancel = 1,
00266 kXR_notify = 2,
00267 kXR_noerrs = 4,
00268 kXR_stage = 8,
00269 kXR_wmode = 16,
00270 kXR_coloc = 32,
00271 kXR_fresh = 64,
00272 kXR_usetcp = 128,
00273
00274 kXR_evict = 0x0001
00275 };
00276
00277
00278
00279
00280 #define kXR_secver_0 0
00281
00282
00283 enum XSecFlags {
00284 kXR_nodata = 1
00285 };
00286
00287
00288 enum XSecCrypto {
00289 kXR_SHA256 = 0x01,
00290 kXR_HashMask = 0x0f,
00291 kXR_rsaKey = 0x80
00292 };
00293
00294
00295
00296
00297
00298 enum XResponseType {
00299 kXR_ok = 0,
00300 kXR_oksofar = 4000,
00301 kXR_attn,
00302 kXR_authmore,
00303 kXR_error,
00304 kXR_redirect,
00305 kXR_wait,
00306 kXR_waitresp,
00307 kXR_noResponsesYet = 10000
00308 };
00309
00310
00311
00312
00313
00314 enum XActionCode {
00315 kXR_asyncab = 5000,
00316 kXR_asyncdi,
00317 kXR_asyncms,
00318 kXR_asyncrd,
00319 kXR_asyncwt,
00320 kXR_asyncav,
00321 kXR_asynunav,
00322 kXR_asyncgo,
00323 kXR_asynresp
00324 };
00325
00326
00327
00328
00329
00330 enum XErrorCode {
00331 kXR_ArgInvalid = 3000,
00332 kXR_ArgMissing,
00333 kXR_ArgTooLong,
00334 kXR_FileLocked,
00335 kXR_FileNotOpen,
00336 kXR_FSError,
00337 kXR_InvalidRequest,
00338 kXR_IOError,
00339 kXR_NoMemory,
00340 kXR_NoSpace,
00341 kXR_NotAuthorized,
00342 kXR_NotFound,
00343 kXR_ServerError,
00344 kXR_Unsupported,
00345 kXR_noserver,
00346 kXR_NotFile,
00347 kXR_isDirectory,
00348 kXR_Cancelled,
00349 kXR_ChkLenErr,
00350 kXR_ChkSumErr,
00351 kXR_inProgress,
00352 kXR_overQuota,
00353 kXR_SigVerErr,
00354 kXR_DecryptErr,
00355 kXR_Overloaded,
00356 kXR_fsReadOnly,
00357 kXR_BadPayload,
00358 kXR_AttrNotFound,
00359 kXR_TLSRequired,
00360 kXR_noReplicas,
00361 kXR_ERRFENCE,
00362 kXR_noErrorYet = 10000
00363 };
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379 struct ClientAdminRequest {
00380 kXR_char streamid[2];
00381 kXR_unt16 requestid;
00382 kXR_char reserved[16];
00383 kXR_int32 dlen;
00384 };
00385 struct ClientAuthRequest {
00386 kXR_char streamid[2];
00387 kXR_unt16 requestid;
00388 kXR_char reserved[12];
00389 kXR_char credtype[4];
00390 kXR_int32 dlen;
00391 };
00392 struct ClientBindRequest {
00393 kXR_char streamid[2];
00394 kXR_unt16 requestid;
00395 kXR_char sessid[16];
00396 kXR_int32 dlen;
00397 };
00398 struct ClientChmodRequest {
00399 kXR_char streamid[2];
00400 kXR_unt16 requestid;
00401 kXR_char reserved[14];
00402 kXR_unt16 mode;
00403 kXR_int32 dlen;
00404 };
00405 struct ClientCloseRequest {
00406 kXR_char streamid[2];
00407 kXR_unt16 requestid;
00408 kXR_char fhandle[4];
00409 kXR_int64 fsize;
00410 kXR_char reserved[4];
00411 kXR_int32 dlen;
00412 };
00413 struct ClientDecryptRequest {
00414 kXR_char streamid[2];
00415 kXR_unt16 requestid;
00416 kXR_unt16 expectrid;
00417 kXR_char version;
00418 kXR_char flags;
00419 kXR_char reserved[12];
00420 kXR_int32 dlen;
00421 };
00422 struct ClientDirlistRequest {
00423 kXR_char streamid[2];
00424 kXR_unt16 requestid;
00425 kXR_char reserved[15];
00426 kXR_char options[1];
00427 kXR_int32 dlen;
00428 };
00429 struct ClientEndsessRequest {
00430 kXR_char streamid[2];
00431 kXR_unt16 requestid;
00432 kXR_char sessid[16];
00433 kXR_int32 dlen;
00434 };
00435 struct ClientGetfileRequest {
00436 kXR_char streamid[2];
00437 kXR_unt16 requestid;
00438 kXR_int32 options;
00439 kXR_char reserved[8];
00440 kXR_int32 buffsz;
00441 kXR_int32 dlen;
00442 };
00443 struct ClientLocateRequest {
00444 kXR_char streamid[2];
00445 kXR_unt16 requestid;
00446 kXR_unt16 options;
00447 kXR_char reserved[14];
00448 kXR_int32 dlen;
00449 };
00450 struct ClientLoginRequest {
00451 kXR_char streamid[2];
00452 kXR_unt16 requestid;
00453 kXR_int32 pid;
00454 kXR_char username[8];
00455 kXR_char reserved;
00456 kXR_char ability;
00457 kXR_char capver[1];
00458 kXR_char role[1];
00459 kXR_int32 dlen;
00460 };
00461 struct ClientMkdirRequest {
00462 kXR_char streamid[2];
00463 kXR_unt16 requestid;
00464 kXR_char options[1];
00465 kXR_char reserved[13];
00466 kXR_unt16 mode;
00467 kXR_int32 dlen;
00468 };
00469 struct ClientMvRequest {
00470 kXR_char streamid[2];
00471 kXR_unt16 requestid;
00472 kXR_char reserved[14];
00473 kXR_int16 arg1len;
00474 kXR_int32 dlen;
00475 };
00476 struct ClientOpenRequest {
00477 kXR_char streamid[2];
00478 kXR_unt16 requestid;
00479 kXR_unt16 mode;
00480 kXR_unt16 options;
00481 kXR_char reserved[12];
00482 kXR_int32 dlen;
00483 };
00484
00485 struct ClientPingRequest {
00486 kXR_char streamid[2];
00487 kXR_unt16 requestid;
00488 kXR_char reserved[16];
00489 kXR_int32 dlen;
00490 };
00491 struct ClientProtocolRequest {
00492 kXR_char streamid[2];
00493 kXR_unt16 requestid;
00494 kXR_int32 clientpv;
00495 kXR_char flags;
00496 kXR_char reserved[11];
00497 kXR_int32 dlen;
00498 };
00499 struct ClientPrepareRequest {
00500 kXR_char streamid[2];
00501 kXR_unt16 requestid;
00502 kXR_char options;
00503 kXR_char prty;
00504 kXR_unt16 port;
00505 kXR_unt16 optionX;
00506 kXR_char reserved[10];
00507 kXR_int32 dlen;
00508 };
00509 struct ClientPutfileRequest {
00510 kXR_char streamid[2];
00511 kXR_unt16 requestid;
00512 kXR_int32 options;
00513 kXR_char reserved[8];
00514 kXR_int32 buffsz;
00515 kXR_int32 dlen;
00516 };
00517 struct ClientQueryRequest {
00518 kXR_char streamid[2];
00519 kXR_unt16 requestid;
00520 kXR_unt16 infotype;
00521 kXR_char reserved1[2];
00522 kXR_char fhandle[4];
00523 kXR_char reserved2[8];
00524 kXR_int32 dlen;
00525 };
00526 struct ClientReadRequest {
00527 kXR_char streamid[2];
00528 kXR_unt16 requestid;
00529 kXR_char fhandle[4];
00530 kXR_int64 offset;
00531 kXR_int32 rlen;
00532 kXR_int32 dlen;
00533 };
00534 struct ClientReadVRequest {
00535 kXR_char streamid[2];
00536 kXR_unt16 requestid;
00537 kXR_char reserved[15];
00538 kXR_char pathid;
00539 kXR_int32 dlen;
00540 };
00541 struct ClientRmRequest {
00542 kXR_char streamid[2];
00543 kXR_unt16 requestid;
00544 kXR_char reserved[16];
00545 kXR_int32 dlen;
00546 };
00547 struct ClientRmdirRequest {
00548 kXR_char streamid[2];
00549 kXR_unt16 requestid;
00550 kXR_char reserved[16];
00551 kXR_int32 dlen;
00552 };
00553 struct ClientSetRequest {
00554 kXR_char streamid[2];
00555 kXR_unt16 requestid;
00556 kXR_char reserved[15];
00557 kXR_char modifier;
00558 kXR_int32 dlen;
00559 };
00560 struct ClientSigverRequest {
00561 kXR_char streamid[2];
00562 kXR_unt16 requestid;
00563 kXR_unt16 expectrid;
00564 kXR_char version;
00565 kXR_char flags;
00566 kXR_unt64 seqno;
00567 kXR_char crypto;
00568 kXR_char rsvd2[3];
00569 kXR_int32 dlen;
00570 };
00571 struct ClientStatRequest {
00572 kXR_char streamid[2];
00573 kXR_unt16 requestid;
00574 kXR_char options;
00575 kXR_char reserved[11];
00576 kXR_char fhandle[4];
00577 kXR_int32 dlen;
00578 };
00579 struct ClientSyncRequest {
00580 kXR_char streamid[2];
00581 kXR_unt16 requestid;
00582 kXR_char fhandle[4];
00583 kXR_char reserved[12];
00584 kXR_int32 dlen;
00585 };
00586 struct ClientTruncateRequest {
00587 kXR_char streamid[2];
00588 kXR_unt16 requestid;
00589 kXR_char fhandle[4];
00590 kXR_int64 offset;
00591 kXR_char reserved[4];
00592 kXR_int32 dlen;
00593 };
00594 struct ClientWriteRequest {
00595 kXR_char streamid[2];
00596 kXR_unt16 requestid;
00597 kXR_char fhandle[4];
00598 kXR_int64 offset;
00599 kXR_char pathid;
00600 kXR_char reserved[3];
00601 kXR_int32 dlen;
00602 };
00603 struct ClientWriteVRequest {
00604 kXR_char streamid[2];
00605 kXR_unt16 requestid;
00606 kXR_char options;
00607 kXR_char reserved[15];
00608 kXR_int32 dlen;
00609
00610 static const kXR_int32 doSync = 0x01;
00611 };
00612 struct ClientVerifywRequest {
00613 kXR_char streamid[2];
00614 kXR_unt16 requestid;
00615 kXR_char fhandle[4];
00616 kXR_int64 offset;
00617 kXR_char pathid;
00618 kXR_char vertype;
00619 kXR_char reserved[2];
00620 kXR_int32 dlen;
00621 };
00622
00623 struct ClientRequestHdr {
00624 kXR_char streamid[2];
00625 kXR_unt16 requestid;
00626 kXR_char body[16];
00627 kXR_int32 dlen;
00628 };
00629
00630 typedef union {
00631 struct ClientRequestHdr header;
00632 struct ClientAdminRequest admin;
00633 struct ClientAuthRequest auth;
00634 struct ClientBindRequest bind;
00635 struct ClientChmodRequest chmod;
00636 struct ClientCloseRequest close;
00637 struct ClientDecryptRequest decrypt;
00638 struct ClientDirlistRequest dirlist;
00639 struct ClientEndsessRequest endsess;
00640 struct ClientGetfileRequest getfile;
00641 struct ClientLocateRequest locate;
00642 struct ClientLoginRequest login;
00643 struct ClientMkdirRequest mkdir;
00644 struct ClientMvRequest mv;
00645 struct ClientOpenRequest open;
00646 struct ClientPingRequest ping;
00647 struct ClientPrepareRequest prepare;
00648 struct ClientProtocolRequest protocol;
00649 struct ClientPutfileRequest putfile;
00650 struct ClientQueryRequest query;
00651 struct ClientReadRequest read;
00652 struct ClientReadVRequest readv;
00653 struct ClientRmRequest rm;
00654 struct ClientRmdirRequest rmdir;
00655 struct ClientSetRequest set;
00656 struct ClientSigverRequest sigver;
00657 struct ClientStatRequest stat;
00658 struct ClientSyncRequest sync;
00659 struct ClientTruncateRequest truncate;
00660 struct ClientWriteRequest write;
00661 struct ClientWriteVRequest writev;
00662 } ClientRequest;
00663
00664 typedef union {
00665 struct ClientRequestHdr header;
00666 struct ClientDecryptRequest decrypt;
00667 struct ClientSigverRequest sigver;
00668 } SecurityRequest;
00669
00670 struct readahead_list {
00671 kXR_char fhandle[4];
00672 kXR_int32 rlen;
00673 kXR_int64 offset;
00674 };
00675
00676 struct read_args {
00677 kXR_char pathid;
00678 kXR_char reserved[7];
00679
00680 };
00681
00682
00683
00684 namespace XrdProto
00685 {
00686 struct read_list {
00687 kXR_char fhandle[4];
00688 kXR_int32 rlen;
00689 kXR_int64 offset;
00690 };
00691
00692 struct write_list {
00693 kXR_char fhandle[4];
00694 kXR_int32 wlen;
00695 kXR_int64 offset;
00696 };
00697 }
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711 struct ServerResponseHeader {
00712 kXR_char streamid[2];
00713 kXR_unt16 status;
00714 kXR_int32 dlen;
00715 };
00716
00717
00718 struct ServerResponseBody_Bind {
00719 kXR_char substreamid;
00720 };
00721
00722
00723 struct ServerResponseBody_Open {
00724 kXR_char fhandle[4];
00725 kXR_int32 cpsize;
00726 kXR_char cptype[4];
00727 };
00728
00729
00730
00731
00732 struct ServerResponseSVec_Protocol {
00733 kXR_char reqindx;
00734 kXR_char reqsreq;
00735 };
00736
00737 struct ServerResponseReqs_Protocol {
00738 kXR_char theTag;
00739 kXR_char rsvd;
00740 kXR_char secver;
00741 kXR_char secopt;
00742 kXR_char seclvl;
00743 kXR_char secvsz;
00744 ServerResponseSVec_Protocol secvec;
00745 };
00746
00747
00748
00749 #define kXR_secOData 0x01
00750 #define kXR_secOFrce 0x02
00751
00752
00753
00754 #define kXR_secNone 0
00755 #define kXR_secCompatible 1
00756 #define kXR_secStandard 2
00757 #define kXR_secIntense 3
00758 #define kXR_secPedantic 4
00759
00760
00761
00762 #define kXR_signIgnore 0
00763 #define kXR_signLikely 1
00764 #define kXR_signNeeded 2
00765
00766
00767 struct ServerResponseBody_Protocol {
00768 kXR_int32 pval;
00769 kXR_int32 flags;
00770 ServerResponseReqs_Protocol secreq;
00771 };
00772
00773
00774
00775
00776 #define kXR_ShortProtRespLen sizeof(ServerResponseBody_Protocol)-\
00777 sizeof(ServerResponseReqs_Protocol)
00778
00779 struct ServerResponseBody_Login {
00780 kXR_char sessid[16];
00781 kXR_char sec[4096];
00782 };
00783
00784 struct ServerResponseBody_Redirect {
00785 kXR_int32 port;
00786 char host[4096];
00787 };
00788
00789 struct ServerResponseBody_Error {
00790 kXR_int32 errnum;
00791 char errmsg[4096];
00792 };
00793
00794 struct ServerResponseBody_Wait {
00795 kXR_int32 seconds;
00796 char infomsg[4096];
00797 };
00798
00799 struct ServerResponseBody_Waitresp {
00800 kXR_int32 seconds;
00801 };
00802
00803 struct ServerResponseBody_Attn {
00804 kXR_int32 actnum;
00805 char parms[4096];
00806 };
00807
00808 struct ServerResponseBody_Attn_asyncrd {
00809 kXR_int32 actnum;
00810 kXR_int32 port;
00811 char host[4092];
00812 };
00813
00814 struct ServerResponseBody_Attn_asynresp {
00815 kXR_int32 actnum;
00816 char reserved[4];
00817 ServerResponseHeader resphdr;
00818 char respdata[4096];
00819 };
00820
00821 struct ServerResponseBody_Attn_asyncwt {
00822 kXR_int32 actnum;
00823 kXR_int32 wsec;
00824 };
00825
00826 struct ServerResponseBody_Attn_asyncdi {
00827 kXR_int32 actnum;
00828 kXR_int32 wsec;
00829 kXR_int32 msec;
00830 };
00831
00832 struct ServerResponseBody_Authmore {
00833 char data[4096];
00834 };
00835
00836 struct ServerResponseBody_Buffer {
00837 char data[4096];
00838 };
00839
00840 struct ServerResponse
00841 {
00842 ServerResponseHeader hdr;
00843 union
00844 {
00845 ServerResponseBody_Error error;
00846 ServerResponseBody_Authmore authmore;
00847 ServerResponseBody_Wait wait;
00848 ServerResponseBody_Waitresp waitresp;
00849 ServerResponseBody_Redirect redirect;
00850 ServerResponseBody_Attn attn;
00851 ServerResponseBody_Protocol protocol;
00852 ServerResponseBody_Login login;
00853 ServerResponseBody_Buffer buffer;
00854 ServerResponseBody_Bind bind;
00855 } body;
00856 };
00857
00858 void ServerResponseHeader2NetFmt(struct ServerResponseHeader *srh);
00859
00860
00861 struct ClientInitHandShake {
00862 kXR_int32 first;
00863 kXR_int32 second;
00864 kXR_int32 third;
00865 kXR_int32 fourth;
00866 kXR_int32 fifth;
00867 };
00868
00869
00870 struct ServerInitHandShake {
00871 kXR_int32 msglen;
00872 kXR_int32 protover;
00873 kXR_int32 msgval;
00874 };
00875
00876
00877
00878 typedef kXR_int32 ServerResponseType;
00879
00880 struct ALIGN_CHECK {char chkszreq[25-sizeof(ClientRequest)];
00881 char chkszrsp[ 9-sizeof(ServerResponseHeader)];
00882 };
00883
00884
00885
00886
00887
00888 #include <errno.h>
00889 #if defined(WIN32)
00890 #if !defined(ENOTBLK)
00891 # define ENOTBLK 15
00892 #endif
00893 #if !defined(ETXTBSY)
00894 #define ETXTBSY 26
00895 #endif
00896 #if !defined(ENOBUFS)
00897 #define ENOBUFS 105
00898 #endif
00899 #if !defined(ENETUNREACH)
00900 #define ENETUNREACH 114
00901 #endif
00902 #endif
00903
00904 #ifndef ENOATTR
00905 #define ENOATTR ENODATA
00906 #endif
00907
00908 class XProtocol
00909 {
00910 public:
00911
00912
00913
00914 static int mapError(int rc)
00915 {if (rc < 0) rc = -rc;
00916 switch(rc)
00917 {case ENOENT: return kXR_NotFound;
00918 case EINVAL: return kXR_ArgInvalid;
00919 case EPERM: return kXR_NotAuthorized;
00920 case EACCES: return kXR_NotAuthorized;
00921 case EIO: return kXR_IOError;
00922 case ENOMEM: return kXR_NoMemory;
00923 case ENOBUFS: return kXR_NoMemory;
00924 case ENOSPC: return kXR_NoSpace;
00925 case ENAMETOOLONG: return kXR_ArgTooLong;
00926 case ENETUNREACH: return kXR_noserver;
00927 case ENOTBLK: return kXR_NotFile;
00928 case EISDIR: return kXR_isDirectory;
00929 case EEXIST: return kXR_InvalidRequest;
00930 case ETXTBSY: return kXR_inProgress;
00931 case ENODEV: return kXR_FSError;
00932 case EFAULT: return kXR_ServerError;
00933 case EDOM: return kXR_ChkSumErr;
00934 case EDQUOT: return kXR_overQuota;
00935 case EILSEQ: return kXR_SigVerErr;
00936 case ERANGE: return kXR_DecryptErr;
00937 case EUSERS: return kXR_Overloaded;
00938 case EROFS: return kXR_fsReadOnly;
00939 case ENOATTR: return kXR_AttrNotFound;
00940 case EPROTOTYPE: return kXR_TLSRequired;
00941 case EADDRNOTAVAIL: return kXR_noReplicas;
00942 default: return kXR_FSError;
00943 }
00944 }
00945
00946 static int toErrno( int xerr )
00947 {
00948 switch(xerr)
00949 {case kXR_ArgInvalid: return EINVAL;
00950 case kXR_ArgMissing: return EINVAL;
00951 case kXR_ArgTooLong: return ENAMETOOLONG;
00952 case kXR_FileLocked: return EDEADLK;
00953 case kXR_FileNotOpen: return EBADF;
00954 case kXR_FSError: return EIO;
00955 case kXR_InvalidRequest:return EEXIST;
00956 case kXR_IOError: return EIO;
00957 case kXR_NoMemory: return ENOMEM;
00958 case kXR_NoSpace: return ENOSPC;
00959 case kXR_NotAuthorized: return EACCES;
00960 case kXR_NotFound: return ENOENT;
00961 case kXR_ServerError: return ENOMSG;
00962 case kXR_Unsupported: return ENOSYS;
00963 case kXR_noserver: return EHOSTUNREACH;
00964 case kXR_NotFile: return ENOTBLK;
00965 case kXR_isDirectory: return EISDIR;
00966 case kXR_Cancelled: return ECANCELED;
00967 case kXR_ChkLenErr: return EDOM;
00968 case kXR_ChkSumErr: return EDOM;
00969 case kXR_inProgress: return EINPROGRESS;
00970 case kXR_overQuota: return EDQUOT;
00971 case kXR_SigVerErr: return EILSEQ;
00972 case kXR_DecryptErr: return ERANGE;
00973 case kXR_Overloaded: return EUSERS;
00974 case kXR_fsReadOnly: return EROFS;
00975 case kXR_BadPayload: return EINVAL;
00976 case kXR_AttrNotFound: return ENOATTR;
00977 case kXR_TLSRequired: return EPROTOTYPE;
00978 case kXR_noReplicas: return EADDRNOTAVAIL;
00979 default: return ENOMSG;
00980 }
00981 }
00982
00983 static const char *errName(kXR_int32 errCode);
00984
00985 static const char *reqName(kXR_unt16 reqCode);
00986 };
00987 #endif