1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * These structs are used by the system-use-sharing protocol, in which the 4*4882a593Smuzhiyun * Rock Ridge extensions are embedded. It is quite possible that other 5*4882a593Smuzhiyun * extensions are present on the disk, and this is fine as long as they 6*4882a593Smuzhiyun * all use SUSP 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct SU_SP_s { 10*4882a593Smuzhiyun __u8 magic[2]; 11*4882a593Smuzhiyun __u8 skip; 12*4882a593Smuzhiyun } __attribute__ ((packed)); 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct SU_CE_s { 15*4882a593Smuzhiyun __u8 extent[8]; 16*4882a593Smuzhiyun __u8 offset[8]; 17*4882a593Smuzhiyun __u8 size[8]; 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct SU_ER_s { 21*4882a593Smuzhiyun __u8 len_id; 22*4882a593Smuzhiyun __u8 len_des; 23*4882a593Smuzhiyun __u8 len_src; 24*4882a593Smuzhiyun __u8 ext_ver; 25*4882a593Smuzhiyun __u8 data[]; 26*4882a593Smuzhiyun } __attribute__ ((packed)); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct RR_RR_s { 29*4882a593Smuzhiyun __u8 flags[1]; 30*4882a593Smuzhiyun } __attribute__ ((packed)); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct RR_PX_s { 33*4882a593Smuzhiyun __u8 mode[8]; 34*4882a593Smuzhiyun __u8 n_links[8]; 35*4882a593Smuzhiyun __u8 uid[8]; 36*4882a593Smuzhiyun __u8 gid[8]; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct RR_PN_s { 40*4882a593Smuzhiyun __u8 dev_high[8]; 41*4882a593Smuzhiyun __u8 dev_low[8]; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct SL_component { 45*4882a593Smuzhiyun __u8 flags; 46*4882a593Smuzhiyun __u8 len; 47*4882a593Smuzhiyun __u8 text[]; 48*4882a593Smuzhiyun } __attribute__ ((packed)); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct RR_SL_s { 51*4882a593Smuzhiyun __u8 flags; 52*4882a593Smuzhiyun struct SL_component link; 53*4882a593Smuzhiyun } __attribute__ ((packed)); 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct RR_NM_s { 56*4882a593Smuzhiyun __u8 flags; 57*4882a593Smuzhiyun char name[]; 58*4882a593Smuzhiyun } __attribute__ ((packed)); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct RR_CL_s { 61*4882a593Smuzhiyun __u8 location[8]; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct RR_PL_s { 65*4882a593Smuzhiyun __u8 location[8]; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct stamp { 69*4882a593Smuzhiyun __u8 time[7]; /* actually 6 unsigned, 1 signed */ 70*4882a593Smuzhiyun } __attribute__ ((packed)); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun struct RR_TF_s { 73*4882a593Smuzhiyun __u8 flags; 74*4882a593Smuzhiyun struct stamp times[]; /* Variable number of these beasts */ 75*4882a593Smuzhiyun } __attribute__ ((packed)); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* Linux-specific extension for transparent decompression */ 78*4882a593Smuzhiyun struct RR_ZF_s { 79*4882a593Smuzhiyun __u8 algorithm[2]; 80*4882a593Smuzhiyun __u8 parms[2]; 81*4882a593Smuzhiyun __u8 real_size[8]; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* 85*4882a593Smuzhiyun * These are the bits and their meanings for flags in the TF structure. 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun #define TF_CREATE 1 88*4882a593Smuzhiyun #define TF_MODIFY 2 89*4882a593Smuzhiyun #define TF_ACCESS 4 90*4882a593Smuzhiyun #define TF_ATTRIBUTES 8 91*4882a593Smuzhiyun #define TF_BACKUP 16 92*4882a593Smuzhiyun #define TF_EXPIRATION 32 93*4882a593Smuzhiyun #define TF_EFFECTIVE 64 94*4882a593Smuzhiyun #define TF_LONG_FORM 128 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct rock_ridge { 97*4882a593Smuzhiyun __u8 signature[2]; 98*4882a593Smuzhiyun __u8 len; 99*4882a593Smuzhiyun __u8 version; 100*4882a593Smuzhiyun union { 101*4882a593Smuzhiyun struct SU_SP_s SP; 102*4882a593Smuzhiyun struct SU_CE_s CE; 103*4882a593Smuzhiyun struct SU_ER_s ER; 104*4882a593Smuzhiyun struct RR_RR_s RR; 105*4882a593Smuzhiyun struct RR_PX_s PX; 106*4882a593Smuzhiyun struct RR_PN_s PN; 107*4882a593Smuzhiyun struct RR_SL_s SL; 108*4882a593Smuzhiyun struct RR_NM_s NM; 109*4882a593Smuzhiyun struct RR_CL_s CL; 110*4882a593Smuzhiyun struct RR_PL_s PL; 111*4882a593Smuzhiyun struct RR_TF_s TF; 112*4882a593Smuzhiyun struct RR_ZF_s ZF; 113*4882a593Smuzhiyun } u; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define RR_PX 1 /* POSIX attributes */ 117*4882a593Smuzhiyun #define RR_PN 2 /* POSIX devices */ 118*4882a593Smuzhiyun #define RR_SL 4 /* Symbolic link */ 119*4882a593Smuzhiyun #define RR_NM 8 /* Alternate Name */ 120*4882a593Smuzhiyun #define RR_CL 16 /* Child link */ 121*4882a593Smuzhiyun #define RR_PL 32 /* Parent link */ 122*4882a593Smuzhiyun #define RR_RE 64 /* Relocation directory */ 123*4882a593Smuzhiyun #define RR_TF 128 /* Timestamps */ 124