Warning, file /include/xrootd/XProtocol/XProtocol.hh was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 #ifndef __XPROTOCOL_H
0002 #define __XPROTOCOL_H
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 #ifdef __CINT__
0056 #define __attribute__(x)
0057 #endif
0058
0059 #include "XProtocol/XPtypes.hh"
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 #define kXR_PROTOCOLVERSION 0x00000511
0071 #define kXR_PROTXATTVERSION 0x00000500
0072 #define kXR_PROTTLSVERSION 0x00000500
0073 #define kXR_PROTPGRWVERSION 0x00000511
0074 #define kXR_PROTSIGNVERSION 0x00000310
0075 #define kXR_PROTOCOLVSTRING "5.1.0"
0076
0077
0078
0079
0080
0081
0082
0083 struct ClientInitHandShake {
0084 kXR_int32 first;
0085 kXR_int32 second;
0086 kXR_int32 third;
0087 kXR_int32 fourth;
0088 kXR_int32 fifth;
0089 };
0090
0091
0092
0093 struct ServerInitHandShake {
0094 kXR_int32 msglen;
0095 kXR_int32 protover;
0096 kXR_int32 msgval;
0097 };
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110 enum XRequestTypes {
0111 kXR_1stRequest= 3000,
0112 kXR_auth = 3000,
0113 kXR_query,
0114 kXR_chmod,
0115 kXR_close,
0116 kXR_dirlist,
0117 kXR_gpfile,
0118 kXR_protocol,
0119 kXR_login,
0120 kXR_mkdir,
0121 kXR_mv,
0122 kXR_open,
0123 kXR_ping,
0124 kXR_chkpoint,
0125 kXR_read,
0126 kXR_rm,
0127 kXR_rmdir,
0128 kXR_sync,
0129 kXR_stat,
0130 kXR_set,
0131 kXR_write,
0132 kXR_fattr,
0133 kXR_prepare,
0134 kXR_statx,
0135 kXR_endsess,
0136 kXR_bind,
0137 kXR_readv,
0138 kXR_pgwrite,
0139 kXR_locate,
0140 kXR_truncate,
0141 kXR_sigver,
0142 kXR_pgread,
0143 kXR_writev,
0144 kXR_REQFENCE
0145 };
0146
0147
0148
0149 enum XVirtRequestTypes {
0150 kXR_virtReadv = 2000
0151 };
0152
0153
0154
0155 struct ClientRequestHdr {
0156 kXR_char streamid[2];
0157 kXR_unt16 requestid;
0158 kXR_char body[16];
0159 kXR_int32 dlen;
0160 };
0161
0162
0163
0164
0165
0166 struct ClientAuthRequest {
0167 kXR_char streamid[2];
0168 kXR_unt16 requestid;
0169 kXR_char reserved[12];
0170 kXR_char credtype[4];
0171 kXR_int32 dlen;
0172 };
0173
0174
0175
0176
0177
0178 struct ClientBindRequest {
0179 kXR_char streamid[2];
0180 kXR_unt16 requestid;
0181 kXR_char sessid[16];
0182 kXR_int32 dlen;
0183 };
0184
0185
0186
0187
0188
0189 struct ClientChmodRequest {
0190 kXR_char streamid[2];
0191 kXR_unt16 requestid;
0192 kXR_char reserved[14];
0193 kXR_unt16 mode;
0194 kXR_int32 dlen;
0195 };
0196
0197
0198
0199
0200
0201 struct ClientChkPointRequest {
0202 kXR_char streamid[2];
0203 kXR_unt16 requestid;
0204 kXR_char fhandle[4];
0205 kXR_char reserved[11];
0206 kXR_char opcode;
0207 kXR_int32 dlen;
0208 };
0209
0210
0211
0212 static const int kXR_ckpBegin = 0;
0213 static const int kXR_ckpCommit = 1;
0214 static const int kXR_ckpQuery = 2;
0215 static const int kXR_ckpRollback= 3;
0216 static const int kXR_ckpXeq = 4;
0217
0218
0219
0220 static const int kXR_ckpMinMax = 104857604;
0221
0222
0223
0224
0225
0226 struct ClientCloseRequest {
0227 kXR_char streamid[2];
0228 kXR_unt16 requestid;
0229 kXR_char fhandle[4];
0230 kXR_char reserved[12];
0231 kXR_int32 dlen;
0232 };
0233
0234
0235
0236
0237
0238 enum XDirlistRequestOption {
0239 kXR_online = 1,
0240 kXR_dstat = 2,
0241 kXR_dcksm = 4
0242 };
0243
0244 struct ClientDirlistRequest {
0245 kXR_char streamid[2];
0246 kXR_unt16 requestid;
0247 kXR_char reserved[15];
0248 kXR_char options[1];
0249 kXR_int32 dlen;
0250 };
0251
0252
0253
0254
0255
0256 struct ClientEndsessRequest {
0257 kXR_char streamid[2];
0258 kXR_unt16 requestid;
0259 kXR_char sessid[16];
0260 kXR_int32 dlen;
0261 };
0262
0263
0264
0265
0266
0267
0268
0269 enum xfaSubCode {
0270 kXR_fattrDel = 0,
0271 kXR_fattrGet = 1,
0272 kXR_fattrList = 2,
0273 kXR_fattrSet = 3,
0274 kXR_fatrrMaxSC = 3
0275 };
0276
0277
0278
0279 enum xfaLimits {
0280 kXR_faMaxVars = 16,
0281 kXR_faMaxNlen = 248,
0282 kXR_faMaxVlen = 65536
0283 };
0284
0285 struct ClientFattrRequest {
0286 kXR_char streamid[2];
0287 kXR_unt16 requestid;
0288 kXR_char fhandle[4];
0289 kXR_char subcode;
0290 kXR_char numattr;
0291 kXR_char options;
0292 kXR_char reserved[9];
0293 kXR_int32 dlen;
0294
0295
0296
0297 static const int isNew = 0x01;
0298 static const int aData = 0x10;
0299
0300
0301
0302 static char* NVecInsert( const char *name, char *buffer );
0303
0304
0305
0306 static char* VVecInsert( const char *value, char *buffer );
0307
0308
0309
0310 static char* NVecRead( char* buffer, kXR_unt16 &rc );
0311
0312
0313
0314 static char* NVecRead( char* buffer, char *&name );
0315
0316
0317
0318 static char* VVecRead( char* buffer, kXR_int32 &len );
0319
0320
0321
0322 static char* VVecRead( char* buffer, kXR_int32 len, char *&value );
0323
0324 };
0325
0326
0327
0328
0329
0330 struct ClientGPfileRequest {
0331 kXR_char streamid[2];
0332 kXR_unt16 requestid;
0333 kXR_int32 options;
0334 kXR_char reserved[8];
0335 kXR_int32 buffsz;
0336 kXR_int32 dlen;
0337 };
0338
0339
0340
0341
0342
0343 struct ClientLocateRequest {
0344 kXR_char streamid[2];
0345 kXR_unt16 requestid;
0346 kXR_unt16 options;
0347 kXR_char reserved[14];
0348 kXR_int32 dlen;
0349 };
0350
0351
0352
0353
0354
0355
0356 enum XLoginAbility {
0357 kXR_nothing = 0,
0358 kXR_fullurl = 1,
0359 kXR_multipr = 3,
0360 kXR_readrdok = 4,
0361 kXR_hasipv64 = 8,
0362 kXR_onlyprv4 = 16,
0363 kXR_onlyprv6 = 32,
0364 kXR_lclfile = 64,
0365 kXR_redirflags = 128
0366 };
0367
0368
0369 enum XLoginAbility2 {
0370 kXR_empty = 0,
0371 kXR_ecredir = 1
0372 };
0373
0374
0375 enum XLoginCapVer {
0376 kXR_lcvnone = 0,
0377 kXR_vermask = 63,
0378 kXR_asyncap = 128
0379 };
0380
0381
0382
0383 enum XLoginVersion {
0384 kXR_ver000 = 0,
0385 kXR_ver001 = 1,
0386 kXR_ver002 = 2,
0387 kXR_ver003 = 3,
0388 kXR_ver004 = 4,
0389 kXR_ver005 = 5
0390 };
0391
0392 struct ClientLoginRequest {
0393 kXR_char streamid[2];
0394 kXR_unt16 requestid;
0395 kXR_int32 pid;
0396 kXR_char username[8];
0397 kXR_char ability2;
0398 kXR_char ability;
0399 kXR_char capver[1];
0400 kXR_char reserved2;
0401 kXR_int32 dlen;
0402 };
0403
0404
0405
0406
0407
0408 enum XMkdirOptions {
0409 kXR_mknone = 0,
0410 kXR_mkdirpath = 1
0411 };
0412
0413 struct ClientMkdirRequest {
0414 kXR_char streamid[2];
0415 kXR_unt16 requestid;
0416 kXR_char options[1];
0417 kXR_char reserved[13];
0418 kXR_unt16 mode;
0419 kXR_int32 dlen;
0420 };
0421
0422
0423
0424
0425
0426 struct ClientMvRequest {
0427 kXR_char streamid[2];
0428 kXR_unt16 requestid;
0429 kXR_char reserved[14];
0430 kXR_int16 arg1len;
0431 kXR_int32 dlen;
0432 };
0433
0434
0435
0436
0437
0438
0439 enum XOpenRequestMode {
0440 kXR_ur = 0x100,
0441 kXR_uw = 0x080,
0442 kXR_ux = 0x040,
0443 kXR_gr = 0x020,
0444 kXR_gw = 0x010,
0445 kXR_gx = 0x008,
0446 kXR_or = 0x004,
0447 kXR_ow = 0x002,
0448 kXR_ox = 0x001
0449 };
0450
0451 enum XOpenRequestOption {
0452 kXR_compress = 0x0001,
0453 kXR_delete = 0x0002,
0454 kXR_force = 0x0004,
0455 kXR_new = 0x0008,
0456 kXR_open_read= 0x0010,
0457 kXR_open_updt= 0x0020,
0458 kXR_async = 0x0040,
0459 kXR_refresh = 0x0080,
0460 kXR_mkpath = 0x0100,
0461 kXR_prefname = 0x0100,
0462 kXR_open_apnd= 0x0200,
0463 kXR_retstat = 0x0400,
0464 kXR_4dirlist = 0x0400,
0465 kXR_replica = 0x0800,
0466 kXR_posc = 0x1000,
0467 kXR_nowait = 0x2000,
0468 kXR_seqio = 0x4000,
0469 kXR_open_wrto= 0x8000
0470 };
0471
0472 enum XOpenRequestOption2 {
0473 kXR_dup = 0x0001,
0474 kXR_samefs = 0x0002
0475 };
0476
0477 struct ClientOpenRequest {
0478 kXR_char streamid[2];
0479 kXR_unt16 requestid;
0480 kXR_unt16 mode;
0481 kXR_unt16 options;
0482 kXR_char reserved[12];
0483 kXR_int32 dlen;
0484 };
0485
0486
0487
0488
0489
0490
0491
0492 namespace XrdProto
0493 {
0494 static const int kXR_pgPageSZ = 4096;
0495 static const int kXR_pgPageBL = 12;
0496 static const int kXR_pgUnitSZ = kXR_pgPageSZ + sizeof(kXR_unt32);
0497 static const int kXR_pgMaxEpr = 128;
0498 static const int kXR_pgMaxEos = 256;
0499
0500
0501
0502 static const kXR_char kXR_AnyPath = 0xff;
0503 static const int kXR_pgRetry = 0x01;
0504 }
0505
0506 struct ClientPgReadRequest {
0507 kXR_char streamid[2];
0508 kXR_unt16 requestid;
0509 kXR_char fhandle[4];
0510 kXR_int64 offset;
0511 kXR_int32 rlen;
0512 kXR_int32 dlen;
0513 };
0514
0515 struct ClientPgReadReqArgs {
0516 kXR_char pathid;
0517 kXR_char reqflags;
0518 };
0519
0520 namespace
0521 {
0522 }
0523
0524
0525
0526
0527
0528 struct ClientPgWriteRequest {
0529 kXR_char streamid[2];
0530 kXR_unt16 requestid;
0531 kXR_char fhandle[4];
0532 kXR_int64 offset;
0533 kXR_char pathid;
0534 kXR_char reqflags;
0535 kXR_char reserved[2];
0536 kXR_int32 dlen;
0537
0538 };
0539
0540
0541
0542
0543
0544 struct ClientPingRequest {
0545 kXR_char streamid[2];
0546 kXR_unt16 requestid;
0547 kXR_char reserved[16];
0548 kXR_int32 dlen;
0549 };
0550
0551
0552
0553
0554
0555 struct ClientProtocolRequest {
0556 kXR_char streamid[2];
0557 kXR_unt16 requestid;
0558 kXR_int32 clientpv;
0559 kXR_char flags;
0560 kXR_char expect;
0561 kXR_char reserved[10];
0562 kXR_int32 dlen;
0563
0564 enum RequestFlags {
0565 kXR_secreqs = 0x01,
0566 kXR_ableTLS = 0x02,
0567 kXR_wantTLS = 0x04,
0568 kXR_bifreqs = 0x08
0569 };
0570
0571 enum ExpectFlags {
0572 kXR_ExpMask = 0x0f,
0573 kXR_ExpNone = 0x00,
0574 kXR_ExpBind = 0x01,
0575 kXR_ExpGPF = 0x02,
0576 kXR_ExpLogin = 0x03,
0577 kXR_ExpTPC = 0x04,
0578 kXR_ExpGPFA = 0x08
0579 };
0580 };
0581
0582
0583
0584
0585
0586 enum XPrepRequestOption {
0587 kXR_cancel = 1,
0588 kXR_notify = 2,
0589 kXR_noerrs = 4,
0590 kXR_stage = 8,
0591 kXR_wmode = 16,
0592 kXR_coloc = 32,
0593 kXR_fresh = 64,
0594 kXR_usetcp = 128,
0595
0596 kXR_evict = 0x0001
0597 };
0598
0599 struct ClientPrepareRequest {
0600 kXR_char streamid[2];
0601 kXR_unt16 requestid;
0602 kXR_char options;
0603 kXR_char prty;
0604 kXR_unt16 port;
0605 kXR_unt16 optionX;
0606 kXR_char reserved[10];
0607 kXR_int32 dlen;
0608 };
0609
0610
0611
0612
0613
0614 enum XQueryType {
0615 kXR_QStats = 1,
0616 kXR_QPrep = 2,
0617 kXR_Qcksum = 3,
0618 kXR_Qxattr = 4,
0619 kXR_Qspace = 5,
0620 kXR_Qckscan= 6,
0621 kXR_Qconfig= 7,
0622 kXR_Qvisa = 8,
0623 kXR_Qopaque=16,
0624 kXR_Qopaquf=32,
0625 kXR_Qopaqug=64
0626 };
0627
0628 struct ClientQueryRequest {
0629 kXR_char streamid[2];
0630 kXR_unt16 requestid;
0631 kXR_unt16 infotype;
0632 kXR_char reserved1[2];
0633 kXR_char fhandle[4];
0634 kXR_char reserved2[8];
0635 kXR_int32 dlen;
0636 };
0637
0638
0639
0640
0641
0642 struct ClientReadRequest {
0643 kXR_char streamid[2];
0644 kXR_unt16 requestid;
0645 kXR_char fhandle[4];
0646 kXR_int64 offset;
0647 kXR_int32 rlen;
0648 kXR_int32 dlen;
0649
0650 };
0651
0652 struct read_args {
0653 kXR_char pathid;
0654 kXR_char reserved[7];
0655
0656 };
0657
0658 struct readahead_list {
0659 kXR_char fhandle[4];
0660 kXR_int32 rlen;
0661 kXR_int64 offset;
0662 };
0663
0664
0665
0666
0667
0668 struct ClientReadVRequest {
0669 kXR_char streamid[2];
0670 kXR_unt16 requestid;
0671 kXR_char reserved[15];
0672 kXR_char pathid;
0673 kXR_int32 dlen;
0674
0675 };
0676
0677 namespace XrdProto
0678 {
0679 struct read_list {
0680 kXR_char fhandle[4];
0681 kXR_int32 rlen;
0682 kXR_int64 offset;
0683 };
0684 static const int rlItemLen = sizeof(read_list);
0685 static const int maxRvecln = 16384;
0686 static const int maxRvecsz = maxRvecln/rlItemLen;
0687 static const int minRVbsz = 2097152;
0688 static const int maxRVdsz = minRVbsz-rlItemLen;
0689 }
0690
0691
0692
0693
0694
0695 struct ClientRmRequest {
0696 kXR_char streamid[2];
0697 kXR_unt16 requestid;
0698 kXR_char reserved[16];
0699 kXR_int32 dlen;
0700 };
0701
0702
0703
0704
0705
0706 struct ClientRmdirRequest {
0707 kXR_char streamid[2];
0708 kXR_unt16 requestid;
0709 kXR_char reserved[16];
0710 kXR_int32 dlen;
0711 };
0712
0713
0714
0715
0716
0717 struct ClientSetRequest {
0718 kXR_char streamid[2];
0719 kXR_unt16 requestid;
0720 kXR_char reserved[15];
0721 kXR_char modifier;
0722 kXR_int32 dlen;
0723 };
0724
0725
0726
0727
0728
0729
0730 enum XSecCrypto {
0731 kXR_SHA256 = 0x01,
0732 kXR_HashMask = 0x0f,
0733 kXR_rsaKey = 0x80
0734 };
0735
0736
0737 enum XSecFlags {
0738 kXR_nodata = 1
0739 };
0740
0741
0742 enum XSecVersion {
0743 kXR_Ver_00 = 0
0744 };
0745
0746 struct ClientSigverRequest {
0747 kXR_char streamid[2];
0748 kXR_unt16 requestid;
0749 kXR_unt16 expectrid;
0750 kXR_char version;
0751 kXR_char flags;
0752 kXR_unt64 seqno;
0753 kXR_char crypto;
0754 kXR_char rsvd2[3];
0755 kXR_int32 dlen;
0756 };
0757
0758
0759
0760
0761
0762 enum XStatRequestOption {
0763 kXR_vfs = 1
0764 };
0765
0766 struct ClientStatRequest {
0767 kXR_char streamid[2];
0768 kXR_unt16 requestid;
0769 kXR_char options;
0770 kXR_char reserved[11];
0771 kXR_char fhandle[4];
0772 kXR_int32 dlen;
0773 };
0774
0775
0776
0777
0778
0779 struct ClientSyncRequest {
0780 kXR_char streamid[2];
0781 kXR_unt16 requestid;
0782 kXR_char fhandle[4];
0783 kXR_char reserved[12];
0784 kXR_int32 dlen;
0785 };
0786
0787
0788
0789
0790
0791 struct ClientTruncateRequest {
0792 kXR_char streamid[2];
0793 kXR_unt16 requestid;
0794 kXR_char fhandle[4];
0795 kXR_int64 offset;
0796 kXR_char reserved[4];
0797 kXR_int32 dlen;
0798 };
0799
0800
0801
0802
0803
0804 struct ClientWriteRequest {
0805 kXR_char streamid[2];
0806 kXR_unt16 requestid;
0807 kXR_char fhandle[4];
0808 kXR_int64 offset;
0809 kXR_char pathid;
0810 kXR_char reserved[3];
0811 kXR_int32 dlen;
0812 };
0813
0814
0815
0816
0817
0818 struct ClientWriteVRequest {
0819 kXR_char streamid[2];
0820 kXR_unt16 requestid;
0821 kXR_char options;
0822 kXR_char reserved[15];
0823 kXR_int32 dlen;
0824
0825
0826 static const kXR_int32 doSync = 0x01;
0827 };
0828
0829 namespace XrdProto
0830 {
0831 struct write_list {
0832 kXR_char fhandle[4];
0833 kXR_int32 wlen;
0834 kXR_int64 offset;
0835 };
0836 static const int wlItemLen = sizeof(write_list);
0837 static const int maxWvecln = 16384;
0838 static const int maxWvecsz = maxWvecln/wlItemLen;
0839 }
0840
0841
0842
0843
0844
0845 typedef union {
0846 struct ClientRequestHdr header;
0847 struct ClientAuthRequest auth;
0848 struct ClientBindRequest bind;
0849 struct ClientChkPointRequest chkpoint;
0850 struct ClientChmodRequest chmod;
0851 struct ClientCloseRequest close;
0852 struct ClientDirlistRequest dirlist;
0853 struct ClientEndsessRequest endsess;
0854 struct ClientFattrRequest fattr;
0855 struct ClientGPfileRequest gpfile;
0856 struct ClientLocateRequest locate;
0857 struct ClientLoginRequest login;
0858 struct ClientMkdirRequest mkdir;
0859 struct ClientMvRequest mv;
0860 struct ClientOpenRequest open;
0861 struct ClientPgReadRequest pgread;
0862 struct ClientPgWriteRequest pgwrite;
0863 struct ClientPingRequest ping;
0864 struct ClientPrepareRequest prepare;
0865 struct ClientProtocolRequest protocol;
0866 struct ClientQueryRequest query;
0867 struct ClientReadRequest read;
0868 struct ClientReadVRequest readv;
0869 struct ClientRmRequest rm;
0870 struct ClientRmdirRequest rmdir;
0871 struct ClientSetRequest set;
0872 struct ClientSigverRequest sigver;
0873 struct ClientStatRequest stat;
0874 struct ClientSyncRequest sync;
0875 struct ClientTruncateRequest truncate;
0876 struct ClientWriteRequest write;
0877 struct ClientWriteVRequest writev;
0878 } ClientRequest;
0879
0880 typedef union {
0881 struct ClientRequestHdr header;
0882 struct ClientSigverRequest sigver;
0883 } SecurityRequest;
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898 enum XResponseType {
0899 kXR_ok = 0,
0900 kXR_oksofar = 4000,
0901 kXR_attn,
0902 kXR_authmore,
0903 kXR_error,
0904 kXR_redirect,
0905 kXR_wait,
0906 kXR_waitresp,
0907 kXR_status,
0908 kXR_noResponsesYet = 10000
0909 };
0910
0911
0912
0913 struct ServerResponseHeader {
0914 kXR_char streamid[2];
0915 kXR_unt16 status;
0916 kXR_int32 dlen;
0917 };
0918
0919
0920
0921 struct ServerResponseBody_Buffer {
0922 char data[4096];
0923 };
0924
0925
0926
0927
0928
0929 enum XActionCode {
0930 kXR_asyncab = 5000,
0931 kXR_asyncdi,
0932 kXR_asyncms = 5002,
0933 kXR_asyncrd,
0934 kXR_asyncwt,
0935 kXR_asyncav,
0936 kXR_asynunav,
0937 kXR_asyncgo,
0938 kXR_asynresp= 5008
0939 };
0940
0941 struct ServerResponseBody_Attn {
0942 kXR_int32 actnum;
0943 char parms[4096];
0944 };
0945
0946 struct ServerResponseBody_Attn_asyncms {
0947 kXR_int32 actnum;
0948 char reserved[4];
0949 ServerResponseHeader resphdr;
0950 char respdata[4096];
0951 };
0952
0953 struct ServerResponseBody_Attn_asynresp {
0954 kXR_int32 actnum;
0955 char reserved[4];
0956 ServerResponseHeader resphdr;
0957 char respdata[4096];
0958 };
0959
0960
0961
0962
0963
0964 struct ServerResponseBody_Authmore {
0965 char data[4096];
0966 };
0967
0968
0969
0970
0971
0972 struct ServerResponseBody_Bind {
0973 kXR_char substreamid;
0974 };
0975
0976
0977
0978
0979
0980 struct ServerResponseBody_ChkPoint {
0981 kXR_unt32 maxCkpSize;
0982 kXR_unt32 useCkpSize;
0983 };
0984
0985
0986
0987
0988
0989 enum XErrorCode {
0990 kXR_ArgInvalid = 3000,
0991 kXR_ArgMissing,
0992 kXR_ArgTooLong,
0993 kXR_FileLocked,
0994 kXR_FileNotOpen,
0995 kXR_FSError,
0996 kXR_InvalidRequest,
0997 kXR_IOError,
0998 kXR_NoMemory,
0999 kXR_NoSpace,
1000 kXR_NotAuthorized,
1001 kXR_NotFound,
1002 kXR_ServerError,
1003 kXR_Unsupported,
1004 kXR_noserver,
1005 kXR_NotFile,
1006 kXR_isDirectory,
1007 kXR_Cancelled,
1008 kXR_ItExists,
1009 kXR_ChkSumErr,
1010 kXR_inProgress,
1011 kXR_overQuota,
1012 kXR_SigVerErr,
1013 kXR_DecryptErr,
1014 kXR_Overloaded,
1015 kXR_fsReadOnly,
1016 kXR_BadPayload,
1017 kXR_AttrNotFound,
1018 kXR_TLSRequired,
1019 kXR_noReplicas,
1020 kXR_AuthFailed,
1021 kXR_Impossible,
1022 kXR_Conflict,
1023 kXR_TooManyErrs,
1024 kXR_ReqTimedOut,
1025 kXR_TimerExpired,
1026 kXR_ERRFENCE,
1027 kXR_noErrorYet = 10000
1028 };
1029
1030 struct ServerResponseBody_Error {
1031 kXR_int32 errnum;
1032 char errmsg[4096];
1033 };
1034
1035
1036
1037
1038
1039 struct ServerResponseBody_Login {
1040 kXR_char sessid[16];
1041 kXR_char sec[4096];
1042 };
1043
1044
1045
1046
1047
1048 struct ServerResponseBody_Open {
1049 kXR_char fhandle[4];
1050 kXR_int32 cpsize;
1051 kXR_char cptype[4];
1052 };
1053
1054
1055
1056
1057
1058 struct ServerResponseBody_pgRead {
1059 kXR_int64 offset;
1060
1061 };
1062
1063
1064
1065
1066
1067 struct ServerResponseBody_pgWrite {
1068 kXR_int64 offset;
1069 };
1070
1071
1072
1073
1074
1075 struct ServerResponseBody_pgWrCSE {
1076 kXR_unt32 cseCRC;
1077 kXR_int16 dlFirst;
1078 kXR_int16 dlLast;
1079
1080 };
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091 struct ServerResponseBifs_Protocol {
1092 kXR_char theTag;
1093 kXR_char rsvd;
1094 kXR_unt16 bifILen;
1095
1096 };
1097
1098
1099
1100
1101
1102 struct ServerResponseSVec_Protocol {
1103 kXR_char reqindx;
1104 kXR_char reqsreq;
1105 };
1106
1107 struct ServerResponseReqs_Protocol {
1108 kXR_char theTag;
1109 kXR_char rsvd;
1110 kXR_char secver;
1111 kXR_char secopt;
1112 kXR_char seclvl;
1113 kXR_char secvsz;
1114 ServerResponseSVec_Protocol secvec;
1115 };
1116
1117
1118 namespace XrdProto
1119 {
1120 typedef struct ServerResponseBifs_Protocol bifReqs;
1121 typedef struct ServerResponseReqs_Protocol secReqs;
1122 }
1123
1124
1125
1126 #define kXR_secOData 0x01
1127 #define kXR_secOFrce 0x02
1128
1129
1130
1131 #define kXR_secNone 0
1132 #define kXR_secCompatible 1
1133 #define kXR_secStandard 2
1134 #define kXR_secIntense 3
1135 #define kXR_secPedantic 4
1136
1137
1138
1139 #define kXR_signIgnore 0
1140 #define kXR_signLikely 1
1141 #define kXR_signNeeded 2
1142
1143
1144
1145
1146 #define kXR_secver_0 0
1147
1148
1149
1150 #define kXR_DataServer 1
1151 #define kXR_LBalServer 0
1152
1153
1154
1155
1156 #define kXR_isManager 0x00000002
1157 #define kXR_isServer 0x00000001
1158 #define kXR_attrCache 0x00000080
1159 #define kXR_attrMeta 0x00000100
1160 #define kXR_attrProxy 0x00000200
1161 #define kXR_attrSuper 0x00000400
1162 #define kXR_attrVirtRdr 0x00000800
1163
1164
1165
1166 #define kXR_recoverWrts 0x00001000
1167 #define kXR_collapseRedir 0x00002000
1168 #define kXR_ecRedir 0x00004000
1169
1170
1171
1172 #define kXR_anongpf 0x00800000
1173 #define kXR_supgpf 0x00400000
1174 #define kXR_suppgrw 0x00200000
1175 #define kXR_supposc 0x00100000
1176
1177
1178
1179 #define kXR_haveTLS 0x80000000
1180 #define kXR_gotoTLS 0x40000000
1181 #define kXR_tlsAny 0x1f000000
1182 #define kXR_tlsData 0x01000000
1183 #define kXR_tlsGPF 0x02000000
1184 #define kXR_tlsLogin 0x04000000
1185 #define kXR_tlsSess 0x08000000
1186 #define kXR_tlsTPC 0x10000000
1187 #define kXR_tlsGPFA 0x20000000
1188
1189
1190
1191 struct ServerResponseBody_Protocol {
1192 kXR_int32 pval;
1193 kXR_int32 flags;
1194 ServerResponseReqs_Protocol secreq;
1195 };
1196
1197
1198
1199
1200 #define kXR_ShortProtRespLen sizeof(ServerResponseBody_Protocol)-\
1201 sizeof(ServerResponseReqs_Protocol)
1202
1203
1204
1205
1206
1207 struct ServerResponseBody_Redirect {
1208 kXR_int32 port;
1209 char host[4096];
1210 };
1211
1212
1213
1214
1215
1216
1217
1218 enum XStatRespFlags {
1219 kXR_file = 0,
1220 kXR_xset = 1,
1221 kXR_isDir = 2,
1222 kXR_other = 4,
1223 kXR_offline = 8,
1224 kXR_readable=16,
1225 kXR_writable=32,
1226 kXR_poscpend=64,
1227 kXR_bkpexist=128
1228 };
1229
1230
1231
1232
1233
1234 struct ServerResponseBody_Status {
1235 kXR_unt32 crc32c;
1236 kXR_char streamID[2];
1237 kXR_char requestid;
1238 kXR_char resptype;
1239 kXR_char reserved[4];
1240 kXR_int32 dlen;
1241
1242
1243 };
1244
1245 namespace XrdProto
1246 {
1247 enum RespType {
1248
1249 kXR_FinalResult = 0x00,
1250 kXR_PartialResult = 0x01,
1251 kXR_ProgressInfo = 0x02
1252 };
1253
1254
1255
1256 static const int kXR_statusBodyLen = sizeof(ServerResponseBody_Status);
1257 }
1258
1259 struct ServerResponseStatus {
1260 struct ServerResponseHeader hdr;
1261 struct ServerResponseBody_Status bdy;
1262 };
1263
1264
1265
1266
1267
1268 struct ServerResponseBody_Wait {
1269 kXR_int32 seconds;
1270 char infomsg[4096];
1271 };
1272
1273
1274
1275
1276
1277 struct ServerResponseBody_Waitresp {
1278 kXR_int32 seconds;
1279 };
1280
1281
1282
1283
1284
1285 struct ServerResponse
1286 {
1287 ServerResponseHeader hdr;
1288 union
1289 {
1290 ServerResponseBody_Attn attn;
1291 ServerResponseBody_Authmore authmore;
1292 ServerResponseBody_Bind bind;
1293 ServerResponseBody_Buffer buffer;
1294 ServerResponseBody_Error error;
1295 ServerResponseBody_Login login;
1296 ServerResponseBody_Protocol protocol;
1297 ServerResponseBody_Redirect redirect;
1298 ServerResponseBody_Status status;
1299 ServerResponseBody_Wait wait;
1300 ServerResponseBody_Waitresp waitresp;
1301 } body;
1302 };
1303
1304
1305
1306
1307 struct ServerResponseV2
1308 {
1309 ServerResponseStatus status;
1310 union
1311 {
1312 ServerResponseBody_pgRead pgread;
1313 ServerResponseBody_pgWrite pgwrite;
1314 } info;
1315 };
1316
1317 struct ALIGN_CHECK {char chkszreq[25-sizeof(ClientRequest)];
1318 char chkszrsp[ 9-sizeof(ServerResponseHeader)];
1319 };
1320
1321
1322
1323
1324
1325 #include <cerrno>
1326 #if defined(WIN32)
1327 #if !defined(ENOTBLK)
1328 # define ENOTBLK 15
1329 #endif
1330 #if !defined(ETXTBSY)
1331 #define ETXTBSY 26
1332 #endif
1333 #if !defined(ENOBUFS)
1334 #define ENOBUFS 105
1335 #endif
1336 #if !defined(ENETUNREACH)
1337 #define ENETUNREACH 114
1338 #endif
1339 #endif
1340
1341 #ifndef ENOATTR
1342 #define ENOATTR ENODATA
1343 #endif
1344
1345 #ifndef EBADRQC
1346 #define EBADRQC EBADRPC
1347 #endif
1348
1349 #ifndef EAUTH
1350 #define EAUTH EBADE
1351 #endif
1352
1353 struct stat;
1354
1355 class XProtocol
1356 {
1357 public:
1358
1359
1360
1361 static int mapError(int rc)
1362 {if (rc < 0) rc = -rc;
1363 switch(rc)
1364 {case ENOENT: return kXR_NotFound;
1365 case EINVAL: return kXR_ArgInvalid;
1366 case EPERM: return kXR_NotAuthorized;
1367 case EACCES: return kXR_NotAuthorized;
1368 case EIO: return kXR_IOError;
1369 case ENOMEM: return kXR_NoMemory;
1370 case ENOBUFS: return kXR_NoMemory;
1371 case ENOSPC: return kXR_NoSpace;
1372 case ENAMETOOLONG: return kXR_ArgTooLong;
1373 case ENETUNREACH: return kXR_noserver;
1374 case ENOTBLK: return kXR_NotFile;
1375 case ENOTSUP: return kXR_Unsupported;
1376 case EISDIR: return kXR_isDirectory;
1377 case ENOTEMPTY: [[fallthrough]];
1378
1379
1380
1381 case EEXIST:
1382 return kXR_ItExists;
1383 case EBADRQC: return kXR_InvalidRequest;
1384 case ETXTBSY: return kXR_inProgress;
1385 case ENODEV: return kXR_FSError;
1386 case EFAULT: return kXR_ServerError;
1387 case EDOM: return kXR_ChkSumErr;
1388 case EDQUOT: return kXR_overQuota;
1389 case EILSEQ: return kXR_SigVerErr;
1390 case ERANGE: return kXR_DecryptErr;
1391 case EUSERS: return kXR_Overloaded;
1392 case EROFS: return kXR_fsReadOnly;
1393 case ENOATTR: return kXR_AttrNotFound;
1394 case EPROTOTYPE: return kXR_TLSRequired;
1395 case EADDRNOTAVAIL: return kXR_noReplicas;
1396 case EAUTH: return kXR_AuthFailed;
1397 case EIDRM: return kXR_Impossible;
1398 case ENOTTY: return kXR_Conflict;
1399 case ETOOMANYREFS: return kXR_TooManyErrs;
1400 case ETIMEDOUT: return kXR_ReqTimedOut;
1401 case EBADF: return kXR_FileNotOpen;
1402 case ECANCELED: return kXR_Cancelled;
1403 case ETIME: return kXR_TimerExpired;
1404 default: return kXR_FSError;
1405 }
1406 }
1407
1408 static int toErrno( int xerr )
1409 {
1410 switch(xerr)
1411 {case kXR_ArgInvalid: return EINVAL;
1412 case kXR_ArgMissing: return EINVAL;
1413 case kXR_ArgTooLong: return ENAMETOOLONG;
1414 case kXR_FileLocked: return EDEADLK;
1415 case kXR_FileNotOpen: return EBADF;
1416 case kXR_FSError: return ENODEV;
1417 case kXR_InvalidRequest:return EBADRQC;
1418 case kXR_IOError: return EIO;
1419 case kXR_NoMemory: return ENOMEM;
1420 case kXR_NoSpace: return ENOSPC;
1421 case kXR_NotAuthorized: return EACCES;
1422 case kXR_NotFound: return ENOENT;
1423 case kXR_ServerError: return EFAULT;
1424 case kXR_Unsupported: return ENOTSUP;
1425 case kXR_noserver: return EHOSTUNREACH;
1426 case kXR_NotFile: return ENOTBLK;
1427 case kXR_isDirectory: return EISDIR;
1428 case kXR_Cancelled: return ECANCELED;
1429 case kXR_ItExists: return EEXIST;
1430 case kXR_ChkSumErr: return EDOM;
1431 case kXR_inProgress: return EINPROGRESS;
1432 case kXR_overQuota: return EDQUOT;
1433 case kXR_SigVerErr: return EILSEQ;
1434 case kXR_DecryptErr: return ERANGE;
1435 case kXR_Overloaded: return EUSERS;
1436 case kXR_fsReadOnly: return EROFS;
1437 case kXR_BadPayload: return EINVAL;
1438 case kXR_AttrNotFound: return ENOATTR;
1439 case kXR_TLSRequired: return EPROTOTYPE;
1440 case kXR_noReplicas: return EADDRNOTAVAIL;
1441 case kXR_AuthFailed: return EAUTH;
1442 case kXR_Impossible: return EIDRM;
1443 case kXR_Conflict: return ENOTTY;
1444 case kXR_TooManyErrs: return ETOOMANYREFS;
1445 case kXR_ReqTimedOut: return ETIMEDOUT;
1446 case kXR_TimerExpired: return ETIME;
1447 default: return ENOMSG;
1448 }
1449 }
1450
1451 static const char *errName(kXR_int32 errCode);
1452
1453 static const char *reqName(kXR_unt16 reqCode);
1454
1455
1456
1457
1458
1459 struct ServerResponseBody_Attn_asyncdi {
1460 kXR_int32 actnum;
1461 kXR_int32 wsec;
1462 kXR_int32 msec;
1463 };
1464
1465 struct ServerResponseBody_Attn_asyncrd {
1466 kXR_int32 actnum;
1467 kXR_int32 port;
1468 char host[4092];
1469 };
1470
1471 struct ServerResponseBody_Attn_asyncwt {
1472 kXR_int32 actnum;
1473 kXR_int32 wsec;
1474 };
1475
1476
1477
1478 enum XReqErrorType {
1479 kGENERICERR = 0,
1480 kREAD,
1481 kWRITE,
1482 kREDIRCONNECT,
1483 kOK,
1484 kNOMORESTREAMS
1485
1486 };
1487
1488 typedef kXR_int32 ServerResponseType;
1489
1490 #define kXR_maxReqRetry 10
1491
1492 };
1493 #endif