XRootD
XProtocol.hh
Go to the documentation of this file.
1 #ifndef __XPROTOCOL_H
2 #define __XPROTOCOL_H
3 /******************************************************************************/
4 /* */
5 /* X P r o t o c o l . h h */
6 /* */
7 /* (c) 2012 by the Board of Trustees of the Leland Stanford, Jr., University */
8 /* All Rights Reserved */
9 /* Produced by Andrew Hanushevsky for Stanford University under contract */
10 /* DE-AC02-76-SFO0515 with the Department of Energy */
11 /* */
12 /* This file is part of the XRootD software suite. */
13 /* */
14 /* XRootD is free software: you can redistribute it and/or modify it under */
15 /* the terms of the GNU Lesser General Public License as published by the */
16 /* Free Software Foundation, either version 3 of the License, or (at your */
17 /* option) any later version. */
18 /* */
19 /* The XRoot protocol definition, documented in this file, is distributed */
20 /* under a modified BSD license and may be freely used to reimplement it. */
21 /* Any references to "source" in this license refers to this file or any */
22 /* other file that specifically contains the following license. */
23 /* */
24 /* Redistribution and use in source and binary forms, with or without */
25 /* modification, are permitted provided that the following conditions */
26 /* are met: */
27 /* */
28 /* 1. Redistributions of source code must retain the above copyright notice, */
29 /* this list of conditions and the following disclaimer. */
30 /* */
31 /* 2. Redistributions in binary form must reproduce the above copyright */
32 /* notice, this list of conditions and the following disclaimer in the */
33 /* documentation and/or other materials provided with the distribution. */
34 /* */
35 /* 3. Neither the name of the copyright holder nor the names of its */
36 /* contributors may be used to endorse or promote products derived from */
37 /* this software without specific prior written permission. */
38 /* */
39 /* 4. Derived software may not use the name XRootD or cmsd (regardless of */
40 /* capitilization) in association with the derived work if the protocol */
41 /* documented in this file is changed in any way. */
42 /* */
43 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
44 /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
45 /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR */
46 /* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
47 /* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
48 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
49 /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */
50 /* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY */
51 /* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
52 /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE */
53 /******************************************************************************/
54 
55 #ifdef __CINT__
56 #define __attribute__(x)
57 #endif
58 
59 #include "XProtocol/XPtypes.hh"
60 
61 /******************************************************************************/
62 /* P r o t o c o l V e r s i o n D e f i n i t i o n s */
63 /******************************************************************************/
64 
65 // The following is the binary representation of the protocol version here.
66 // Protocol version is repesented as three base10 digits x.y.z with x having no
67 // upper limit (i.e. n.9.9 + 1 -> n+1.0.0). The kXR_PROTSIGNVERSION defines the
68 // protocol version where request signing became available.
69 //
70 #define kXR_PROTOCOLVERSION 0x00000511
71 #define kXR_PROTXATTVERSION 0x00000500
72 #define kXR_PROTTLSVERSION 0x00000500
73 #define kXR_PROTPGRWVERSION 0x00000511
74 #define kXR_PROTSIGNVERSION 0x00000310
75 #define kXR_PROTOCOLVSTRING "5.1.0"
76 
77 /******************************************************************************/
78 /* C l i e n t - S e r v e r H a n d s h a k e */
79 /******************************************************************************/
80 
81 // The fields to be sent as initial handshake
82 //
89 };
90 
91 // The body received after the first handshake's header
92 //
97 };
98 
99 /******************************************************************************/
100 /* C l i e n t R e q u e s t s */
101 /******************************************************************************/
102 
103 // G.Ganis: All the following structures never need padding bytes:
104 // no need of packing options like __attribute__((packed))
105 //
106 // All binary data is sent in network byte order.
107 
108 // Client request codes
109 //
112  kXR_auth = 3000,
113  kXR_query, // 3001
114  kXR_chmod, // 3002
115  kXR_close, // 3003
116  kXR_dirlist, // 3004
117  kXR_gpfile, // 3005 was kXR_getfile
118  kXR_protocol,// 3006
119  kXR_login, // 3007
120  kXR_mkdir, // 3008
121  kXR_mv, // 3009
122  kXR_open, // 3010
123  kXR_ping, // 3011
124  kXR_chkpoint,// 3012 was kXR_putfile
125  kXR_read, // 3013
126  kXR_rm, // 3014
127  kXR_rmdir, // 3015
128  kXR_sync, // 3016
129  kXR_stat, // 3017
130  kXR_set, // 3018
131  kXR_write, // 3019
132  kXR_fattr, // 3020 was kXR_admin
133  kXR_prepare, // 3021
134  kXR_statx, // 3022
135  kXR_endsess, // 3023
136  kXR_bind, // 3024
137  kXR_readv, // 3025
138  kXR_pgwrite, // 3026 was kXR_verifyw
139  kXR_locate, // 3027
140  kXR_truncate,// 3028
141  kXR_sigver, // 3029
142  kXR_pgread, // 3030 was kXR_decrypt
143  kXR_writev, // 3031
144  kXR_REQFENCE // Always last valid request code +1
145 };
146 
147 // Virtual client request codes
148 //
150  kXR_virtReadv = 2000
151 };
152 
153 // All client requests use a header with the following format
154 //
160 };
161 
162 /******************************************************************************/
163 /* k X R _ a u t h R e q u e s t */
164 /******************************************************************************/
165 
172 };
173 
174 /******************************************************************************/
175 /* k X R _ b i n d R e q u e s t */
176 /******************************************************************************/
177 
183 };
184 
185 /******************************************************************************/
186 /* k X R _ c h m o d R e q u e s t */
187 /******************************************************************************/
188 
193  kXR_unt16 mode; // See XOpenRequestMode
195 };
196 
197 /******************************************************************************/
198 /* k X R _ c h k p o i n t R e q u e s t */
199 /******************************************************************************/
200 
204  kXR_char fhandle[4]; // For Create, Delete, Query, or Restore
206  kXR_char opcode; // One of kXR_ckpxxxx actions
208 };
209 
210 // Actions
211 //
212 static const int kXR_ckpBegin = 0; // Begin checkpoint
213 static const int kXR_ckpCommit = 1; // Commit changes
214 static const int kXR_ckpQuery = 2; // Query checkpoint limits
215 static const int kXR_ckpRollback= 3; // Rollback changes
216 static const int kXR_ckpXeq = 4; // Execute trunc, write, or writev
217 
218 // The minimum size of a checkpoint data limit
219 //
220 static const int kXR_ckpMinMax = 104857604; // 10 MB
221 
222 /******************************************************************************/
223 /* k X R _ c l o s e R e q u e s t */
224 /******************************************************************************/
225 
232 };
233 
234 /******************************************************************************/
235 /* k X R _ d i r l i s t R e q u e s t */
236 /******************************************************************************/
237 
241  kXR_dcksm = 4 // dcksm implies dstat irrespective of dstat setting
242 };
243 
248  kXR_char options[1]; // See XDirlistRequestOption enum
250 };
251 
252 /******************************************************************************/
253 /* k X R _ e n d s e s s R e q u e s t */
254 /******************************************************************************/
255 
261 };
262 
263 /******************************************************************************/
264 /* k X R _ f a t t r R e q u e s t */
265 /******************************************************************************/
266 
267 // kXR_fattr subcodes
268 //
274  kXR_fatrrMaxSC = 3 // Highest valid subcode
275 };
276 
277 // kXR_fattr limits
278 //
279 enum xfaLimits {
280  kXR_faMaxVars = 16, // Maximum variables per request
281  kXR_faMaxNlen = 248, // Maximum length of variable name
282  kXR_faMaxVlen = 65536 // Maximum length of variable value
283 };
284 
289  kXR_char subcode; // See xfaSubCode enum
291  kXR_char options; // See valid options below
294 
295 // Valid options:
296 //
297  static const int isNew = 0x01; // For set, the variable must not exist
298  static const int aData = 0x10; // For list, return attribute value
299 
300 // Add an attribute name to nvec (the buffer has to be sufficiently big)
301 //
302  static char* NVecInsert( const char *name, char *buffer );
303 
304 // Add an attribute name to vvec (the buffer has to be sufficiently big)
305 //
306  static char* VVecInsert( const char *value, char *buffer );
307 
308 // Read error code from nvec
309 //
310  static char* NVecRead( char* buffer, kXR_unt16 &rc );
311 
312 // Read attribute name from nvec, should be deallocated with free()
313 //
314  static char* NVecRead( char* buffer, char *&name );
315 
316 // Read value length from vvec
317 //
318  static char* VVecRead( char* buffer, kXR_int32 &len );
319 
320 // Read attribute value from vvec, should be deallocated with free()
321 //
322  static char* VVecRead( char* buffer, kXR_int32 len, char *&value );
323 
324 };
325 
326 /******************************************************************************/
327 /* k X R _ g p f i l e R e q u e s t */
328 /******************************************************************************/
329 
330 struct ClientGPfileRequest { // ??? This is all wrong; correct when implemented
332  kXR_unt16 requestid; // kXR_gpfile
337 };
338 
339 /******************************************************************************/
340 /* k X R _ l o c a t e R e q u e s t */
341 /******************************************************************************/
342 
346  kXR_unt16 options; // See XOpenRequestOption enum tagged for locate
349 };
350 
351 /******************************************************************************/
352 /* k X R _ l o g i n R e q u e s t */
353 /******************************************************************************/
354 
355 // this is a bitmask
365  kXR_redirflags = 128
366 };
367 
368 // this iss a bitmask
371  kXR_ecredir = 1
372 };
373 
374 // this is a bitmask (note that XLoginVersion resides in lower bits)
378  kXR_asyncap = 128
379 };
380 
381 // this is a single number that is or'd into capver as the version
382 //
384  kXR_ver000 = 0, // Old clients predating history
385  kXR_ver001 = 1, // Generally implemented 2005 protocol
386  kXR_ver002 = 2, // Same as 1 but adds asyncresp recognition
387  kXR_ver003 = 3, // The 2011-2012 rewritten client
388  kXR_ver004 = 4, // The 2016 sign-capable client
389  kXR_ver005 = 5 // The 2019 TLS-capable client
390 };
391 
397  kXR_char ability2; // See XLoginAbility2 enum flags
398  kXR_char ability; // See XLoginAbility enum flags
399  kXR_char capver[1]; // See XLoginCapVer enum flags
402 };
403 
404 /******************************************************************************/
405 /* k X R _ m k d i r R e q u e s t */
406 /******************************************************************************/
407 
410  kXR_mkdirpath = 1
411 };
412 
418  kXR_unt16 mode; // See XOpenRequestMode
420 };
421 
422 /******************************************************************************/
423 /* k X R _ m v R e q u e s t */
424 /******************************************************************************/
425 
432 };
433 
434 /******************************************************************************/
435 /* k X R _ o p e n R e q u e s t */
436 /******************************************************************************/
437 
438 // OPEN MODE FOR A REMOTE FILE
440  kXR_ur = 0x100,
441  kXR_uw = 0x080,
442  kXR_ux = 0x040,
443  kXR_gr = 0x020,
444  kXR_gw = 0x010,
445  kXR_gx = 0x008,
446  kXR_or = 0x004,
447  kXR_ow = 0x002,
448  kXR_ox = 0x001
449 };
450 
452  kXR_compress = 0x0001, // 1 // also locate (return unique hosts)
453  kXR_delete = 0x0002, // 2
454  kXR_force = 0x0004, // 4
455  kXR_new = 0x0008, // 8
456  kXR_open_read= 0x0010, // 16
457  kXR_open_updt= 0x0020, // 32
458  kXR_async = 0x0040, // 64
459  kXR_refresh = 0x0080, // 128 // also locate
460  kXR_mkpath = 0x0100, // 256
461  kXR_prefname = 0x0100, // 256 // only locate
462  kXR_open_apnd= 0x0200, // 512
463  kXR_retstat = 0x0400, // 1024
464  kXR_4dirlist = 0x0400, // 1024 // for locate intending a dirlist
465  kXR_replica = 0x0800, // 2048
466  kXR_posc = 0x1000, // 4096
467  kXR_nowait = 0x2000, // 8192 // also locate
468  kXR_seqio = 0x4000, // 16384
469  kXR_open_wrto= 0x8000 // 32768
470 };
471 
473  kXR_dup = 0x0001, // 1
474  kXR_samefs = 0x0002 // 2
475 };
476 
484 };
485 
486 /******************************************************************************/
487 /* k X R _ p g r e a d R e q u e s t */
488 /******************************************************************************/
489 
490 // The page size for pgread and pgwrite and the maximum transmission size
491 //
492 namespace XrdProto // Always use this namespace for new additions
493 {
494 static const int kXR_pgPageSZ = 4096; // Length of a page
495 static const int kXR_pgPageBL = 12; // log2(page length)
496 static const int kXR_pgUnitSZ = kXR_pgPageSZ + sizeof(kXR_unt32);
497 static const int kXR_pgMaxEpr = 128; // Max checksum errs per request
498 static const int kXR_pgMaxEos = 256; // Max checksum errs outstanding
499 
500 // kXR_pgread/write options
501 //
502 static const kXR_char kXR_AnyPath = 0xff; // In pathid
503 static const int kXR_pgRetry = 0x01; // In reqflags
504 }
505 
512  kXR_int32 dlen; // Request data length must be 0 unless args present
513 };
514 
516  kXR_char pathid; // Request data length must be 1
517  kXR_char reqflags; // Request data length must be 2
518 };
519 
520 namespace
521 {
522 }
523 
524 /******************************************************************************/
525 /* k X R _ p r w r i t e R e q u e s t */
526 /******************************************************************************/
527 
537 // kXR_char data[dlen];
538 };
539 
540 /******************************************************************************/
541 /* k X R _ p i n g R e q u e s t */
542 /******************************************************************************/
543 
549 };
550 
551 /******************************************************************************/
552 /* k X R _ p r o t o c o l R e q u e s t */
553 /******************************************************************************/
554 
558  kXR_int32 clientpv; // 2.9.7 or higher
559  kXR_char flags; // 3.1.0 or higher
560  kXR_char expect; // 4.0.0 or higher
563 
565  kXR_secreqs = 0x01, // Options: Return security requirements
566  kXR_ableTLS = 0x02, // Options: Client is TLS capable
567  kXR_wantTLS = 0x04, // Options: Change connection to use TLS
568  kXR_bifreqs = 0x08 // Options: Return bind interface requirements
569 };
570 
572  kXR_ExpMask = 0x0f, // Isolate the relevant expect enumeration value
573  kXR_ExpNone = 0x00,
574  kXR_ExpBind = 0x01,
575  kXR_ExpGPF = 0x02,
576  kXR_ExpLogin = 0x03,
577  kXR_ExpTPC = 0x04,
578  kXR_ExpGPFA = 0x08
579 };
580 };
581 
582 /******************************************************************************/
583 /* k X R _ p r e p a r e R e q u e s t */
584 /******************************************************************************/
585 
591  kXR_wmode = 16,
592  kXR_coloc = 32,
593  kXR_fresh = 64,
594  kXR_usetcp = 128,
595 
596  kXR_evict = 0x0001 // optionsX: file no longer useful
597 };
598 
604  kXR_unt16 port; // 2.9.9 or higher
605  kXR_unt16 optionX; // Extended options
608 };
609 
610 /******************************************************************************/
611 /* k X R _ q u e r y R e q u e s t */
612 /******************************************************************************/
613 
625  kXR_Qopaqug=64
626 };
627 
631  kXR_unt16 infotype; // See XQueryType enum
636 };
637 
638 /******************************************************************************/
639 /* k X R _ r e a d R e q u e s t */
640 /******************************************************************************/
641 
649 // Optionally followed by read_args
650 };
651 
652 struct read_args {
655 // This struct may be followed by an array of readahead_list
656 };
657 
662 };
663 
664 /******************************************************************************/
665 /* k X R _ r e a d v R e q u e s t */
666 /******************************************************************************/
667 
674 // This struct followed by the read_list
675 };
676 
677 namespace XrdProto // Always use this namespace for new additions
678 {
679 struct read_list {
683 };
684 static const int rlItemLen = sizeof(read_list);
685 static const int maxRvecln = 16384; // Max read vector length
686 static const int maxRvecsz = maxRvecln/rlItemLen; // Max number of elements
687 static const int minRVbsz = 2097152; // 2MB minimum buffer size
688 static const int maxRVdsz = minRVbsz-rlItemLen; // Max amount of data to xfer
689 }
690 
691 /******************************************************************************/
692 /* k X R _ r m R e q u e s t */
693 /******************************************************************************/
694 
700 };
701 
702 /******************************************************************************/
703 /* k X R _ r m d i r R e q u e s t */
704 /******************************************************************************/
705 
711 };
712 
713 /******************************************************************************/
714 /* k X R _ s e t R e q u e s t */
715 /******************************************************************************/
716 
721  kXR_char modifier; // For security purposes, should be zero
723 };
724 
725 /******************************************************************************/
726 /* k X R _ s i g v e r R e q u e s t */
727 /******************************************************************************/
728 
729 // Cryptography used for kXR_sigver SigverRequest::crypto
731  kXR_SHA256 = 0x01, // Hash used
732  kXR_HashMask = 0x0f, // Mak to extract the hash type
733  kXR_rsaKey = 0x80 // The rsa key was used
734 };
735 
736 // Flags for kXR_sigver
737 enum XSecFlags {
738  kXR_nodata = 1 // Request payload was not hashed
739 };
740 
741 // Version number
743  kXR_Ver_00 = 0
744 };
745 
749  kXR_unt16 expectrid; // Request code of subsequent request
750  kXR_char version; // Security version being used (see XSecVersion)
751  kXR_char flags; // One or more flags defined in enum (see XSecFlags)
752  kXR_unt64 seqno; // Monotonically increasing number (part of hash)
753  kXR_char crypto; // Cryptography used (see XSecCrypto)
756 };
757 
758 /******************************************************************************/
759 /* k X R _ s t a t R e q u e s t */
760 /******************************************************************************/
761 
763  kXR_vfs = 1
764 };
765 
769  kXR_char options; // See XStatRequestOption
773 };
774 
775 /******************************************************************************/
776 /* k X R _ s y n c R e q u e s t */
777 /******************************************************************************/
778 
785 };
786 
787 /******************************************************************************/
788 /* k X R _ t r u n c a t e R e q u e s t */
789 /******************************************************************************/
790 
798 };
799 
800 /******************************************************************************/
801 /* k X R _ w r i t e R e q u e s t */
802 /******************************************************************************/
803 
812 };
813 
814 /******************************************************************************/
815 /* k X R _ w r i t e v R e q u e s t */
816 /******************************************************************************/
817 
821  kXR_char options; // See static const ints below
824 // This struct followed by the write_list
825 
826  static const kXR_int32 doSync = 0x01;
827 };
828 
829 namespace XrdProto // Always use this namespace for new additions
830 {
831 struct write_list {
835 };
836 static const int wlItemLen = sizeof(write_list);
837 static const int maxWvecln = 16384;
838 static const int maxWvecsz = maxWvecln/wlItemLen;
839 }
840 
841 /******************************************************************************/
842 /* U n i o n o f a l l C l i e n t R e q u e s t s */
843 /******************************************************************************/
844 
845 typedef union {
846  struct ClientRequestHdr header;
847  struct ClientAuthRequest auth;
848  struct ClientBindRequest bind;
849  struct ClientChkPointRequest chkpoint;
850  struct ClientChmodRequest chmod;
851  struct ClientCloseRequest close;
852  struct ClientDirlistRequest dirlist;
853  struct ClientEndsessRequest endsess;
854  struct ClientFattrRequest fattr;
855  struct ClientGPfileRequest gpfile;
856  struct ClientLocateRequest locate;
857  struct ClientLoginRequest login;
858  struct ClientMkdirRequest mkdir;
859  struct ClientMvRequest mv;
860  struct ClientOpenRequest open;
861  struct ClientPgReadRequest pgread;
862  struct ClientPgWriteRequest pgwrite;
863  struct ClientPingRequest ping;
865  struct ClientProtocolRequest protocol;
866  struct ClientQueryRequest query;
867  struct ClientReadRequest read;
868  struct ClientReadVRequest readv;
869  struct ClientRmRequest rm;
870  struct ClientRmdirRequest rmdir;
871  struct ClientSetRequest set;
872  struct ClientSigverRequest sigver;
873  struct ClientStatRequest stat;
874  struct ClientSyncRequest sync;
876  struct ClientWriteRequest write;
878 } ClientRequest;
879 
880 typedef union {
881  struct ClientRequestHdr header;
882  struct ClientSigverRequest sigver;
884 
885 /******************************************************************************/
886 /* S e r v e r R e s p o n s e s */
887 /******************************************************************************/
888 
889 // Nice header for the server response.
890 // Note that the protocol specifies these values to be in network
891 // byte order when sent
892 //
893 // G.Ganis: The following structures never need padding bytes:
894 // no need of packing options
895 
896 // Server response codes
897 //
899  kXR_ok = 0,
900  kXR_oksofar = 4000,
901  kXR_attn, // 4001
902  kXR_authmore,// 4002
903  kXR_error, // 4003
904  kXR_redirect,// 4004
905  kXR_wait, // 4005
906  kXR_waitresp,// 4006
907  kXR_status, // 4007
908  kXR_noResponsesYet = 10000
909 };
910 
911 // All serer responses start with the same header
912 //
917 };
918 
919 // This is a bit of wierdness held over from the very old days, sigh.
920 //
922  char data[4096];
923 };
924 
925 /******************************************************************************/
926 /* k X R _ a t t n R e s p o n s e */
927 /******************************************************************************/
928 
930  kXR_asyncab = 5000, // No longer supported
931  kXR_asyncdi, // 5001 No longer supported
932  kXR_asyncms = 5002,
933  kXR_asyncrd, // 5003 No longer supported
934  kXR_asyncwt, // 5004 No longer supported
935  kXR_asyncav, // 5005 No longer supported
936  kXR_asynunav, // 5006 No longer supported
937  kXR_asyncgo, // 5007 No longer supported
938  kXR_asynresp= 5008
939 };
940 
942  kXR_int32 actnum; // See XActionCode enum
943  char parms[4096]; // Should be sufficient for every use
944 };
945 
947  kXR_int32 actnum; // XActionCode::kXR_asyncms
948  char reserved[4];
950  char respdata[4096];
951 };
952 
954  kXR_int32 actnum; // XActionCode::kXR_asynresp
955  char reserved[4];
957  char respdata[4096];
958 };
959 
960 /******************************************************************************/
961 /* k X R _ a u t h m o r e R e s p o n s e */
962 /******************************************************************************/
963 
965  char data[4096];
966 };
967 
968 /******************************************************************************/
969 /* k X R _ b i n d R e s p o n s e */
970 /******************************************************************************/
971 
974 };
975 
976 /******************************************************************************/
977 /* k X R _ c h k p o i n t R e s p o n s e */
978 /******************************************************************************/
979 
980 struct ServerResponseBody_ChkPoint { // Only for kXR_ckpQMax
981  kXR_unt32 maxCkpSize; // Maximum number of bytes including overhead
982  kXR_unt32 useCkpSize; // The number of bytes already being used
983 };
984 
985 /******************************************************************************/
986 /* k X R _ e r r o r R e s p o n s e */
987 /******************************************************************************/
988 
991  kXR_ArgMissing, // 3001
992  kXR_ArgTooLong, // 3002
993  kXR_FileLocked, // 3003
995  kXR_FSError, // 3005
997  kXR_IOError, // 3007
998  kXR_NoMemory, // 3008
999  kXR_NoSpace, // 3009
1001  kXR_NotFound, // 3011
1004  kXR_noserver, // 3014
1005  kXR_NotFile, // 3015
1007  kXR_Cancelled, // 3017
1008  kXR_ItExists, // 3018
1009  kXR_ChkSumErr, // 3019
1011  kXR_overQuota, // 3021
1012  kXR_SigVerErr, // 3022
1022  kXR_Conflict, // 3032
1026  kXR_ERRFENCE, // Always last valid errcode + 1
1027  kXR_noErrorYet = 10000
1028 };
1029 
1031  kXR_int32 errnum; // See XErrorCode enu
1032  char errmsg[4096]; // Should be sufficient for every use
1033 };
1034 
1035 /******************************************************************************/
1036 /* k X R _ l o g i n R e s p o n s e */
1037 /******************************************************************************/
1038 
1041  kXR_char sec[4096]; // Should be sufficient for every use
1042 };
1043 
1044 /******************************************************************************/
1045 /* k X R _ o p e n R e s p o n s e */
1046 /******************************************************************************/
1047 
1050  kXR_int32 cpsize; // cpsize & cptype returned if kXR_compress *or*
1051  kXR_char cptype[4]; // kXR_retstat is specified
1052 }; // info will follow if kXR_retstat is specified
1053 
1054 /******************************************************************************/
1055 /* k X R _ p g r e a d R e s p o n s e */
1056 /******************************************************************************/
1057 
1059  kXR_int64 offset; // info[]: File offset of data that follows
1060 // kXR_char data[dlen];
1061 };
1062 
1063 /******************************************************************************/
1064 /* k X R _ p g w r i t e R e s p o n s e */
1065 /******************************************************************************/
1066 
1068  kXR_int64 offset; // info[]: File offset of data written
1069 };
1070 
1071 
1072 // The following structure is appended to ServerResponseBody_pgWrite if one or
1073 // more checksum errors occurred and need to be retransmitted.
1074 //
1076  kXR_unt32 cseCRC; // crc32c of all following bits
1077  kXR_int16 dlFirst; // Data length at first offset in list
1078  kXR_int16 dlLast; // Data length at last offset in list
1079 // kXR_int64 bof[(dlen-8)/8]; // List of offsets of pages in error
1080 };
1081 
1082 /******************************************************************************/
1083 /* k X R _ p r o t o c o l R e s p o n s e */
1084 /******************************************************************************/
1085 
1086 // The following information is returned in the response body when kXR_bifreqs
1087 // is set in ClientProtocolRequest::flags. Note that the size of bifInfo is
1088 // is variable. This response will not be returned if there are no bif's.
1089 // Note: This structure is null byte padded to be a multiple of 8 bytes!
1090 //
1092  kXR_char theTag; // Always the character 'B' to identify struct
1093  kXR_char rsvd; // Reserved for the future (always 0 for now)
1094  kXR_unt16 bifILen; // Length of bifInfo including null bytes.
1095 // kXR_char bifInfo[bifILen];
1096 };
1097 
1098 // The following information is returned in the response body when kXR_secreqs
1099 // is set in ClientProtocolRequest::flags. Note that the size of secvec is
1100 // defined by secvsz and will not be present when secvsz == 0.
1101 //
1103  kXR_char reqindx; // Request index
1104  kXR_char reqsreq; // Request signing requirement
1105 };
1106 
1108  kXR_char theTag; // Always the character 'S' to identify struct
1109  kXR_char rsvd; // Reserved for the future (always 0 for now)
1110  kXR_char secver; // Security version
1111  kXR_char secopt; // Security options
1112  kXR_char seclvl; // Security level when secvsz == 0
1113  kXR_char secvsz; // Number of items in secvec (i.e. its length/2)
1115 };
1116 
1117 
1118 namespace XrdProto
1119 {
1120 typedef struct ServerResponseBifs_Protocol bifReqs;
1121 typedef struct ServerResponseReqs_Protocol secReqs;
1122 }
1123 
1124 // Options reflected in protocol response ServerResponseReqs_Protocol::secopt
1125 //
1126 #define kXR_secOData 0x01
1127 #define kXR_secOFrce 0x02
1128 
1129 // Security level definitions (these are predefined but can be over-ridden)
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 // Requirements one of which set in each ServerResponseReqs_Protocol::secvec
1138 //
1139 #define kXR_signIgnore 0
1140 #define kXR_signLikely 1
1141 #define kXR_signNeeded 2
1142 
1143 // Version used for kXR_sigver and is set in SigverRequest::version,
1144 // ServerResponseReqs_Protocol::secver
1145 //
1146 #define kXR_secver_0 0
1147 
1148 // KINDS of SERVERS (no longer used by new clients)
1149 //
1150 #define kXR_DataServer 1
1151 #define kXR_LBalServer 0
1152 
1153 // The below are defined for protocol version 2.9.7 or higher
1154 // These are the flag values in the kXR_protool response
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 // Virtual options set on redirect
1165 //
1166 #define kXR_recoverWrts 0x00001000
1167 #define kXR_collapseRedir 0x00002000
1168 #define kXR_ecRedir 0x00004000
1169 
1170 // Things the server supports
1171 //
1172 #define kXR_anongpf 0x00800000
1173 #define kXR_supgpf 0x00400000
1174 #define kXR_suppgrw 0x00200000
1175 #define kXR_supposc 0x00100000
1176 
1177 // TLS requirements
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 // Body for the kXR_protocol response... useful
1190 //
1194  ServerResponseReqs_Protocol secreq; // Only for V3.1.0+ && if requested
1195 };
1196 
1197 // Handy definition of the size of the protocol response when the security
1198 // information is not present.
1199 //
1200 #define kXR_ShortProtRespLen sizeof(ServerResponseBody_Protocol)-\
1201  sizeof(ServerResponseReqs_Protocol)
1202 
1203 /******************************************************************************/
1204 /* k X R _ r e d i r e c t R e s p o n s e */
1205 /******************************************************************************/
1206 
1209  char host[4096]; // Should be sufficient for every use
1210 };
1211 
1212 /******************************************************************************/
1213 /* k X R _ s t a t R e s p o n s e */
1214 /******************************************************************************/
1215 
1216 // The following bits are encoded in the "flags" token in the response
1217 //
1227  kXR_bkpexist=128
1228 };
1229 
1230 /******************************************************************************/
1231 /* k X R _ s t a t u s R e s p o n s e */
1232 /******************************************************************************/
1233 
1234 struct ServerResponseBody_Status { // Always preceeded by ServerResponseHeader
1235  kXR_unt32 crc32c; // IETF RFC 7143 standard
1236  kXR_char streamID[2]; // Identical to streamid[2] in ServerResponseHeader
1237  kXR_char requestid; // requestcode - kXR_1stRequest
1238  kXR_char resptype; // See RespType enum below
1241 // kXR_char info[ServerResponseHeader::dlen-sizeof(ServerResponseBody_Status)];
1242 // kXR_char data[dlen];
1243 };
1244 
1245 namespace XrdProto
1246 {
1247 enum RespType {
1248 
1251  kXR_ProgressInfo = 0x02
1252 };
1253 
1254  // This is the minimum size of ServerResponseHeader::dlen for kXR_status
1255  //
1256  static const int kXR_statusBodyLen = sizeof(ServerResponseBody_Status);
1257 }
1258 
1260  struct ServerResponseHeader hdr;
1262 };
1263 
1264 /******************************************************************************/
1265 /* k X R _ w a i t R e s p o n s e */
1266 /******************************************************************************/
1267 
1270  char infomsg[4096]; // Should be sufficient for every use
1271 };
1272 
1273 /******************************************************************************/
1274 /* k X R _ w a i t r e s p R e s p o n s e */
1275 /******************************************************************************/
1276 
1279 };
1280 
1281 /******************************************************************************/
1282 /* U n i o n o f a l l S e r v e r R e s p o n s e s */
1283 /******************************************************************************/
1284 
1286 {
1288  union
1289  {
1291  ServerResponseBody_Authmore authmore;
1296  ServerResponseBody_Protocol protocol;
1297  ServerResponseBody_Redirect redirect;
1300  ServerResponseBody_Waitresp waitresp;
1301  } body;
1302 };
1303 
1304 // The pgread and pgwrite do not fit the union above because they are composed
1305 // of three structs not two as all the above. So, we define the exceptions here.
1306 //
1308 {
1309  ServerResponseStatus status; // status.bdy and status.hdr
1310  union
1311  {
1314  } info;
1315 };
1316 
1317 struct ALIGN_CHECK {char chkszreq[25-sizeof(ClientRequest)];
1318  char chkszrsp[ 9-sizeof(ServerResponseHeader)];
1319 };
1320 
1321 /******************************************************************************/
1322 /* X P r o t o c o l U t i l i t i e s */
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 
1356 {
1357 public:
1358 
1359 // mapError() is the official mapping from errno to xroot protocol error.
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  // In the case one tries to delete a non-empty directory
1379  // we have decided that until the next major release
1380  // the kXR_ItExists flag will be returned
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; // Used for 504 Gateway timeout in proxy
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 /* O b s o l e t e D e f i n i t i o n s */
1457 /******************************************************************************/
1458 
1459 struct ServerResponseBody_Attn_asyncdi { // No longer supported
1463 };
1464 
1465 struct ServerResponseBody_Attn_asyncrd { // No longer supported
1468  char host[4092];
1469 };
1470 
1471 struct ServerResponseBody_Attn_asyncwt { // No longer supported
1474 };
1475 
1476 // Kind of error inside a XTNetFile's routine (temporary)
1477 //
1479  kGENERICERR = 0, // Generic error
1480  kREAD, // Error while reading from stream
1481  kWRITE, // Error while writing to stream
1482  kREDIRCONNECT, // Error redirecting to a given host
1483  kOK, // Everything seems ok
1484  kNOMORESTREAMS // No more available stream IDs for
1485  // async processing
1486 };
1487 
1489 
1490 #define kXR_maxReqRetry 10
1491 
1492 }; // XProtocol
1493 #endif
kXR_unt16 requestid
Definition: XProtocol.hh:479
kXR_int32 dlen
Definition: XProtocol.hh:171
kXR_char options[1]
Definition: XProtocol.hh:248
kXR_char reserved[8]
Definition: XProtocol.hh:334
static const int kXR_ckpRollback
Definition: XProtocol.hh:215
XActionCode
Definition: XProtocol.hh:929
@ kXR_asyncgo
Definition: XProtocol.hh:937
@ kXR_asyncwt
Definition: XProtocol.hh:934
@ kXR_asynunav
Definition: XProtocol.hh:936
@ kXR_asynresp
Definition: XProtocol.hh:938
@ kXR_asyncav
Definition: XProtocol.hh:935
@ kXR_asyncms
Definition: XProtocol.hh:932
@ kXR_asyncab
Definition: XProtocol.hh:930
@ kXR_asyncrd
Definition: XProtocol.hh:933
@ kXR_asyncdi
Definition: XProtocol.hh:931
XErrorCode
Definition: XProtocol.hh:989
@ kXR_ArgInvalid
Definition: XProtocol.hh:990
@ kXR_InvalidRequest
Definition: XProtocol.hh:996
@ kXR_ArgMissing
Definition: XProtocol.hh:991
@ kXR_fsReadOnly
Definition: XProtocol.hh:1015
@ kXR_Impossible
Definition: XProtocol.hh:1021
@ kXR_TLSRequired
Definition: XProtocol.hh:1018
@ kXR_SigVerErr
Definition: XProtocol.hh:1012
@ kXR_TimerExpired
Definition: XProtocol.hh:1025
@ kXR_TooManyErrs
Definition: XProtocol.hh:1023
@ kXR_AttrNotFound
Definition: XProtocol.hh:1017
@ kXR_ItExists
Definition: XProtocol.hh:1008
@ kXR_AuthFailed
Definition: XProtocol.hh:1020
@ kXR_NotAuthorized
Definition: XProtocol.hh:1000
@ kXR_NotFound
Definition: XProtocol.hh:1001
@ kXR_FileLocked
Definition: XProtocol.hh:993
@ kXR_ERRFENCE
Definition: XProtocol.hh:1026
@ kXR_noErrorYet
Definition: XProtocol.hh:1027
@ kXR_ChkSumErr
Definition: XProtocol.hh:1009
@ kXR_DecryptErr
Definition: XProtocol.hh:1013
@ kXR_overQuota
Definition: XProtocol.hh:1011
@ kXR_BadPayload
Definition: XProtocol.hh:1016
@ kXR_NoSpace
Definition: XProtocol.hh:999
@ kXR_FileNotOpen
Definition: XProtocol.hh:994
@ kXR_isDirectory
Definition: XProtocol.hh:1006
@ kXR_noReplicas
Definition: XProtocol.hh:1019
@ kXR_inProgress
Definition: XProtocol.hh:1010
@ kXR_NotFile
Definition: XProtocol.hh:1005
@ kXR_Unsupported
Definition: XProtocol.hh:1003
@ kXR_Cancelled
Definition: XProtocol.hh:1007
@ kXR_Conflict
Definition: XProtocol.hh:1022
@ kXR_ServerError
Definition: XProtocol.hh:1002
@ kXR_Overloaded
Definition: XProtocol.hh:1014
@ kXR_ArgTooLong
Definition: XProtocol.hh:992
@ kXR_noserver
Definition: XProtocol.hh:1004
@ kXR_ReqTimedOut
Definition: XProtocol.hh:1024
@ kXR_IOError
Definition: XProtocol.hh:997
@ kXR_FSError
Definition: XProtocol.hh:995
@ kXR_NoMemory
Definition: XProtocol.hh:998
kXR_char streamid[2]
Definition: XProtocol.hh:767
kXR_int16 arg1len
Definition: XProtocol.hh:430
kXR_char body[16]
Definition: XProtocol.hh:158
kXR_char streamid[2]
Definition: XProtocol.hh:747
union ServerResponse::@0 body
kXR_unt16 requestid
Definition: XProtocol.hh:630
kXR_unt16 requestid
Definition: XProtocol.hh:806
XLoginAbility2
Definition: XProtocol.hh:369
@ kXR_empty
Definition: XProtocol.hh:370
@ kXR_ecredir
Definition: XProtocol.hh:371
kXR_char reserved[12]
Definition: XProtocol.hh:783
kXR_char reserved[3]
Definition: XProtocol.hh:810
xfaSubCode
Definition: XProtocol.hh:269
@ kXR_fattrDel
Definition: XProtocol.hh:270
@ kXR_fattrSet
Definition: XProtocol.hh:273
@ kXR_fattrList
Definition: XProtocol.hh:272
@ kXR_fattrGet
Definition: XProtocol.hh:271
@ kXR_fatrrMaxSC
Definition: XProtocol.hh:274
kXR_char streamid[2]
Definition: XProtocol.hh:344
kXR_int32 dlen
Definition: XProtocol.hh:182
kXR_char fhandle[4]
Definition: XProtocol.hh:531
static const int kXR_ckpMinMax
Definition: XProtocol.hh:220
kXR_unt16 requestid
Definition: XProtocol.hh:394
kXR_char reserved[12]
Definition: XProtocol.hh:230
ServerResponseStatus status
Definition: XProtocol.hh:1309
kXR_char fhandle[4]
Definition: XProtocol.hh:782
kXR_unt16 requestid
Definition: XProtocol.hh:748
kXR_char reserved1[2]
Definition: XProtocol.hh:632
kXR_char streamid[2]
Definition: XProtocol.hh:179
kXR_unt16 requestid
Definition: XProtocol.hh:332
kXR_char streamid[2]
Definition: XProtocol.hh:427
kXR_unt16 requestid
Definition: XProtocol.hh:546
kXR_char streamid[2]
Definition: XProtocol.hh:529
kXR_char fhandle[4]
Definition: XProtocol.hh:807
kXR_char streamid[2]
Definition: XProtocol.hh:780
kXR_char reserved[2]
Definition: XProtocol.hh:535
kXR_char streamid[2]
Definition: XProtocol.hh:156
kXR_char streamid[2]
Definition: XProtocol.hh:167
#define EAUTH
Definition: XProtocol.hh:1350
kXR_char fhandle[4]
Definition: XProtocol.hh:771
kXR_int32 dlen
Definition: XProtocol.hh:431
kXR_int32 msglen
Definition: XProtocol.hh:94
kXR_int64 offset
Definition: XProtocol.hh:646
kXR_char streamid[2]
Definition: XProtocol.hh:202
kXR_unt16 requestid
Definition: XProtocol.hh:644
XVirtRequestTypes
Definition: XProtocol.hh:149
@ kXR_virtReadv
Definition: XProtocol.hh:150
kXR_char streamid[2]
Definition: XProtocol.hh:914
kXR_unt16 options
Definition: XProtocol.hh:481
kXR_char streamid[2]
Definition: XProtocol.hh:545
static const int kXR_ckpXeq
Definition: XProtocol.hh:216
kXR_char streamid[2]
Definition: XProtocol.hh:331
kXR_char reserved[11]
Definition: XProtocol.hh:770
kXR_unt16 requestid
Definition: XProtocol.hh:228
kXR_char reserved[10]
Definition: XProtocol.hh:606
kXR_char streamid[2]
Definition: XProtocol.hh:643
kXR_char streamid[2]
Definition: XProtocol.hh:227
kXR_char streamid[2]
Definition: XProtocol.hh:507
kXR_char streamid[2]
Definition: XProtocol.hh:393
kXR_char pathid
Definition: XProtocol.hh:653
kXR_char reserved2
Definition: XProtocol.hh:400
kXR_char streamid[2]
Definition: XProtocol.hh:718
kXR_char credtype[4]
Definition: XProtocol.hh:170
#define ENOATTR
Definition: XProtocol.hh:1342
kXR_char username[8]
Definition: XProtocol.hh:396
kXR_int32 dlen
Definition: XProtocol.hh:784
XOpenRequestOption
Definition: XProtocol.hh:451
@ kXR_open_wrto
Definition: XProtocol.hh:469
@ kXR_compress
Definition: XProtocol.hh:452
@ kXR_async
Definition: XProtocol.hh:458
@ kXR_delete
Definition: XProtocol.hh:453
@ kXR_prefname
Definition: XProtocol.hh:461
@ kXR_nowait
Definition: XProtocol.hh:467
@ kXR_open_read
Definition: XProtocol.hh:456
@ kXR_open_updt
Definition: XProtocol.hh:457
@ kXR_mkpath
Definition: XProtocol.hh:460
@ kXR_seqio
Definition: XProtocol.hh:468
@ kXR_replica
Definition: XProtocol.hh:465
@ kXR_posc
Definition: XProtocol.hh:466
@ kXR_refresh
Definition: XProtocol.hh:459
@ kXR_new
Definition: XProtocol.hh:455
@ kXR_force
Definition: XProtocol.hh:454
@ kXR_4dirlist
Definition: XProtocol.hh:464
@ kXR_open_apnd
Definition: XProtocol.hh:462
@ kXR_retstat
Definition: XProtocol.hh:463
kXR_char reserved[12]
Definition: XProtocol.hh:169
kXR_char rsvd2[3]
Definition: XProtocol.hh:754
XResponseType
Definition: XProtocol.hh:898
@ kXR_noResponsesYet
Definition: XProtocol.hh:908
@ kXR_waitresp
Definition: XProtocol.hh:906
@ kXR_redirect
Definition: XProtocol.hh:904
@ kXR_oksofar
Definition: XProtocol.hh:900
@ kXR_status
Definition: XProtocol.hh:907
@ kXR_ok
Definition: XProtocol.hh:899
@ kXR_authmore
Definition: XProtocol.hh:902
@ kXR_attn
Definition: XProtocol.hh:901
@ kXR_wait
Definition: XProtocol.hh:905
@ kXR_error
Definition: XProtocol.hh:903
kXR_unt16 requestid
Definition: XProtocol.hh:345
struct ServerResponseBody_Status bdy
Definition: XProtocol.hh:1261
kXR_char streamid[2]
Definition: XProtocol.hh:805
XDirlistRequestOption
Definition: XProtocol.hh:238
@ kXR_dstat
Definition: XProtocol.hh:240
@ kXR_dcksm
Definition: XProtocol.hh:241
@ kXR_online
Definition: XProtocol.hh:239
kXR_unt16 requestid
Definition: XProtocol.hh:168
kXR_char streamid[2]
Definition: XProtocol.hh:245
kXR_char reserved[16]
Definition: XProtocol.hh:698
kXR_unt16 requestid
Definition: XProtocol.hh:428
kXR_char fhandle[4]
Definition: XProtocol.hh:509
kXR_char reserved[14]
Definition: XProtocol.hh:347
kXR_unt16 infotype
Definition: XProtocol.hh:631
ServerResponseHeader resphdr
Definition: XProtocol.hh:949
kXR_int32 fourth
Definition: XProtocol.hh:87
kXR_char reserved2[8]
Definition: XProtocol.hh:634
kXR_char fhandle[4]
Definition: XProtocol.hh:645
kXR_char streamid[2]
Definition: XProtocol.hh:414
kXR_char fhandle[4]
Definition: XProtocol.hh:659
ServerResponseSVec_Protocol secvec
Definition: XProtocol.hh:1114
kXR_char fhandle[4]
Definition: XProtocol.hh:229
kXR_unt16 requestid
Definition: XProtocol.hh:157
kXR_char reserved[14]
Definition: XProtocol.hh:192
kXR_char fhandle[4]
Definition: XProtocol.hh:633
kXR_char sessid[16]
Definition: XProtocol.hh:181
kXR_char reserved[7]
Definition: XProtocol.hh:654
XRequestTypes
Definition: XProtocol.hh:110
@ kXR_read
Definition: XProtocol.hh:125
@ kXR_open
Definition: XProtocol.hh:122
@ kXR_writev
Definition: XProtocol.hh:143
@ kXR_readv
Definition: XProtocol.hh:137
@ kXR_mkdir
Definition: XProtocol.hh:120
@ kXR_sync
Definition: XProtocol.hh:128
@ kXR_REQFENCE
Definition: XProtocol.hh:144
@ kXR_chmod
Definition: XProtocol.hh:114
@ kXR_bind
Definition: XProtocol.hh:136
@ kXR_dirlist
Definition: XProtocol.hh:116
@ kXR_sigver
Definition: XProtocol.hh:141
@ kXR_fattr
Definition: XProtocol.hh:132
@ kXR_rm
Definition: XProtocol.hh:126
@ kXR_query
Definition: XProtocol.hh:113
@ kXR_write
Definition: XProtocol.hh:131
@ kXR_gpfile
Definition: XProtocol.hh:117
@ kXR_login
Definition: XProtocol.hh:119
@ kXR_auth
Definition: XProtocol.hh:112
@ kXR_endsess
Definition: XProtocol.hh:135
@ kXR_set
Definition: XProtocol.hh:130
@ kXR_rmdir
Definition: XProtocol.hh:127
@ kXR_1stRequest
Definition: XProtocol.hh:111
@ kXR_statx
Definition: XProtocol.hh:134
@ kXR_truncate
Definition: XProtocol.hh:140
@ kXR_protocol
Definition: XProtocol.hh:118
@ kXR_mv
Definition: XProtocol.hh:121
@ kXR_ping
Definition: XProtocol.hh:123
@ kXR_stat
Definition: XProtocol.hh:129
@ kXR_pgread
Definition: XProtocol.hh:142
@ kXR_chkpoint
Definition: XProtocol.hh:124
@ kXR_locate
Definition: XProtocol.hh:139
@ kXR_close
Definition: XProtocol.hh:115
@ kXR_pgwrite
Definition: XProtocol.hh:138
@ kXR_prepare
Definition: XProtocol.hh:133
kXR_int32 dlen
Definition: XProtocol.hh:699
kXR_unt16 requestid
Definition: XProtocol.hh:719
XSecVersion
Definition: XProtocol.hh:742
@ kXR_Ver_00
Definition: XProtocol.hh:743
kXR_char streamid[2]
Definition: XProtocol.hh:696
kXR_char reserved[15]
Definition: XProtocol.hh:247
kXR_int32 protover
Definition: XProtocol.hh:95
kXR_int32 dlen
Definition: XProtocol.hh:648
kXR_int32 rlen
Definition: XProtocol.hh:660
xfaLimits
Definition: XProtocol.hh:279
@ kXR_faMaxVars
Definition: XProtocol.hh:280
@ kXR_faMaxVlen
Definition: XProtocol.hh:282
@ kXR_faMaxNlen
Definition: XProtocol.hh:281
kXR_unt16 requestid
Definition: XProtocol.hh:180
char chkszreq[25-sizeof(ClientRequest)]
Definition: XProtocol.hh:1317
kXR_char sessid[16]
Definition: XProtocol.hh:259
kXR_unt16 requestid
Definition: XProtocol.hh:768
kXR_int32 dlen
Definition: XProtocol.hh:483
kXR_char reserved[14]
Definition: XProtocol.hh:429
kXR_char fhandle[4]
Definition: XProtocol.hh:794
struct ServerResponseHeader hdr
Definition: XProtocol.hh:1260
kXR_unt16 requestid
Definition: XProtocol.hh:415
kXR_unt16 mode
Definition: XProtocol.hh:480
kXR_unt16 requestid
Definition: XProtocol.hh:508
kXR_char reserved[4]
Definition: XProtocol.hh:796
union ServerResponseV2::@1 info
XLoginCapVer
Definition: XProtocol.hh:375
@ kXR_vermask
Definition: XProtocol.hh:377
@ kXR_asyncap
Definition: XProtocol.hh:378
@ kXR_lcvnone
Definition: XProtocol.hh:376
char chkszrsp[9-sizeof(ServerResponseHeader)]
Definition: XProtocol.hh:1318
kXR_unt16 requestid
Definition: XProtocol.hh:781
kXR_char options[1]
Definition: XProtocol.hh:416
kXR_unt16 requestid
Definition: XProtocol.hh:697
kXR_char streamid[2]
Definition: XProtocol.hh:792
kXR_char streamid[2]
Definition: XProtocol.hh:629
static const int kXR_ckpCommit
Definition: XProtocol.hh:213
kXR_char fhandle[4]
Definition: XProtocol.hh:204
ServerResponseHeader resphdr
Definition: XProtocol.hh:956
kXR_int64 offset
Definition: XProtocol.hh:661
XStatRequestOption
Definition: XProtocol.hh:762
@ kXR_vfs
Definition: XProtocol.hh:763
XMkdirOptions
Definition: XProtocol.hh:408
@ kXR_mkdirpath
Definition: XProtocol.hh:410
@ kXR_mknone
Definition: XProtocol.hh:409
XPrepRequestOption
Definition: XProtocol.hh:586
@ kXR_wmode
Definition: XProtocol.hh:591
@ kXR_evict
Definition: XProtocol.hh:596
@ kXR_usetcp
Definition: XProtocol.hh:594
@ kXR_cancel
Definition: XProtocol.hh:587
@ kXR_fresh
Definition: XProtocol.hh:593
@ kXR_notify
Definition: XProtocol.hh:588
@ kXR_coloc
Definition: XProtocol.hh:592
@ kXR_stage
Definition: XProtocol.hh:590
@ kXR_noerrs
Definition: XProtocol.hh:589
static const int kXR_ckpQuery
Definition: XProtocol.hh:214
#define EBADRQC
Definition: XProtocol.hh:1346
XSecFlags
Definition: XProtocol.hh:737
@ kXR_nodata
Definition: XProtocol.hh:738
kXR_unt16 expectrid
Definition: XProtocol.hh:749
kXR_char reserved[15]
Definition: XProtocol.hh:671
kXR_char streamid[2]
Definition: XProtocol.hh:257
kXR_int32 dlen
Definition: XProtocol.hh:722
kXR_unt16 requestid
Definition: XProtocol.hh:191
kXR_int64 offset
Definition: XProtocol.hh:808
XOpenRequestOption2
Definition: XProtocol.hh:472
@ kXR_dup
Definition: XProtocol.hh:473
@ kXR_samefs
Definition: XProtocol.hh:474
ServerResponseReqs_Protocol secreq
Definition: XProtocol.hh:1194
kXR_int32 dlen
Definition: XProtocol.hh:772
kXR_char options
Definition: XProtocol.hh:769
kXR_char capver[1]
Definition: XProtocol.hh:399
kXR_char streamid[2]
Definition: XProtocol.hh:600
kXR_int32 rlen
Definition: XProtocol.hh:647
kXR_unt16 requestid
Definition: XProtocol.hh:670
kXR_char modifier
Definition: XProtocol.hh:721
XOpenRequestMode
Definition: XProtocol.hh:439
@ kXR_gw
Definition: XProtocol.hh:444
@ kXR_ur
Definition: XProtocol.hh:440
@ kXR_uw
Definition: XProtocol.hh:441
@ kXR_gr
Definition: XProtocol.hh:443
@ kXR_ow
Definition: XProtocol.hh:447
@ kXR_gx
Definition: XProtocol.hh:445
@ kXR_or
Definition: XProtocol.hh:446
@ kXR_ox
Definition: XProtocol.hh:448
@ kXR_ux
Definition: XProtocol.hh:442
kXR_char reserved[11]
Definition: XProtocol.hh:205
kXR_char streamid[2]
Definition: XProtocol.hh:669
XStatRespFlags
Definition: XProtocol.hh:1218
@ kXR_readable
Definition: XProtocol.hh:1224
@ kXR_file
Definition: XProtocol.hh:1219
@ kXR_isDir
Definition: XProtocol.hh:1221
@ kXR_offline
Definition: XProtocol.hh:1223
@ kXR_bkpexist
Definition: XProtocol.hh:1227
@ kXR_other
Definition: XProtocol.hh:1222
@ kXR_poscpend
Definition: XProtocol.hh:1226
@ kXR_writable
Definition: XProtocol.hh:1225
@ kXR_xset
Definition: XProtocol.hh:1220
XQueryType
Definition: XProtocol.hh:614
@ kXR_QPrep
Definition: XProtocol.hh:616
@ kXR_Qopaqug
Definition: XProtocol.hh:625
@ kXR_Qconfig
Definition: XProtocol.hh:621
@ kXR_Qopaquf
Definition: XProtocol.hh:624
@ kXR_Qckscan
Definition: XProtocol.hh:620
@ kXR_Qxattr
Definition: XProtocol.hh:618
@ kXR_Qspace
Definition: XProtocol.hh:619
@ kXR_Qvisa
Definition: XProtocol.hh:622
@ kXR_QStats
Definition: XProtocol.hh:615
@ kXR_Qcksum
Definition: XProtocol.hh:617
@ kXR_Qopaque
Definition: XProtocol.hh:623
kXR_int32 dlen
Definition: XProtocol.hh:548
XLoginVersion
Definition: XProtocol.hh:383
@ kXR_ver005
Definition: XProtocol.hh:389
@ kXR_ver001
Definition: XProtocol.hh:385
@ kXR_ver003
Definition: XProtocol.hh:387
@ kXR_ver000
Definition: XProtocol.hh:384
@ kXR_ver004
Definition: XProtocol.hh:388
@ kXR_ver002
Definition: XProtocol.hh:386
kXR_int32 msgval
Definition: XProtocol.hh:96
kXR_char reserved[12]
Definition: XProtocol.hh:482
XLoginAbility
Definition: XProtocol.hh:356
@ kXR_readrdok
Definition: XProtocol.hh:360
@ kXR_fullurl
Definition: XProtocol.hh:358
@ kXR_onlyprv4
Definition: XProtocol.hh:362
@ kXR_lclfile
Definition: XProtocol.hh:364
@ kXR_multipr
Definition: XProtocol.hh:359
@ kXR_nothing
Definition: XProtocol.hh:357
@ kXR_redirflags
Definition: XProtocol.hh:365
@ kXR_hasipv64
Definition: XProtocol.hh:361
@ kXR_onlyprv6
Definition: XProtocol.hh:363
kXR_int32 dlen
Definition: XProtocol.hh:159
kXR_char streamid[2]
Definition: XProtocol.hh:707
kXR_char reserved[13]
Definition: XProtocol.hh:417
kXR_unt16 requestid
Definition: XProtocol.hh:708
kXR_char streamid[2]
Definition: XProtocol.hh:190
XSecCrypto
Definition: XProtocol.hh:730
@ kXR_SHA256
Definition: XProtocol.hh:731
@ kXR_HashMask
Definition: XProtocol.hh:732
@ kXR_rsaKey
Definition: XProtocol.hh:733
kXR_char reserved[16]
Definition: XProtocol.hh:547
ServerResponseHeader hdr
Definition: XProtocol.hh:1287
kXR_int32 second
Definition: XProtocol.hh:85
kXR_char streamid[2]
Definition: XProtocol.hh:478
kXR_char reserved[16]
Definition: XProtocol.hh:709
static const int kXR_ckpBegin
Definition: XProtocol.hh:212
kXR_char reserved[15]
Definition: XProtocol.hh:720
unsigned long long kXR_unt64
Definition: XPtypes.hh:99
long long kXR_int64
Definition: XPtypes.hh:98
int kXR_int32
Definition: XPtypes.hh:89
unsigned int kXR_unt32
Definition: XPtypes.hh:90
short kXR_int16
Definition: XPtypes.hh:66
unsigned short kXR_unt16
Definition: XPtypes.hh:67
unsigned char kXR_char
Definition: XPtypes.hh:65
static void prepare()
int truncate(const char *path, off_t offset)
int stat(const char *path, struct stat *buf)
int open(const char *path, int oflag,...)
int mkdir(const char *path, mode_t mode)
ssize_t readv(int fildes, const struct iovec *iov, int iovcnt)
ssize_t write(int fildes, const void *buf, size_t nbyte)
int rmdir(const char *path)
ssize_t writev(int fildes, const struct iovec *iov, int iovcnt)
ssize_t read(int fildes, void *buf, size_t nbyte)
#define close(a)
Definition: XrdPosix.hh:43
void xerr(int x)
static int toErrno(int xerr)
Definition: XProtocol.hh:1408
@ kNOMORESTREAMS
Definition: XProtocol.hh:1484
kXR_int32 ServerResponseType
Definition: XProtocol.hh:1488
static const char * reqName(kXR_unt16 reqCode)
Definition: XProtocol.cc:151
static const char * errName(kXR_int32 errCode)
Definition: XProtocol.cc:130
static int mapError(int rc)
Definition: XProtocol.hh:1361
static const int kXR_pgUnitSZ
Definition: XProtocol.hh:496
static const int kXR_statusBodyLen
Definition: XProtocol.hh:1256
static const int kXR_pgPageSZ
Definition: XProtocol.hh:494
static const int wlItemLen
Definition: XProtocol.hh:836
kXR_char fhandle[4]
Definition: XProtocol.hh:832
@ kXR_ProgressInfo
Definition: XProtocol.hh:1251
@ kXR_PartialResult
Definition: XProtocol.hh:1250
@ kXR_FinalResult
Definition: XProtocol.hh:1249
static const int maxRvecln
Definition: XProtocol.hh:685
static const int maxRVdsz
Definition: XProtocol.hh:688
struct ServerResponseBifs_Protocol bifReqs
Definition: XProtocol.hh:1120
static const int maxRvecsz
Definition: XProtocol.hh:686
static const int minRVbsz
Definition: XProtocol.hh:687
static const kXR_char kXR_AnyPath
Definition: XProtocol.hh:502
static const int kXR_pgMaxEpr
Definition: XProtocol.hh:497
struct ServerResponseReqs_Protocol secReqs
Definition: XProtocol.hh:1121
static const int maxWvecsz
Definition: XProtocol.hh:838
static const int maxWvecln
Definition: XProtocol.hh:837
kXR_char fhandle[4]
Definition: XProtocol.hh:680
static const int kXR_pgPageBL
Definition: XProtocol.hh:495
static const int kXR_pgMaxEos
Definition: XProtocol.hh:498
static const int rlItemLen
Definition: XProtocol.hh:684
static const int kXR_pgRetry
Definition: XProtocol.hh:503
static char * VVecInsert(const char *value, char *buffer)
Definition: XProtocol.cc:188
static const int aData
Definition: XProtocol.hh:298
static const int isNew
Definition: XProtocol.hh:297
static char * NVecRead(char *buffer, kXR_unt16 &rc)
Definition: XProtocol.cc:205
kXR_char fhandle[4]
Definition: XProtocol.hh:288
kXR_char reserved[9]
Definition: XProtocol.hh:292
kXR_char streamid[2]
Definition: XProtocol.hh:286
static char * VVecRead(char *buffer, kXR_int32 &len)
Definition: XProtocol.cc:224
kXR_unt16 requestid
Definition: XProtocol.hh:287
static char * NVecInsert(const char *name, char *buffer)
Definition: XProtocol.cc:172
kXR_char reserved[10]
Definition: XProtocol.hh:561
kXR_char streamid[2]
Definition: XProtocol.hh:556
kXR_char streamid[2]
Definition: XProtocol.hh:819
kXR_char reserved[15]
Definition: XProtocol.hh:822
kXR_unt16 requestid
Definition: XProtocol.hh:820
static const kXR_int32 doSync
Definition: XProtocol.hh:826