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