1*aa693e99SJason King /* 2*aa693e99SJason King * Copyright 2016 Jakub Klama <jceel@FreeBSD.org> 3*aa693e99SJason King * All rights reserved 4*aa693e99SJason King * 5*aa693e99SJason King * Redistribution and use in source and binary forms, with or without 6*aa693e99SJason King * modification, are permitted providing that the following conditions 7*aa693e99SJason King * are met: 8*aa693e99SJason King * 1. Redistributions of source code must retain the above copyright 9*aa693e99SJason King * notice, this list of conditions and the following disclaimer. 10*aa693e99SJason King * 2. Redistributions in binary form must reproduce the above copyright 11*aa693e99SJason King * notice, this list of conditions and the following disclaimer in the 12*aa693e99SJason King * documentation and/or other materials provided with the distribution. 13*aa693e99SJason King * 14*aa693e99SJason King * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15*aa693e99SJason King * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16*aa693e99SJason King * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*aa693e99SJason King * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 18*aa693e99SJason King * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*aa693e99SJason King * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*aa693e99SJason King * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*aa693e99SJason King * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 22*aa693e99SJason King * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 23*aa693e99SJason King * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24*aa693e99SJason King * POSSIBILITY OF SUCH DAMAGE. 25*aa693e99SJason King * 26*aa693e99SJason King */ 27*aa693e99SJason King 28*aa693e99SJason King /* 29*aa693e99SJason King * Based on libixp code: ©2007-2010 Kris Maglione <maglione.k at Gmail> 30*aa693e99SJason King */ 31*aa693e99SJason King 32*aa693e99SJason King #ifndef LIB9P_FCALL_H 33*aa693e99SJason King #define LIB9P_FCALL_H 34*aa693e99SJason King 35*aa693e99SJason King #include <stdint.h> 36*aa693e99SJason King 37*aa693e99SJason King #define L9P_MAX_WELEM 256 38*aa693e99SJason King 39*aa693e99SJason King /* 40*aa693e99SJason King * Function call/reply (Tfoo/Rfoo) numbers. 41*aa693e99SJason King * 42*aa693e99SJason King * These are protocol code numbers, so the exact values 43*aa693e99SJason King * matter. However, __FIRST and __LAST_PLUS_ONE are for 44*aa693e99SJason King * debug code, and just need to encompass the entire range. 45*aa693e99SJason King * 46*aa693e99SJason King * Note that we rely (in the debug code) on Rfoo == Tfoo+1. 47*aa693e99SJason King */ 48*aa693e99SJason King enum l9p_ftype { 49*aa693e99SJason King L9P__FIRST = 6, /* NB: must be <= all legal values */ 50*aa693e99SJason King L9P_TLERROR = 6, /* illegal; exists for parity with Rlerror */ 51*aa693e99SJason King L9P_RLERROR, 52*aa693e99SJason King L9P_TSTATFS = 8, 53*aa693e99SJason King L9P_RSTATFS, 54*aa693e99SJason King L9P_TLOPEN = 12, 55*aa693e99SJason King L9P_RLOPEN, 56*aa693e99SJason King L9P_TLCREATE = 14, 57*aa693e99SJason King L9P_RLCREATE, 58*aa693e99SJason King L9P_TSYMLINK = 16, 59*aa693e99SJason King L9P_RSYMLINK, 60*aa693e99SJason King L9P_TMKNOD = 18, 61*aa693e99SJason King L9P_RMKNOD, 62*aa693e99SJason King L9P_TRENAME = 20, 63*aa693e99SJason King L9P_RRENAME, 64*aa693e99SJason King L9P_TREADLINK = 22, 65*aa693e99SJason King L9P_RREADLINK, 66*aa693e99SJason King L9P_TGETATTR = 24, 67*aa693e99SJason King L9P_RGETATTR, 68*aa693e99SJason King L9P_TSETATTR = 26, 69*aa693e99SJason King L9P_RSETATTR, 70*aa693e99SJason King L9P_TXATTRWALK = 30, 71*aa693e99SJason King L9P_RXATTRWALK, 72*aa693e99SJason King L9P_TXATTRCREATE = 32, 73*aa693e99SJason King L9P_RXATTRCREATE, 74*aa693e99SJason King L9P_TREADDIR = 40, 75*aa693e99SJason King L9P_RREADDIR, 76*aa693e99SJason King L9P_TFSYNC = 50, 77*aa693e99SJason King L9P_RFSYNC, 78*aa693e99SJason King L9P_TLOCK = 52, 79*aa693e99SJason King L9P_RLOCK, 80*aa693e99SJason King L9P_TGETLOCK = 54, 81*aa693e99SJason King L9P_RGETLOCK, 82*aa693e99SJason King L9P_TLINK = 70, 83*aa693e99SJason King L9P_RLINK, 84*aa693e99SJason King L9P_TMKDIR = 72, 85*aa693e99SJason King L9P_RMKDIR, 86*aa693e99SJason King L9P_TRENAMEAT = 74, 87*aa693e99SJason King L9P_RRENAMEAT, 88*aa693e99SJason King L9P_TUNLINKAT = 76, 89*aa693e99SJason King L9P_RUNLINKAT, 90*aa693e99SJason King L9P_TVERSION = 100, 91*aa693e99SJason King L9P_RVERSION, 92*aa693e99SJason King L9P_TAUTH = 102, 93*aa693e99SJason King L9P_RAUTH, 94*aa693e99SJason King L9P_TATTACH = 104, 95*aa693e99SJason King L9P_RATTACH, 96*aa693e99SJason King L9P_TERROR = 106, /* illegal */ 97*aa693e99SJason King L9P_RERROR, 98*aa693e99SJason King L9P_TFLUSH = 108, 99*aa693e99SJason King L9P_RFLUSH, 100*aa693e99SJason King L9P_TWALK = 110, 101*aa693e99SJason King L9P_RWALK, 102*aa693e99SJason King L9P_TOPEN = 112, 103*aa693e99SJason King L9P_ROPEN, 104*aa693e99SJason King L9P_TCREATE = 114, 105*aa693e99SJason King L9P_RCREATE, 106*aa693e99SJason King L9P_TREAD = 116, 107*aa693e99SJason King L9P_RREAD, 108*aa693e99SJason King L9P_TWRITE = 118, 109*aa693e99SJason King L9P_RWRITE, 110*aa693e99SJason King L9P_TCLUNK = 120, 111*aa693e99SJason King L9P_RCLUNK, 112*aa693e99SJason King L9P_TREMOVE = 122, 113*aa693e99SJason King L9P_RREMOVE, 114*aa693e99SJason King L9P_TSTAT = 124, 115*aa693e99SJason King L9P_RSTAT, 116*aa693e99SJason King L9P_TWSTAT = 126, 117*aa693e99SJason King L9P_RWSTAT, 118*aa693e99SJason King L9P__LAST_PLUS_1, /* NB: must be last */ 119*aa693e99SJason King }; 120*aa693e99SJason King 121*aa693e99SJason King /* 122*aa693e99SJason King * When a Tfoo request comes over the wire, we decode it 123*aa693e99SJason King * (pack.c) from wire format into a request laid out in 124*aa693e99SJason King * a "union l9p_fcall" object. This object is not in wire 125*aa693e99SJason King * format, but rather in something more convenient for us 126*aa693e99SJason King * to operate on. 127*aa693e99SJason King * 128*aa693e99SJason King * We then dispatch the request (request.c, backend/fs.c) and 129*aa693e99SJason King * use another "union l9p_fcall" object to build a reply. 130*aa693e99SJason King * The reply is converted to wire format on the way back out 131*aa693e99SJason King * (pack.c again). 132*aa693e99SJason King * 133*aa693e99SJason King * All sub-objects start with a header containing the request 134*aa693e99SJason King * or reply type code and two-byte tag, and whether or not it 135*aa693e99SJason King * is needed, a four-byte fid. 136*aa693e99SJason King * 137*aa693e99SJason King * What this means here is that the data structures within 138*aa693e99SJason King * the union can be shared across various requests and replies. 139*aa693e99SJason King * For instance, replies to OPEN, CREATE, LCREATE, LOPEN, MKDIR, and 140*aa693e99SJason King * SYMLINK are all fairly similar (providing a qid and sometimes 141*aa693e99SJason King * an iounit) and hence can all use the l9p_f_ropen structure. 142*aa693e99SJason King * Which structures are used for which operations is somewhat 143*aa693e99SJason King * arbitrary; for programming ease, if an operation shares a 144*aa693e99SJason King * data structure, it still has its own name: there are union 145*aa693e99SJason King * members named ropen, rcreate, rlcreate, rlopen, rmkdir, and 146*aa693e99SJason King * rsymlink, even though all use struct l9p_f_ropen. 147*aa693e99SJason King * 148*aa693e99SJason King * The big exception to the above rule is struct l9p_f_io, which 149*aa693e99SJason King * is used as both request and reply for all of READ, WRITE, and 150*aa693e99SJason King * READDIR. Moreover, the READDIR reply must be pre-packed into 151*aa693e99SJason King * wire format (it is handled like raw data a la READ). 152*aa693e99SJason King * 153*aa693e99SJason King * Some request messages (e.g., TREADLINK) fit in a header, having 154*aa693e99SJason King * just type code, tag, and fid. These have no separate data 155*aa693e99SJason King * structure, nor union member name. Similarly, some reply 156*aa693e99SJason King * messages (e.g., RCLUNK, RREMOVE, RRENAME) have just the type 157*aa693e99SJason King * code and tag. 158*aa693e99SJason King */ 159*aa693e99SJason King 160*aa693e99SJason King /* 161*aa693e99SJason King * Type code bits in (the first byte of) a qid. 162*aa693e99SJason King */ 163*aa693e99SJason King enum l9p_qid_type { 164*aa693e99SJason King L9P_QTDIR = 0x80, /* type bit for directories */ 165*aa693e99SJason King L9P_QTAPPEND = 0x40, /* type bit for append only files */ 166*aa693e99SJason King L9P_QTEXCL = 0x20, /* type bit for exclusive use files */ 167*aa693e99SJason King L9P_QTMOUNT = 0x10, /* type bit for mounted channel */ 168*aa693e99SJason King L9P_QTAUTH = 0x08, /* type bit for authentication file */ 169*aa693e99SJason King L9P_QTTMP = 0x04, /* type bit for non-backed-up file */ 170*aa693e99SJason King L9P_QTSYMLINK = 0x02, /* type bit for symbolic link */ 171*aa693e99SJason King L9P_QTFILE = 0x00 /* type bits for plain file */ 172*aa693e99SJason King }; 173*aa693e99SJason King 174*aa693e99SJason King /* 175*aa693e99SJason King * Extra permission bits in create and file modes (stat). 176*aa693e99SJason King */ 177*aa693e99SJason King #define L9P_DMDIR 0x80000000 178*aa693e99SJason King enum { 179*aa693e99SJason King L9P_DMAPPEND = 0x40000000, 180*aa693e99SJason King L9P_DMEXCL = 0x20000000, 181*aa693e99SJason King L9P_DMMOUNT = 0x10000000, 182*aa693e99SJason King L9P_DMAUTH = 0x08000000, 183*aa693e99SJason King L9P_DMTMP = 0x04000000, 184*aa693e99SJason King L9P_DMSYMLINK = 0x02000000, 185*aa693e99SJason King /* 9P2000.u extensions */ 186*aa693e99SJason King L9P_DMDEVICE = 0x00800000, 187*aa693e99SJason King L9P_DMNAMEDPIPE = 0x00200000, 188*aa693e99SJason King L9P_DMSOCKET = 0x00100000, 189*aa693e99SJason King L9P_DMSETUID = 0x00080000, 190*aa693e99SJason King L9P_DMSETGID = 0x00040000, 191*aa693e99SJason King }; 192*aa693e99SJason King 193*aa693e99SJason King /* 194*aa693e99SJason King * Open/create mode bits in 9P2000 and 9P2000.u operations 195*aa693e99SJason King * (not Linux lopen and lcreate flags, which are different). 196*aa693e99SJason King * Note that the mode field is only one byte wide. 197*aa693e99SJason King */ 198*aa693e99SJason King enum l9p_omode { 199*aa693e99SJason King L9P_OREAD = 0, /* open for read */ 200*aa693e99SJason King L9P_OWRITE = 1, /* write */ 201*aa693e99SJason King L9P_ORDWR = 2, /* read and write */ 202*aa693e99SJason King L9P_OEXEC = 3, /* execute, == read but check execute permission */ 203*aa693e99SJason King L9P_OACCMODE = 3, /* mask for the above access-mode bits */ 204*aa693e99SJason King L9P_OTRUNC = 16, /* or'ed in (except for exec), truncate file first */ 205*aa693e99SJason King L9P_OCEXEC = 32, /* or'ed in, close on exec */ 206*aa693e99SJason King L9P_ORCLOSE = 64, /* or'ed in, remove on close */ 207*aa693e99SJason King L9P_ODIRECT = 128, /* or'ed in, direct access */ 208*aa693e99SJason King }; 209*aa693e99SJason King 210*aa693e99SJason King /* 211*aa693e99SJason King * Flag bits in 9P2000.L operations (Tlopen, Tlcreate). These are 212*aa693e99SJason King * basically just the Linux L_* flags. The bottom 3 bits are the 213*aa693e99SJason King * same as for l9p_omode, although open-for-exec is not used: 214*aa693e99SJason King * instead, the client does a Tgetattr and checks the mode for 215*aa693e99SJason King * execute bits, then just opens for reading. 216*aa693e99SJason King * 217*aa693e99SJason King * Each L_O_xxx is just value O_xxx has on Linux in <fcntl.h>; 218*aa693e99SJason King * not all are necessarily used. From observation, we do get 219*aa693e99SJason King * L_O_CREAT and L_O_EXCL when creating with exclusive, and always 220*aa693e99SJason King * get L_O_LARGEFILE. We do get L_O_APPEND when opening for 221*aa693e99SJason King * append. We also get both L_O_DIRECT and L_O_DIRECTORY set 222*aa693e99SJason King * when opening directories. 223*aa693e99SJason King * 224*aa693e99SJason King * We probably never get L_O_NOCTTY which makes no sense, and 225*aa693e99SJason King * some of the other options may need to be handled on the client. 226*aa693e99SJason King */ 227*aa693e99SJason King enum l9p_l_o_flags { 228*aa693e99SJason King L9P_L_O_CREAT = 000000100U, 229*aa693e99SJason King L9P_L_O_EXCL = 000000200U, 230*aa693e99SJason King L9P_L_O_NOCTTY = 000000400U, 231*aa693e99SJason King L9P_L_O_TRUNC = 000001000U, 232*aa693e99SJason King L9P_L_O_APPEND = 000002000U, 233*aa693e99SJason King L9P_L_O_NONBLOCK = 000004000U, 234*aa693e99SJason King L9P_L_O_DSYNC = 000010000U, 235*aa693e99SJason King L9P_L_O_FASYNC = 000020000U, 236*aa693e99SJason King L9P_L_O_DIRECT = 000040000U, 237*aa693e99SJason King L9P_L_O_LARGEFILE = 000100000U, 238*aa693e99SJason King L9P_L_O_DIRECTORY = 000200000U, 239*aa693e99SJason King L9P_L_O_NOFOLLOW = 000400000U, 240*aa693e99SJason King L9P_L_O_NOATIME = 001000000U, 241*aa693e99SJason King L9P_L_O_CLOEXEC = 002000000U, 242*aa693e99SJason King L9P_L_O_SYNC = 004000000U, 243*aa693e99SJason King L9P_L_O_PATH = 010000000U, 244*aa693e99SJason King L9P_L_O_TMPFILE = 020000000U, 245*aa693e99SJason King }; 246*aa693e99SJason King 247*aa693e99SJason King struct l9p_hdr { 248*aa693e99SJason King uint8_t type; 249*aa693e99SJason King uint16_t tag; 250*aa693e99SJason King uint32_t fid; 251*aa693e99SJason King }; 252*aa693e99SJason King 253*aa693e99SJason King struct l9p_qid { 254*aa693e99SJason King uint8_t type; 255*aa693e99SJason King uint32_t version; 256*aa693e99SJason King uint64_t path; 257*aa693e99SJason King }; 258*aa693e99SJason King 259*aa693e99SJason King struct l9p_stat { 260*aa693e99SJason King uint16_t type; 261*aa693e99SJason King uint32_t dev; 262*aa693e99SJason King struct l9p_qid qid; 263*aa693e99SJason King uint32_t mode; 264*aa693e99SJason King uint32_t atime; 265*aa693e99SJason King uint32_t mtime; 266*aa693e99SJason King uint64_t length; 267*aa693e99SJason King char *name; 268*aa693e99SJason King char *uid; 269*aa693e99SJason King char *gid; 270*aa693e99SJason King char *muid; 271*aa693e99SJason King char *extension; 272*aa693e99SJason King uint32_t n_uid; 273*aa693e99SJason King uint32_t n_gid; 274*aa693e99SJason King uint32_t n_muid; 275*aa693e99SJason King }; 276*aa693e99SJason King 277*aa693e99SJason King #define L9P_FSTYPE 0x01021997 278*aa693e99SJason King 279*aa693e99SJason King struct l9p_statfs { 280*aa693e99SJason King uint32_t type; /* file system type */ 281*aa693e99SJason King uint32_t bsize; /* block size for I/O */ 282*aa693e99SJason King uint64_t blocks; /* file system size (bsize-byte blocks) */ 283*aa693e99SJason King uint64_t bfree; /* free blocks in fs */ 284*aa693e99SJason King uint64_t bavail; /* free blocks avail to non-superuser*/ 285*aa693e99SJason King uint64_t files; /* file nodes in file system (# inodes) */ 286*aa693e99SJason King uint64_t ffree; /* free file nodes in fs */ 287*aa693e99SJason King uint64_t fsid; /* file system identifier */ 288*aa693e99SJason King uint32_t namelen; /* maximum length of filenames */ 289*aa693e99SJason King }; 290*aa693e99SJason King 291*aa693e99SJason King struct l9p_f_version { 292*aa693e99SJason King struct l9p_hdr hdr; 293*aa693e99SJason King uint32_t msize; 294*aa693e99SJason King char *version; 295*aa693e99SJason King }; 296*aa693e99SJason King 297*aa693e99SJason King struct l9p_f_tflush { 298*aa693e99SJason King struct l9p_hdr hdr; 299*aa693e99SJason King uint16_t oldtag; 300*aa693e99SJason King }; 301*aa693e99SJason King 302*aa693e99SJason King struct l9p_f_error { 303*aa693e99SJason King struct l9p_hdr hdr; 304*aa693e99SJason King char *ename; 305*aa693e99SJason King uint32_t errnum; 306*aa693e99SJason King }; 307*aa693e99SJason King 308*aa693e99SJason King struct l9p_f_ropen { 309*aa693e99SJason King struct l9p_hdr hdr; 310*aa693e99SJason King struct l9p_qid qid; 311*aa693e99SJason King uint32_t iounit; 312*aa693e99SJason King }; 313*aa693e99SJason King 314*aa693e99SJason King struct l9p_f_rauth { 315*aa693e99SJason King struct l9p_hdr hdr; 316*aa693e99SJason King struct l9p_qid aqid; 317*aa693e99SJason King }; 318*aa693e99SJason King 319*aa693e99SJason King struct l9p_f_attach { 320*aa693e99SJason King struct l9p_hdr hdr; 321*aa693e99SJason King uint32_t afid; 322*aa693e99SJason King char *uname; 323*aa693e99SJason King char *aname; 324*aa693e99SJason King uint32_t n_uname; 325*aa693e99SJason King }; 326*aa693e99SJason King #define L9P_NOFID ((uint32_t)-1) /* in Tattach, no auth fid */ 327*aa693e99SJason King #define L9P_NONUNAME ((uint32_t)-1) /* in Tattach, no n_uname */ 328*aa693e99SJason King 329*aa693e99SJason King struct l9p_f_tcreate { 330*aa693e99SJason King struct l9p_hdr hdr; 331*aa693e99SJason King uint32_t perm; 332*aa693e99SJason King char *name; 333*aa693e99SJason King uint8_t mode; /* +Topen */ 334*aa693e99SJason King char *extension; 335*aa693e99SJason King }; 336*aa693e99SJason King 337*aa693e99SJason King struct l9p_f_twalk { 338*aa693e99SJason King struct l9p_hdr hdr; 339*aa693e99SJason King uint32_t newfid; 340*aa693e99SJason King uint16_t nwname; 341*aa693e99SJason King char *wname[L9P_MAX_WELEM]; 342*aa693e99SJason King }; 343*aa693e99SJason King 344*aa693e99SJason King struct l9p_f_rwalk { 345*aa693e99SJason King struct l9p_hdr hdr; 346*aa693e99SJason King uint16_t nwqid; 347*aa693e99SJason King struct l9p_qid wqid[L9P_MAX_WELEM]; 348*aa693e99SJason King }; 349*aa693e99SJason King 350*aa693e99SJason King struct l9p_f_io { 351*aa693e99SJason King struct l9p_hdr hdr; 352*aa693e99SJason King uint64_t offset; /* Tread, Twrite, Treaddir */ 353*aa693e99SJason King uint32_t count; /* Tread, Twrite, Rread, Treaddir, Rreaddir */ 354*aa693e99SJason King }; 355*aa693e99SJason King 356*aa693e99SJason King struct l9p_f_rstat { 357*aa693e99SJason King struct l9p_hdr hdr; 358*aa693e99SJason King struct l9p_stat stat; 359*aa693e99SJason King }; 360*aa693e99SJason King 361*aa693e99SJason King struct l9p_f_twstat { 362*aa693e99SJason King struct l9p_hdr hdr; 363*aa693e99SJason King struct l9p_stat stat; 364*aa693e99SJason King }; 365*aa693e99SJason King 366*aa693e99SJason King struct l9p_f_rstatfs { 367*aa693e99SJason King struct l9p_hdr hdr; 368*aa693e99SJason King struct l9p_statfs statfs; 369*aa693e99SJason King }; 370*aa693e99SJason King 371*aa693e99SJason King /* Used for Tlcreate, Tlopen, Tmkdir, Tunlinkat. */ 372*aa693e99SJason King struct l9p_f_tlcreate { 373*aa693e99SJason King struct l9p_hdr hdr; 374*aa693e99SJason King char *name; /* Tlcreate, Tmkdir, Tunlinkat */ 375*aa693e99SJason King uint32_t flags; /* Tlcreate, Tlopen, Tmkdir, Tunlinkat */ 376*aa693e99SJason King uint32_t mode; /* Tlcreate, Tmkdir */ 377*aa693e99SJason King uint32_t gid; /* Tlcreate, Tmkdir */ 378*aa693e99SJason King }; 379*aa693e99SJason King 380*aa693e99SJason King struct l9p_f_tsymlink { 381*aa693e99SJason King struct l9p_hdr hdr; 382*aa693e99SJason King char *name; 383*aa693e99SJason King char *symtgt; 384*aa693e99SJason King uint32_t gid; 385*aa693e99SJason King }; 386*aa693e99SJason King 387*aa693e99SJason King struct l9p_f_tmknod { 388*aa693e99SJason King struct l9p_hdr hdr; 389*aa693e99SJason King char *name; 390*aa693e99SJason King uint32_t mode; 391*aa693e99SJason King uint32_t major; 392*aa693e99SJason King uint32_t minor; 393*aa693e99SJason King uint32_t gid; 394*aa693e99SJason King }; 395*aa693e99SJason King 396*aa693e99SJason King struct l9p_f_trename { 397*aa693e99SJason King struct l9p_hdr hdr; 398*aa693e99SJason King uint32_t dfid; 399*aa693e99SJason King char *name; 400*aa693e99SJason King }; 401*aa693e99SJason King 402*aa693e99SJason King struct l9p_f_rreadlink { 403*aa693e99SJason King struct l9p_hdr hdr; 404*aa693e99SJason King char *target; 405*aa693e99SJason King }; 406*aa693e99SJason King 407*aa693e99SJason King struct l9p_f_tgetattr { 408*aa693e99SJason King struct l9p_hdr hdr; 409*aa693e99SJason King uint64_t request_mask; 410*aa693e99SJason King }; 411*aa693e99SJason King 412*aa693e99SJason King struct l9p_f_rgetattr { 413*aa693e99SJason King struct l9p_hdr hdr; 414*aa693e99SJason King uint64_t valid; 415*aa693e99SJason King struct l9p_qid qid; 416*aa693e99SJason King uint32_t mode; 417*aa693e99SJason King uint32_t uid; 418*aa693e99SJason King uint32_t gid; 419*aa693e99SJason King uint64_t nlink; 420*aa693e99SJason King uint64_t rdev; 421*aa693e99SJason King uint64_t size; 422*aa693e99SJason King uint64_t blksize; 423*aa693e99SJason King uint64_t blocks; 424*aa693e99SJason King uint64_t atime_sec; 425*aa693e99SJason King uint64_t atime_nsec; 426*aa693e99SJason King uint64_t mtime_sec; 427*aa693e99SJason King uint64_t mtime_nsec; 428*aa693e99SJason King uint64_t ctime_sec; 429*aa693e99SJason King uint64_t ctime_nsec; 430*aa693e99SJason King uint64_t btime_sec; 431*aa693e99SJason King uint64_t btime_nsec; 432*aa693e99SJason King uint64_t gen; 433*aa693e99SJason King uint64_t data_version; 434*aa693e99SJason King }; 435*aa693e99SJason King 436*aa693e99SJason King /* Fields in req->request_mask and reply->valid for Tgetattr, Rgetattr. */ 437*aa693e99SJason King enum l9pl_getattr_flags { 438*aa693e99SJason King L9PL_GETATTR_MODE = 0x00000001, 439*aa693e99SJason King L9PL_GETATTR_NLINK = 0x00000002, 440*aa693e99SJason King L9PL_GETATTR_UID = 0x00000004, 441*aa693e99SJason King L9PL_GETATTR_GID = 0x00000008, 442*aa693e99SJason King L9PL_GETATTR_RDEV = 0x00000010, 443*aa693e99SJason King L9PL_GETATTR_ATIME = 0x00000020, 444*aa693e99SJason King L9PL_GETATTR_MTIME = 0x00000040, 445*aa693e99SJason King L9PL_GETATTR_CTIME = 0x00000080, 446*aa693e99SJason King L9PL_GETATTR_INO = 0x00000100, 447*aa693e99SJason King L9PL_GETATTR_SIZE = 0x00000200, 448*aa693e99SJason King L9PL_GETATTR_BLOCKS = 0x00000400, 449*aa693e99SJason King /* everything up to and including BLOCKS is BASIC */ 450*aa693e99SJason King L9PL_GETATTR_BASIC = L9PL_GETATTR_MODE | 451*aa693e99SJason King L9PL_GETATTR_NLINK | 452*aa693e99SJason King L9PL_GETATTR_UID | 453*aa693e99SJason King L9PL_GETATTR_GID | 454*aa693e99SJason King L9PL_GETATTR_RDEV | 455*aa693e99SJason King L9PL_GETATTR_ATIME | 456*aa693e99SJason King L9PL_GETATTR_MTIME | 457*aa693e99SJason King L9PL_GETATTR_CTIME | 458*aa693e99SJason King L9PL_GETATTR_INO | 459*aa693e99SJason King L9PL_GETATTR_SIZE | 460*aa693e99SJason King L9PL_GETATTR_BLOCKS, 461*aa693e99SJason King L9PL_GETATTR_BTIME = 0x00000800, 462*aa693e99SJason King L9PL_GETATTR_GEN = 0x00001000, 463*aa693e99SJason King L9PL_GETATTR_DATA_VERSION = 0x00002000, 464*aa693e99SJason King /* BASIC + birthtime + gen + data-version = ALL */ 465*aa693e99SJason King L9PL_GETATTR_ALL = L9PL_GETATTR_BASIC | 466*aa693e99SJason King L9PL_GETATTR_BTIME | 467*aa693e99SJason King L9PL_GETATTR_GEN | 468*aa693e99SJason King L9PL_GETATTR_DATA_VERSION, 469*aa693e99SJason King }; 470*aa693e99SJason King 471*aa693e99SJason King struct l9p_f_tsetattr { 472*aa693e99SJason King struct l9p_hdr hdr; 473*aa693e99SJason King uint32_t valid; 474*aa693e99SJason King uint32_t mode; 475*aa693e99SJason King uint32_t uid; 476*aa693e99SJason King uint32_t gid; 477*aa693e99SJason King uint64_t size; 478*aa693e99SJason King uint64_t atime_sec; /* if valid & L9PL_SETATTR_ATIME_SET */ 479*aa693e99SJason King uint64_t atime_nsec; /* (else use on-server time) */ 480*aa693e99SJason King uint64_t mtime_sec; /* if valid & L9PL_SETATTR_MTIME_SET */ 481*aa693e99SJason King uint64_t mtime_nsec; /* (else use on-server time) */ 482*aa693e99SJason King }; 483*aa693e99SJason King 484*aa693e99SJason King /* Fields in req->valid for Tsetattr. */ 485*aa693e99SJason King enum l9pl_setattr_flags { 486*aa693e99SJason King L9PL_SETATTR_MODE = 0x00000001, 487*aa693e99SJason King L9PL_SETATTR_UID = 0x00000002, 488*aa693e99SJason King L9PL_SETATTR_GID = 0x00000004, 489*aa693e99SJason King L9PL_SETATTR_SIZE = 0x00000008, 490*aa693e99SJason King L9PL_SETATTR_ATIME = 0x00000010, 491*aa693e99SJason King L9PL_SETATTR_MTIME = 0x00000020, 492*aa693e99SJason King L9PL_SETATTR_CTIME = 0x00000040, 493*aa693e99SJason King L9PL_SETATTR_ATIME_SET = 0x00000080, 494*aa693e99SJason King L9PL_SETATTR_MTIME_SET = 0x00000100, 495*aa693e99SJason King }; 496*aa693e99SJason King 497*aa693e99SJason King struct l9p_f_txattrwalk { 498*aa693e99SJason King struct l9p_hdr hdr; 499*aa693e99SJason King uint32_t newfid; 500*aa693e99SJason King char *name; 501*aa693e99SJason King }; 502*aa693e99SJason King 503*aa693e99SJason King struct l9p_f_rxattrwalk { 504*aa693e99SJason King struct l9p_hdr hdr; 505*aa693e99SJason King uint64_t size; 506*aa693e99SJason King }; 507*aa693e99SJason King 508*aa693e99SJason King struct l9p_f_txattrcreate { 509*aa693e99SJason King struct l9p_hdr hdr; 510*aa693e99SJason King char *name; 511*aa693e99SJason King uint64_t attr_size; 512*aa693e99SJason King uint32_t flags; 513*aa693e99SJason King }; 514*aa693e99SJason King 515*aa693e99SJason King struct l9p_f_tlock { 516*aa693e99SJason King struct l9p_hdr hdr; 517*aa693e99SJason King uint8_t type; /* from l9pl_lock_type */ 518*aa693e99SJason King uint32_t flags; /* from l9pl_lock_flags */ 519*aa693e99SJason King uint64_t start; 520*aa693e99SJason King uint64_t length; 521*aa693e99SJason King uint32_t proc_id; 522*aa693e99SJason King char *client_id; 523*aa693e99SJason King }; 524*aa693e99SJason King 525*aa693e99SJason King enum l9pl_lock_type { 526*aa693e99SJason King L9PL_LOCK_TYPE_RDLOCK = 0, 527*aa693e99SJason King L9PL_LOCK_TYPE_WRLOCK = 1, 528*aa693e99SJason King L9PL_LOCK_TYPE_UNLOCK = 2, 529*aa693e99SJason King }; 530*aa693e99SJason King 531*aa693e99SJason King enum l9pl_lock_flags { 532*aa693e99SJason King L9PL_LOCK_TYPE_BLOCK = 1, 533*aa693e99SJason King L9PL_LOCK_TYPE_RECLAIM = 2, 534*aa693e99SJason King }; 535*aa693e99SJason King 536*aa693e99SJason King struct l9p_f_rlock { 537*aa693e99SJason King struct l9p_hdr hdr; 538*aa693e99SJason King uint8_t status; /* from l9pl_lock_status */ 539*aa693e99SJason King }; 540*aa693e99SJason King 541*aa693e99SJason King enum l9pl_lock_status { 542*aa693e99SJason King L9PL_LOCK_SUCCESS = 0, 543*aa693e99SJason King L9PL_LOCK_BLOCKED = 1, 544*aa693e99SJason King L9PL_LOCK_ERROR = 2, 545*aa693e99SJason King L9PL_LOCK_GRACE = 3, 546*aa693e99SJason King }; 547*aa693e99SJason King 548*aa693e99SJason King struct l9p_f_getlock { 549*aa693e99SJason King struct l9p_hdr hdr; 550*aa693e99SJason King uint8_t type; /* from l9pl_lock_type */ 551*aa693e99SJason King uint64_t start; 552*aa693e99SJason King uint64_t length; 553*aa693e99SJason King uint32_t proc_id; 554*aa693e99SJason King char *client_id; 555*aa693e99SJason King }; 556*aa693e99SJason King 557*aa693e99SJason King struct l9p_f_tlink { 558*aa693e99SJason King struct l9p_hdr hdr; 559*aa693e99SJason King uint32_t dfid; 560*aa693e99SJason King char *name; 561*aa693e99SJason King }; 562*aa693e99SJason King 563*aa693e99SJason King struct l9p_f_trenameat { 564*aa693e99SJason King struct l9p_hdr hdr; 565*aa693e99SJason King char *oldname; 566*aa693e99SJason King uint32_t newdirfid; 567*aa693e99SJason King char *newname; 568*aa693e99SJason King }; 569*aa693e99SJason King 570*aa693e99SJason King /* 571*aa693e99SJason King * Flags in Tunlinkat (which re-uses f_tlcreate data structure but 572*aa693e99SJason King * with different meaning). 573*aa693e99SJason King */ 574*aa693e99SJason King enum l9p_l_unlinkat_flags { 575*aa693e99SJason King /* not sure if any other AT_* flags are passed through */ 576*aa693e99SJason King L9PL_AT_REMOVEDIR = 0x0200, 577*aa693e99SJason King }; 578*aa693e99SJason King 579*aa693e99SJason King union l9p_fcall { 580*aa693e99SJason King struct l9p_hdr hdr; 581*aa693e99SJason King struct l9p_f_version version; 582*aa693e99SJason King struct l9p_f_tflush tflush; 583*aa693e99SJason King struct l9p_f_ropen ropen; 584*aa693e99SJason King struct l9p_f_ropen rcreate; 585*aa693e99SJason King struct l9p_f_ropen rattach; 586*aa693e99SJason King struct l9p_f_error error; 587*aa693e99SJason King struct l9p_f_rauth rauth; 588*aa693e99SJason King struct l9p_f_attach tattach; 589*aa693e99SJason King struct l9p_f_attach tauth; 590*aa693e99SJason King struct l9p_f_tcreate tcreate; 591*aa693e99SJason King struct l9p_f_tcreate topen; 592*aa693e99SJason King struct l9p_f_twalk twalk; 593*aa693e99SJason King struct l9p_f_rwalk rwalk; 594*aa693e99SJason King struct l9p_f_twstat twstat; 595*aa693e99SJason King struct l9p_f_rstat rstat; 596*aa693e99SJason King struct l9p_f_rstatfs rstatfs; 597*aa693e99SJason King struct l9p_f_tlcreate tlopen; 598*aa693e99SJason King struct l9p_f_ropen rlopen; 599*aa693e99SJason King struct l9p_f_tlcreate tlcreate; 600*aa693e99SJason King struct l9p_f_ropen rlcreate; 601*aa693e99SJason King struct l9p_f_tsymlink tsymlink; 602*aa693e99SJason King struct l9p_f_ropen rsymlink; 603*aa693e99SJason King struct l9p_f_tmknod tmknod; 604*aa693e99SJason King struct l9p_f_ropen rmknod; 605*aa693e99SJason King struct l9p_f_trename trename; 606*aa693e99SJason King struct l9p_f_rreadlink rreadlink; 607*aa693e99SJason King struct l9p_f_tgetattr tgetattr; 608*aa693e99SJason King struct l9p_f_rgetattr rgetattr; 609*aa693e99SJason King struct l9p_f_tsetattr tsetattr; 610*aa693e99SJason King struct l9p_f_txattrwalk txattrwalk; 611*aa693e99SJason King struct l9p_f_rxattrwalk rxattrwalk; 612*aa693e99SJason King struct l9p_f_txattrcreate txattrcreate; 613*aa693e99SJason King struct l9p_f_tlock tlock; 614*aa693e99SJason King struct l9p_f_rlock rlock; 615*aa693e99SJason King struct l9p_f_getlock getlock; 616*aa693e99SJason King struct l9p_f_tlink tlink; 617*aa693e99SJason King struct l9p_f_tlcreate tmkdir; 618*aa693e99SJason King struct l9p_f_ropen rmkdir; 619*aa693e99SJason King struct l9p_f_trenameat trenameat; 620*aa693e99SJason King struct l9p_f_tlcreate tunlinkat; 621*aa693e99SJason King struct l9p_f_io io; 622*aa693e99SJason King }; 623*aa693e99SJason King 624*aa693e99SJason King #endif /* LIB9P_FCALL_H */ 625