1*fe8e6c1cSAndre Przywara /* 2*fe8e6c1cSAndre Przywara * include/net/9p/9p.h 3*fe8e6c1cSAndre Przywara * 4*fe8e6c1cSAndre Przywara * 9P protocol definitions. 5*fe8e6c1cSAndre Przywara * 6*fe8e6c1cSAndre Przywara * Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net> 7*fe8e6c1cSAndre Przywara * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> 8*fe8e6c1cSAndre Przywara * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> 9*fe8e6c1cSAndre Przywara * 10*fe8e6c1cSAndre Przywara * This program is free software; you can redistribute it and/or modify 11*fe8e6c1cSAndre Przywara * it under the terms of the GNU General Public License version 2 12*fe8e6c1cSAndre Przywara * as published by the Free Software Foundation. 13*fe8e6c1cSAndre Przywara * 14*fe8e6c1cSAndre Przywara * This program is distributed in the hope that it will be useful, 15*fe8e6c1cSAndre Przywara * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*fe8e6c1cSAndre Przywara * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*fe8e6c1cSAndre Przywara * GNU General Public License for more details. 18*fe8e6c1cSAndre Przywara * 19*fe8e6c1cSAndre Przywara * You should have received a copy of the GNU General Public License 20*fe8e6c1cSAndre Przywara * along with this program; if not, write to: 21*fe8e6c1cSAndre Przywara * Free Software Foundation 22*fe8e6c1cSAndre Przywara * 51 Franklin Street, Fifth Floor 23*fe8e6c1cSAndre Przywara * Boston, MA 02111-1301 USA 24*fe8e6c1cSAndre Przywara * 25*fe8e6c1cSAndre Przywara */ 26*fe8e6c1cSAndre Przywara 27*fe8e6c1cSAndre Przywara #ifndef NET_9P_H 28*fe8e6c1cSAndre Przywara #define NET_9P_H 29*fe8e6c1cSAndre Przywara 30*fe8e6c1cSAndre Przywara /** 31*fe8e6c1cSAndre Przywara * enum p9_debug_flags - bits for mount time debug parameter 32*fe8e6c1cSAndre Przywara * @P9_DEBUG_ERROR: more verbose error messages including original error string 33*fe8e6c1cSAndre Przywara * @P9_DEBUG_9P: 9P protocol tracing 34*fe8e6c1cSAndre Przywara * @P9_DEBUG_VFS: VFS API tracing 35*fe8e6c1cSAndre Przywara * @P9_DEBUG_CONV: protocol conversion tracing 36*fe8e6c1cSAndre Przywara * @P9_DEBUG_MUX: trace management of concurrent transactions 37*fe8e6c1cSAndre Przywara * @P9_DEBUG_TRANS: transport tracing 38*fe8e6c1cSAndre Przywara * @P9_DEBUG_SLABS: memory management tracing 39*fe8e6c1cSAndre Przywara * @P9_DEBUG_FCALL: verbose dump of protocol messages 40*fe8e6c1cSAndre Przywara * @P9_DEBUG_FID: fid allocation/deallocation tracking 41*fe8e6c1cSAndre Przywara * @P9_DEBUG_PKT: packet marshalling/unmarshalling 42*fe8e6c1cSAndre Przywara * @P9_DEBUG_FSC: FS-cache tracing 43*fe8e6c1cSAndre Przywara * @P9_DEBUG_VPKT: Verbose packet debugging (full packet dump) 44*fe8e6c1cSAndre Przywara * 45*fe8e6c1cSAndre Przywara * These flags are passed at mount time to turn on various levels of 46*fe8e6c1cSAndre Przywara * verbosity and tracing which will be output to the system logs. 47*fe8e6c1cSAndre Przywara */ 48*fe8e6c1cSAndre Przywara 49*fe8e6c1cSAndre Przywara enum p9_debug_flags { 50*fe8e6c1cSAndre Przywara P9_DEBUG_ERROR = (1<<0), 51*fe8e6c1cSAndre Przywara P9_DEBUG_9P = (1<<2), 52*fe8e6c1cSAndre Przywara P9_DEBUG_VFS = (1<<3), 53*fe8e6c1cSAndre Przywara P9_DEBUG_CONV = (1<<4), 54*fe8e6c1cSAndre Przywara P9_DEBUG_MUX = (1<<5), 55*fe8e6c1cSAndre Przywara P9_DEBUG_TRANS = (1<<6), 56*fe8e6c1cSAndre Przywara P9_DEBUG_SLABS = (1<<7), 57*fe8e6c1cSAndre Przywara P9_DEBUG_FCALL = (1<<8), 58*fe8e6c1cSAndre Przywara P9_DEBUG_FID = (1<<9), 59*fe8e6c1cSAndre Przywara P9_DEBUG_PKT = (1<<10), 60*fe8e6c1cSAndre Przywara P9_DEBUG_FSC = (1<<11), 61*fe8e6c1cSAndre Przywara P9_DEBUG_VPKT = (1<<12), 62*fe8e6c1cSAndre Przywara }; 63*fe8e6c1cSAndre Przywara 64*fe8e6c1cSAndre Przywara #ifdef CONFIG_NET_9P_DEBUG 65*fe8e6c1cSAndre Przywara extern unsigned int p9_debug_level; 66*fe8e6c1cSAndre Przywara __printf(3, 4) 67*fe8e6c1cSAndre Przywara void _p9_debug(enum p9_debug_flags level, const char *func, 68*fe8e6c1cSAndre Przywara const char *fmt, ...); 69*fe8e6c1cSAndre Przywara #define p9_debug(level, fmt, ...) \ 70*fe8e6c1cSAndre Przywara _p9_debug(level, __func__, fmt, ##__VA_ARGS__) 71*fe8e6c1cSAndre Przywara #else 72*fe8e6c1cSAndre Przywara #define p9_debug(level, fmt, ...) \ 73*fe8e6c1cSAndre Przywara no_printk(fmt, ##__VA_ARGS__) 74*fe8e6c1cSAndre Przywara #endif 75*fe8e6c1cSAndre Przywara 76*fe8e6c1cSAndre Przywara /** 77*fe8e6c1cSAndre Przywara * enum p9_msg_t - 9P message types 78*fe8e6c1cSAndre Przywara * @P9_TLERROR: not used 79*fe8e6c1cSAndre Przywara * @P9_RLERROR: response for any failed request for 9P2000.L 80*fe8e6c1cSAndre Przywara * @P9_TSTATFS: file system status request 81*fe8e6c1cSAndre Przywara * @P9_RSTATFS: file system status response 82*fe8e6c1cSAndre Przywara * @P9_TSYMLINK: make symlink request 83*fe8e6c1cSAndre Przywara * @P9_RSYMLINK: make symlink response 84*fe8e6c1cSAndre Przywara * @P9_TMKNOD: create a special file object request 85*fe8e6c1cSAndre Przywara * @P9_RMKNOD: create a special file object response 86*fe8e6c1cSAndre Przywara * @P9_TLCREATE: prepare a handle for I/O on an new file for 9P2000.L 87*fe8e6c1cSAndre Przywara * @P9_RLCREATE: response with file access information for 9P2000.L 88*fe8e6c1cSAndre Przywara * @P9_TRENAME: rename request 89*fe8e6c1cSAndre Przywara * @P9_RRENAME: rename response 90*fe8e6c1cSAndre Przywara * @P9_TMKDIR: create a directory request 91*fe8e6c1cSAndre Przywara * @P9_RMKDIR: create a directory response 92*fe8e6c1cSAndre Przywara * @P9_TVERSION: version handshake request 93*fe8e6c1cSAndre Przywara * @P9_RVERSION: version handshake response 94*fe8e6c1cSAndre Przywara * @P9_TAUTH: request to establish authentication channel 95*fe8e6c1cSAndre Przywara * @P9_RAUTH: response with authentication information 96*fe8e6c1cSAndre Przywara * @P9_TATTACH: establish user access to file service 97*fe8e6c1cSAndre Przywara * @P9_RATTACH: response with top level handle to file hierarchy 98*fe8e6c1cSAndre Przywara * @P9_TERROR: not used 99*fe8e6c1cSAndre Przywara * @P9_RERROR: response for any failed request 100*fe8e6c1cSAndre Przywara * @P9_TFLUSH: request to abort a previous request 101*fe8e6c1cSAndre Przywara * @P9_RFLUSH: response when previous request has been cancelled 102*fe8e6c1cSAndre Przywara * @P9_TWALK: descend a directory hierarchy 103*fe8e6c1cSAndre Przywara * @P9_RWALK: response with new handle for position within hierarchy 104*fe8e6c1cSAndre Przywara * @P9_TOPEN: prepare a handle for I/O on an existing file 105*fe8e6c1cSAndre Przywara * @P9_ROPEN: response with file access information 106*fe8e6c1cSAndre Przywara * @P9_TCREATE: prepare a handle for I/O on a new file 107*fe8e6c1cSAndre Przywara * @P9_RCREATE: response with file access information 108*fe8e6c1cSAndre Przywara * @P9_TREAD: request to transfer data from a file or directory 109*fe8e6c1cSAndre Przywara * @P9_RREAD: response with data requested 110*fe8e6c1cSAndre Przywara * @P9_TWRITE: reuqest to transfer data to a file 111*fe8e6c1cSAndre Przywara * @P9_RWRITE: response with out much data was transferred to file 112*fe8e6c1cSAndre Przywara * @P9_TCLUNK: forget about a handle to an entity within the file system 113*fe8e6c1cSAndre Przywara * @P9_RCLUNK: response when server has forgotten about the handle 114*fe8e6c1cSAndre Przywara * @P9_TREMOVE: request to remove an entity from the hierarchy 115*fe8e6c1cSAndre Przywara * @P9_RREMOVE: response when server has removed the entity 116*fe8e6c1cSAndre Przywara * @P9_TSTAT: request file entity attributes 117*fe8e6c1cSAndre Przywara * @P9_RSTAT: response with file entity attributes 118*fe8e6c1cSAndre Przywara * @P9_TWSTAT: request to update file entity attributes 119*fe8e6c1cSAndre Przywara * @P9_RWSTAT: response when file entity attributes are updated 120*fe8e6c1cSAndre Przywara * 121*fe8e6c1cSAndre Przywara * There are 14 basic operations in 9P2000, paired as 122*fe8e6c1cSAndre Przywara * requests and responses. The one special case is ERROR 123*fe8e6c1cSAndre Przywara * as there is no @P9_TERROR request for clients to transmit to 124*fe8e6c1cSAndre Przywara * the server, but the server may respond to any other request 125*fe8e6c1cSAndre Przywara * with an @P9_RERROR. 126*fe8e6c1cSAndre Przywara * 127*fe8e6c1cSAndre Przywara * See Also: http://plan9.bell-labs.com/sys/man/5/INDEX.html 128*fe8e6c1cSAndre Przywara */ 129*fe8e6c1cSAndre Przywara 130*fe8e6c1cSAndre Przywara enum p9_msg_t { 131*fe8e6c1cSAndre Przywara P9_TLERROR = 6, 132*fe8e6c1cSAndre Przywara P9_RLERROR, 133*fe8e6c1cSAndre Przywara P9_TSTATFS = 8, 134*fe8e6c1cSAndre Przywara P9_RSTATFS, 135*fe8e6c1cSAndre Przywara P9_TLOPEN = 12, 136*fe8e6c1cSAndre Przywara P9_RLOPEN, 137*fe8e6c1cSAndre Przywara P9_TLCREATE = 14, 138*fe8e6c1cSAndre Przywara P9_RLCREATE, 139*fe8e6c1cSAndre Przywara P9_TSYMLINK = 16, 140*fe8e6c1cSAndre Przywara P9_RSYMLINK, 141*fe8e6c1cSAndre Przywara P9_TMKNOD = 18, 142*fe8e6c1cSAndre Przywara P9_RMKNOD, 143*fe8e6c1cSAndre Przywara P9_TRENAME = 20, 144*fe8e6c1cSAndre Przywara P9_RRENAME, 145*fe8e6c1cSAndre Przywara P9_TREADLINK = 22, 146*fe8e6c1cSAndre Przywara P9_RREADLINK, 147*fe8e6c1cSAndre Przywara P9_TGETATTR = 24, 148*fe8e6c1cSAndre Przywara P9_RGETATTR, 149*fe8e6c1cSAndre Przywara P9_TSETATTR = 26, 150*fe8e6c1cSAndre Przywara P9_RSETATTR, 151*fe8e6c1cSAndre Przywara P9_TXATTRWALK = 30, 152*fe8e6c1cSAndre Przywara P9_RXATTRWALK, 153*fe8e6c1cSAndre Przywara P9_TXATTRCREATE = 32, 154*fe8e6c1cSAndre Przywara P9_RXATTRCREATE, 155*fe8e6c1cSAndre Przywara P9_TREADDIR = 40, 156*fe8e6c1cSAndre Przywara P9_RREADDIR, 157*fe8e6c1cSAndre Przywara P9_TFSYNC = 50, 158*fe8e6c1cSAndre Przywara P9_RFSYNC, 159*fe8e6c1cSAndre Przywara P9_TLOCK = 52, 160*fe8e6c1cSAndre Przywara P9_RLOCK, 161*fe8e6c1cSAndre Przywara P9_TGETLOCK = 54, 162*fe8e6c1cSAndre Przywara P9_RGETLOCK, 163*fe8e6c1cSAndre Przywara P9_TLINK = 70, 164*fe8e6c1cSAndre Przywara P9_RLINK, 165*fe8e6c1cSAndre Przywara P9_TMKDIR = 72, 166*fe8e6c1cSAndre Przywara P9_RMKDIR, 167*fe8e6c1cSAndre Przywara P9_TRENAMEAT = 74, 168*fe8e6c1cSAndre Przywara P9_RRENAMEAT, 169*fe8e6c1cSAndre Przywara P9_TUNLINKAT = 76, 170*fe8e6c1cSAndre Przywara P9_RUNLINKAT, 171*fe8e6c1cSAndre Przywara P9_TVERSION = 100, 172*fe8e6c1cSAndre Przywara P9_RVERSION, 173*fe8e6c1cSAndre Przywara P9_TAUTH = 102, 174*fe8e6c1cSAndre Przywara P9_RAUTH, 175*fe8e6c1cSAndre Przywara P9_TATTACH = 104, 176*fe8e6c1cSAndre Przywara P9_RATTACH, 177*fe8e6c1cSAndre Przywara P9_TERROR = 106, 178*fe8e6c1cSAndre Przywara P9_RERROR, 179*fe8e6c1cSAndre Przywara P9_TFLUSH = 108, 180*fe8e6c1cSAndre Przywara P9_RFLUSH, 181*fe8e6c1cSAndre Przywara P9_TWALK = 110, 182*fe8e6c1cSAndre Przywara P9_RWALK, 183*fe8e6c1cSAndre Przywara P9_TOPEN = 112, 184*fe8e6c1cSAndre Przywara P9_ROPEN, 185*fe8e6c1cSAndre Przywara P9_TCREATE = 114, 186*fe8e6c1cSAndre Przywara P9_RCREATE, 187*fe8e6c1cSAndre Przywara P9_TREAD = 116, 188*fe8e6c1cSAndre Przywara P9_RREAD, 189*fe8e6c1cSAndre Przywara P9_TWRITE = 118, 190*fe8e6c1cSAndre Przywara P9_RWRITE, 191*fe8e6c1cSAndre Przywara P9_TCLUNK = 120, 192*fe8e6c1cSAndre Przywara P9_RCLUNK, 193*fe8e6c1cSAndre Przywara P9_TREMOVE = 122, 194*fe8e6c1cSAndre Przywara P9_RREMOVE, 195*fe8e6c1cSAndre Przywara P9_TSTAT = 124, 196*fe8e6c1cSAndre Przywara P9_RSTAT, 197*fe8e6c1cSAndre Przywara P9_TWSTAT = 126, 198*fe8e6c1cSAndre Przywara P9_RWSTAT, 199*fe8e6c1cSAndre Przywara }; 200*fe8e6c1cSAndre Przywara 201*fe8e6c1cSAndre Przywara /** 202*fe8e6c1cSAndre Przywara * enum p9_open_mode_t - 9P open modes 203*fe8e6c1cSAndre Przywara * @P9_OREAD: open file for reading only 204*fe8e6c1cSAndre Przywara * @P9_OWRITE: open file for writing only 205*fe8e6c1cSAndre Przywara * @P9_ORDWR: open file for reading or writing 206*fe8e6c1cSAndre Przywara * @P9_OEXEC: open file for execution 207*fe8e6c1cSAndre Przywara * @P9_OTRUNC: truncate file to zero-length before opening it 208*fe8e6c1cSAndre Przywara * @P9_OREXEC: close the file when an exec(2) system call is made 209*fe8e6c1cSAndre Przywara * @P9_ORCLOSE: remove the file when the file is closed 210*fe8e6c1cSAndre Przywara * @P9_OAPPEND: open the file and seek to the end 211*fe8e6c1cSAndre Przywara * @P9_OEXCL: only create a file, do not open it 212*fe8e6c1cSAndre Przywara * 213*fe8e6c1cSAndre Przywara * 9P open modes differ slightly from Posix standard modes. 214*fe8e6c1cSAndre Przywara * In particular, there are extra modes which specify different 215*fe8e6c1cSAndre Przywara * semantic behaviors than may be available on standard Posix 216*fe8e6c1cSAndre Przywara * systems. For example, @P9_OREXEC and @P9_ORCLOSE are modes that 217*fe8e6c1cSAndre Przywara * most likely will not be issued from the Linux VFS client, but may 218*fe8e6c1cSAndre Przywara * be supported by servers. 219*fe8e6c1cSAndre Przywara * 220*fe8e6c1cSAndre Przywara * See Also: http://plan9.bell-labs.com/magic/man2html/2/open 221*fe8e6c1cSAndre Przywara */ 222*fe8e6c1cSAndre Przywara 223*fe8e6c1cSAndre Przywara enum p9_open_mode_t { 224*fe8e6c1cSAndre Przywara P9_OREAD = 0x00, 225*fe8e6c1cSAndre Przywara P9_OWRITE = 0x01, 226*fe8e6c1cSAndre Przywara P9_ORDWR = 0x02, 227*fe8e6c1cSAndre Przywara P9_OEXEC = 0x03, 228*fe8e6c1cSAndre Przywara P9_OTRUNC = 0x10, 229*fe8e6c1cSAndre Przywara P9_OREXEC = 0x20, 230*fe8e6c1cSAndre Przywara P9_ORCLOSE = 0x40, 231*fe8e6c1cSAndre Przywara P9_OAPPEND = 0x80, 232*fe8e6c1cSAndre Przywara P9_OEXCL = 0x1000, 233*fe8e6c1cSAndre Przywara }; 234*fe8e6c1cSAndre Przywara 235*fe8e6c1cSAndre Przywara /** 236*fe8e6c1cSAndre Przywara * enum p9_perm_t - 9P permissions 237*fe8e6c1cSAndre Przywara * @P9_DMDIR: mode bit for directories 238*fe8e6c1cSAndre Przywara * @P9_DMAPPEND: mode bit for is append-only 239*fe8e6c1cSAndre Przywara * @P9_DMEXCL: mode bit for excluse use (only one open handle allowed) 240*fe8e6c1cSAndre Przywara * @P9_DMMOUNT: mode bit for mount points 241*fe8e6c1cSAndre Przywara * @P9_DMAUTH: mode bit for authentication file 242*fe8e6c1cSAndre Przywara * @P9_DMTMP: mode bit for non-backed-up files 243*fe8e6c1cSAndre Przywara * @P9_DMSYMLINK: mode bit for symbolic links (9P2000.u) 244*fe8e6c1cSAndre Przywara * @P9_DMLINK: mode bit for hard-link (9P2000.u) 245*fe8e6c1cSAndre Przywara * @P9_DMDEVICE: mode bit for device files (9P2000.u) 246*fe8e6c1cSAndre Przywara * @P9_DMNAMEDPIPE: mode bit for named pipe (9P2000.u) 247*fe8e6c1cSAndre Przywara * @P9_DMSOCKET: mode bit for socket (9P2000.u) 248*fe8e6c1cSAndre Przywara * @P9_DMSETUID: mode bit for setuid (9P2000.u) 249*fe8e6c1cSAndre Przywara * @P9_DMSETGID: mode bit for setgid (9P2000.u) 250*fe8e6c1cSAndre Przywara * @P9_DMSETVTX: mode bit for sticky bit (9P2000.u) 251*fe8e6c1cSAndre Przywara * 252*fe8e6c1cSAndre Przywara * 9P permissions differ slightly from Posix standard modes. 253*fe8e6c1cSAndre Przywara * 254*fe8e6c1cSAndre Przywara * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat 255*fe8e6c1cSAndre Przywara */ 256*fe8e6c1cSAndre Przywara enum p9_perm_t { 257*fe8e6c1cSAndre Przywara P9_DMDIR = 0x80000000, 258*fe8e6c1cSAndre Przywara P9_DMAPPEND = 0x40000000, 259*fe8e6c1cSAndre Przywara P9_DMEXCL = 0x20000000, 260*fe8e6c1cSAndre Przywara P9_DMMOUNT = 0x10000000, 261*fe8e6c1cSAndre Przywara P9_DMAUTH = 0x08000000, 262*fe8e6c1cSAndre Przywara P9_DMTMP = 0x04000000, 263*fe8e6c1cSAndre Przywara /* 9P2000.u extensions */ 264*fe8e6c1cSAndre Przywara P9_DMSYMLINK = 0x02000000, 265*fe8e6c1cSAndre Przywara P9_DMLINK = 0x01000000, 266*fe8e6c1cSAndre Przywara P9_DMDEVICE = 0x00800000, 267*fe8e6c1cSAndre Przywara P9_DMNAMEDPIPE = 0x00200000, 268*fe8e6c1cSAndre Przywara P9_DMSOCKET = 0x00100000, 269*fe8e6c1cSAndre Przywara P9_DMSETUID = 0x00080000, 270*fe8e6c1cSAndre Przywara P9_DMSETGID = 0x00040000, 271*fe8e6c1cSAndre Przywara P9_DMSETVTX = 0x00010000, 272*fe8e6c1cSAndre Przywara }; 273*fe8e6c1cSAndre Przywara 274*fe8e6c1cSAndre Przywara /* 9p2000.L open flags */ 275*fe8e6c1cSAndre Przywara #define P9_DOTL_RDONLY 00000000 276*fe8e6c1cSAndre Przywara #define P9_DOTL_WRONLY 00000001 277*fe8e6c1cSAndre Przywara #define P9_DOTL_RDWR 00000002 278*fe8e6c1cSAndre Przywara #define P9_DOTL_NOACCESS 00000003 279*fe8e6c1cSAndre Przywara #define P9_DOTL_CREATE 00000100 280*fe8e6c1cSAndre Przywara #define P9_DOTL_EXCL 00000200 281*fe8e6c1cSAndre Przywara #define P9_DOTL_NOCTTY 00000400 282*fe8e6c1cSAndre Przywara #define P9_DOTL_TRUNC 00001000 283*fe8e6c1cSAndre Przywara #define P9_DOTL_APPEND 00002000 284*fe8e6c1cSAndre Przywara #define P9_DOTL_NONBLOCK 00004000 285*fe8e6c1cSAndre Przywara #define P9_DOTL_DSYNC 00010000 286*fe8e6c1cSAndre Przywara #define P9_DOTL_FASYNC 00020000 287*fe8e6c1cSAndre Przywara #define P9_DOTL_DIRECT 00040000 288*fe8e6c1cSAndre Przywara #define P9_DOTL_LARGEFILE 00100000 289*fe8e6c1cSAndre Przywara #define P9_DOTL_DIRECTORY 00200000 290*fe8e6c1cSAndre Przywara #define P9_DOTL_NOFOLLOW 00400000 291*fe8e6c1cSAndre Przywara #define P9_DOTL_NOATIME 01000000 292*fe8e6c1cSAndre Przywara #define P9_DOTL_CLOEXEC 02000000 293*fe8e6c1cSAndre Przywara #define P9_DOTL_SYNC 04000000 294*fe8e6c1cSAndre Przywara 295*fe8e6c1cSAndre Przywara /* 9p2000.L at flags */ 296*fe8e6c1cSAndre Przywara #define P9_DOTL_AT_REMOVEDIR 0x200 297*fe8e6c1cSAndre Przywara 298*fe8e6c1cSAndre Przywara /* 9p2000.L lock type */ 299*fe8e6c1cSAndre Przywara #define P9_LOCK_TYPE_RDLCK 0 300*fe8e6c1cSAndre Przywara #define P9_LOCK_TYPE_WRLCK 1 301*fe8e6c1cSAndre Przywara #define P9_LOCK_TYPE_UNLCK 2 302*fe8e6c1cSAndre Przywara 303*fe8e6c1cSAndre Przywara /** 304*fe8e6c1cSAndre Przywara * enum p9_qid_t - QID types 305*fe8e6c1cSAndre Przywara * @P9_QTDIR: directory 306*fe8e6c1cSAndre Przywara * @P9_QTAPPEND: append-only 307*fe8e6c1cSAndre Przywara * @P9_QTEXCL: excluse use (only one open handle allowed) 308*fe8e6c1cSAndre Przywara * @P9_QTMOUNT: mount points 309*fe8e6c1cSAndre Przywara * @P9_QTAUTH: authentication file 310*fe8e6c1cSAndre Przywara * @P9_QTTMP: non-backed-up files 311*fe8e6c1cSAndre Przywara * @P9_QTSYMLINK: symbolic links (9P2000.u) 312*fe8e6c1cSAndre Przywara * @P9_QTLINK: hard-link (9P2000.u) 313*fe8e6c1cSAndre Przywara * @P9_QTFILE: normal files 314*fe8e6c1cSAndre Przywara * 315*fe8e6c1cSAndre Przywara * QID types are a subset of permissions - they are primarily 316*fe8e6c1cSAndre Przywara * used to differentiate semantics for a file system entity via 317*fe8e6c1cSAndre Przywara * a jump-table. Their value is also the most significant 16 bits 318*fe8e6c1cSAndre Przywara * of the permission_t 319*fe8e6c1cSAndre Przywara * 320*fe8e6c1cSAndre Przywara * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat 321*fe8e6c1cSAndre Przywara */ 322*fe8e6c1cSAndre Przywara enum p9_qid_t { 323*fe8e6c1cSAndre Przywara P9_QTDIR = 0x80, 324*fe8e6c1cSAndre Przywara P9_QTAPPEND = 0x40, 325*fe8e6c1cSAndre Przywara P9_QTEXCL = 0x20, 326*fe8e6c1cSAndre Przywara P9_QTMOUNT = 0x10, 327*fe8e6c1cSAndre Przywara P9_QTAUTH = 0x08, 328*fe8e6c1cSAndre Przywara P9_QTTMP = 0x04, 329*fe8e6c1cSAndre Przywara P9_QTSYMLINK = 0x02, 330*fe8e6c1cSAndre Przywara P9_QTLINK = 0x01, 331*fe8e6c1cSAndre Przywara P9_QTFILE = 0x00, 332*fe8e6c1cSAndre Przywara }; 333*fe8e6c1cSAndre Przywara 334*fe8e6c1cSAndre Przywara /* 9P Magic Numbers */ 335*fe8e6c1cSAndre Przywara #define P9_NOTAG (u16)(~0) 336*fe8e6c1cSAndre Przywara #define P9_NOFID (u32)(~0) 337*fe8e6c1cSAndre Przywara #define P9_MAXWELEM 16 338*fe8e6c1cSAndre Przywara 339*fe8e6c1cSAndre Przywara /* ample room for Twrite/Rread header */ 340*fe8e6c1cSAndre Przywara #define P9_IOHDRSZ 24 341*fe8e6c1cSAndre Przywara 342*fe8e6c1cSAndre Przywara /* Room for readdir header */ 343*fe8e6c1cSAndre Przywara #define P9_READDIRHDRSZ 24 344*fe8e6c1cSAndre Przywara 345*fe8e6c1cSAndre Przywara /* size of header for zero copy read/write */ 346*fe8e6c1cSAndre Przywara #define P9_ZC_HDR_SZ 4096 347*fe8e6c1cSAndre Przywara 348*fe8e6c1cSAndre Przywara /** 349*fe8e6c1cSAndre Przywara * struct p9_qid - file system entity information 350*fe8e6c1cSAndre Przywara * @type: 8-bit type &p9_qid_t 351*fe8e6c1cSAndre Przywara * @version: 16-bit monotonically incrementing version number 352*fe8e6c1cSAndre Przywara * @path: 64-bit per-server-unique ID for a file system element 353*fe8e6c1cSAndre Przywara * 354*fe8e6c1cSAndre Przywara * qids are identifiers used by 9P servers to track file system 355*fe8e6c1cSAndre Przywara * entities. The type is used to differentiate semantics for operations 356*fe8e6c1cSAndre Przywara * on the entity (ie. read means something different on a directory than 357*fe8e6c1cSAndre Przywara * on a file). The path provides a server unique index for an entity 358*fe8e6c1cSAndre Przywara * (roughly analogous to an inode number), while the version is updated 359*fe8e6c1cSAndre Przywara * every time a file is modified and can be used to maintain cache 360*fe8e6c1cSAndre Przywara * coherency between clients and serves. 361*fe8e6c1cSAndre Przywara * Servers will often differentiate purely synthetic entities by setting 362*fe8e6c1cSAndre Przywara * their version to 0, signaling that they should never be cached and 363*fe8e6c1cSAndre Przywara * should be accessed synchronously. 364*fe8e6c1cSAndre Przywara * 365*fe8e6c1cSAndre Przywara * See Also://plan9.bell-labs.com/magic/man2html/2/stat 366*fe8e6c1cSAndre Przywara */ 367*fe8e6c1cSAndre Przywara 368*fe8e6c1cSAndre Przywara struct p9_qid { 369*fe8e6c1cSAndre Przywara u8 type; 370*fe8e6c1cSAndre Przywara u32 version; 371*fe8e6c1cSAndre Przywara u64 path; 372*fe8e6c1cSAndre Przywara }; 373*fe8e6c1cSAndre Przywara 374*fe8e6c1cSAndre Przywara /** 375*fe8e6c1cSAndre Przywara * struct p9_wstat - file system metadata information 376*fe8e6c1cSAndre Przywara * @size: length prefix for this stat structure instance 377*fe8e6c1cSAndre Przywara * @type: the type of the server (equivalent to a major number) 378*fe8e6c1cSAndre Przywara * @dev: the sub-type of the server (equivalent to a minor number) 379*fe8e6c1cSAndre Przywara * @qid: unique id from the server of type &p9_qid 380*fe8e6c1cSAndre Przywara * @mode: Plan 9 format permissions of type &p9_perm_t 381*fe8e6c1cSAndre Przywara * @atime: Last access/read time 382*fe8e6c1cSAndre Przywara * @mtime: Last modify/write time 383*fe8e6c1cSAndre Przywara * @length: file length 384*fe8e6c1cSAndre Przywara * @name: last element of path (aka filename) 385*fe8e6c1cSAndre Przywara * @uid: owner name 386*fe8e6c1cSAndre Przywara * @gid: group owner 387*fe8e6c1cSAndre Przywara * @muid: last modifier 388*fe8e6c1cSAndre Przywara * @extension: area used to encode extended UNIX support 389*fe8e6c1cSAndre Przywara * @n_uid: numeric user id of owner (part of 9p2000.u extension) 390*fe8e6c1cSAndre Przywara * @n_gid: numeric group id (part of 9p2000.u extension) 391*fe8e6c1cSAndre Przywara * @n_muid: numeric user id of laster modifier (part of 9p2000.u extension) 392*fe8e6c1cSAndre Przywara * 393*fe8e6c1cSAndre Przywara * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat 394*fe8e6c1cSAndre Przywara */ 395*fe8e6c1cSAndre Przywara 396*fe8e6c1cSAndre Przywara struct p9_wstat { 397*fe8e6c1cSAndre Przywara u16 size; 398*fe8e6c1cSAndre Przywara u16 type; 399*fe8e6c1cSAndre Przywara u32 dev; 400*fe8e6c1cSAndre Przywara struct p9_qid qid; 401*fe8e6c1cSAndre Przywara u32 mode; 402*fe8e6c1cSAndre Przywara u32 atime; 403*fe8e6c1cSAndre Przywara u32 mtime; 404*fe8e6c1cSAndre Przywara u64 length; 405*fe8e6c1cSAndre Przywara char *name; 406*fe8e6c1cSAndre Przywara char *uid; 407*fe8e6c1cSAndre Przywara char *gid; 408*fe8e6c1cSAndre Przywara char *muid; 409*fe8e6c1cSAndre Przywara char *extension; /* 9p2000.u extensions */ 410*fe8e6c1cSAndre Przywara kuid_t n_uid; /* 9p2000.u extensions */ 411*fe8e6c1cSAndre Przywara kgid_t n_gid; /* 9p2000.u extensions */ 412*fe8e6c1cSAndre Przywara kuid_t n_muid; /* 9p2000.u extensions */ 413*fe8e6c1cSAndre Przywara }; 414*fe8e6c1cSAndre Przywara 415*fe8e6c1cSAndre Przywara struct p9_stat_dotl { 416*fe8e6c1cSAndre Przywara u64 st_result_mask; 417*fe8e6c1cSAndre Przywara struct p9_qid qid; 418*fe8e6c1cSAndre Przywara u32 st_mode; 419*fe8e6c1cSAndre Przywara kuid_t st_uid; 420*fe8e6c1cSAndre Przywara kgid_t st_gid; 421*fe8e6c1cSAndre Przywara u64 st_nlink; 422*fe8e6c1cSAndre Przywara u64 st_rdev; 423*fe8e6c1cSAndre Przywara u64 st_size; 424*fe8e6c1cSAndre Przywara u64 st_blksize; 425*fe8e6c1cSAndre Przywara u64 st_blocks; 426*fe8e6c1cSAndre Przywara u64 st_atime_sec; 427*fe8e6c1cSAndre Przywara u64 st_atime_nsec; 428*fe8e6c1cSAndre Przywara u64 st_mtime_sec; 429*fe8e6c1cSAndre Przywara u64 st_mtime_nsec; 430*fe8e6c1cSAndre Przywara u64 st_ctime_sec; 431*fe8e6c1cSAndre Przywara u64 st_ctime_nsec; 432*fe8e6c1cSAndre Przywara u64 st_btime_sec; 433*fe8e6c1cSAndre Przywara u64 st_btime_nsec; 434*fe8e6c1cSAndre Przywara u64 st_gen; 435*fe8e6c1cSAndre Przywara u64 st_data_version; 436*fe8e6c1cSAndre Przywara }; 437*fe8e6c1cSAndre Przywara 438*fe8e6c1cSAndre Przywara #define P9_STATS_MODE 0x00000001ULL 439*fe8e6c1cSAndre Przywara #define P9_STATS_NLINK 0x00000002ULL 440*fe8e6c1cSAndre Przywara #define P9_STATS_UID 0x00000004ULL 441*fe8e6c1cSAndre Przywara #define P9_STATS_GID 0x00000008ULL 442*fe8e6c1cSAndre Przywara #define P9_STATS_RDEV 0x00000010ULL 443*fe8e6c1cSAndre Przywara #define P9_STATS_ATIME 0x00000020ULL 444*fe8e6c1cSAndre Przywara #define P9_STATS_MTIME 0x00000040ULL 445*fe8e6c1cSAndre Przywara #define P9_STATS_CTIME 0x00000080ULL 446*fe8e6c1cSAndre Przywara #define P9_STATS_INO 0x00000100ULL 447*fe8e6c1cSAndre Przywara #define P9_STATS_SIZE 0x00000200ULL 448*fe8e6c1cSAndre Przywara #define P9_STATS_BLOCKS 0x00000400ULL 449*fe8e6c1cSAndre Przywara 450*fe8e6c1cSAndre Przywara #define P9_STATS_BTIME 0x00000800ULL 451*fe8e6c1cSAndre Przywara #define P9_STATS_GEN 0x00001000ULL 452*fe8e6c1cSAndre Przywara #define P9_STATS_DATA_VERSION 0x00002000ULL 453*fe8e6c1cSAndre Przywara 454*fe8e6c1cSAndre Przywara #define P9_STATS_BASIC 0x000007ffULL /* Mask for fields up to BLOCKS */ 455*fe8e6c1cSAndre Przywara #define P9_STATS_ALL 0x00003fffULL /* Mask for All fields above */ 456*fe8e6c1cSAndre Przywara 457*fe8e6c1cSAndre Przywara /** 458*fe8e6c1cSAndre Przywara * struct p9_iattr_dotl - P9 inode attribute for setattr 459*fe8e6c1cSAndre Przywara * @valid: bitfield specifying which fields are valid 460*fe8e6c1cSAndre Przywara * same as in struct iattr 461*fe8e6c1cSAndre Przywara * @mode: File permission bits 462*fe8e6c1cSAndre Przywara * @uid: user id of owner 463*fe8e6c1cSAndre Przywara * @gid: group id 464*fe8e6c1cSAndre Przywara * @size: File size 465*fe8e6c1cSAndre Przywara * @atime_sec: Last access time, seconds 466*fe8e6c1cSAndre Przywara * @atime_nsec: Last access time, nanoseconds 467*fe8e6c1cSAndre Przywara * @mtime_sec: Last modification time, seconds 468*fe8e6c1cSAndre Przywara * @mtime_nsec: Last modification time, nanoseconds 469*fe8e6c1cSAndre Przywara */ 470*fe8e6c1cSAndre Przywara 471*fe8e6c1cSAndre Przywara struct p9_iattr_dotl { 472*fe8e6c1cSAndre Przywara u32 valid; 473*fe8e6c1cSAndre Przywara u32 mode; 474*fe8e6c1cSAndre Przywara kuid_t uid; 475*fe8e6c1cSAndre Przywara kgid_t gid; 476*fe8e6c1cSAndre Przywara u64 size; 477*fe8e6c1cSAndre Przywara u64 atime_sec; 478*fe8e6c1cSAndre Przywara u64 atime_nsec; 479*fe8e6c1cSAndre Przywara u64 mtime_sec; 480*fe8e6c1cSAndre Przywara u64 mtime_nsec; 481*fe8e6c1cSAndre Przywara }; 482*fe8e6c1cSAndre Przywara 483*fe8e6c1cSAndre Przywara #define P9_LOCK_SUCCESS 0 484*fe8e6c1cSAndre Przywara #define P9_LOCK_BLOCKED 1 485*fe8e6c1cSAndre Przywara #define P9_LOCK_ERROR 2 486*fe8e6c1cSAndre Przywara #define P9_LOCK_GRACE 3 487*fe8e6c1cSAndre Przywara 488*fe8e6c1cSAndre Przywara #define P9_LOCK_FLAGS_BLOCK 1 489*fe8e6c1cSAndre Przywara #define P9_LOCK_FLAGS_RECLAIM 2 490*fe8e6c1cSAndre Przywara 491*fe8e6c1cSAndre Przywara /* struct p9_flock: POSIX lock structure 492*fe8e6c1cSAndre Przywara * @type - type of lock 493*fe8e6c1cSAndre Przywara * @flags - lock flags 494*fe8e6c1cSAndre Przywara * @start - starting offset of the lock 495*fe8e6c1cSAndre Przywara * @length - number of bytes 496*fe8e6c1cSAndre Przywara * @proc_id - process id which wants to take lock 497*fe8e6c1cSAndre Przywara * @client_id - client id 498*fe8e6c1cSAndre Przywara */ 499*fe8e6c1cSAndre Przywara 500*fe8e6c1cSAndre Przywara struct p9_flock { 501*fe8e6c1cSAndre Przywara u8 type; 502*fe8e6c1cSAndre Przywara u32 flags; 503*fe8e6c1cSAndre Przywara u64 start; 504*fe8e6c1cSAndre Przywara u64 length; 505*fe8e6c1cSAndre Przywara u32 proc_id; 506*fe8e6c1cSAndre Przywara char *client_id; 507*fe8e6c1cSAndre Przywara }; 508*fe8e6c1cSAndre Przywara 509*fe8e6c1cSAndre Przywara /* struct p9_getlock: getlock structure 510*fe8e6c1cSAndre Przywara * @type - type of lock 511*fe8e6c1cSAndre Przywara * @start - starting offset of the lock 512*fe8e6c1cSAndre Przywara * @length - number of bytes 513*fe8e6c1cSAndre Przywara * @proc_id - process id which wants to take lock 514*fe8e6c1cSAndre Przywara * @client_id - client id 515*fe8e6c1cSAndre Przywara */ 516*fe8e6c1cSAndre Przywara 517*fe8e6c1cSAndre Przywara struct p9_getlock { 518*fe8e6c1cSAndre Przywara u8 type; 519*fe8e6c1cSAndre Przywara u64 start; 520*fe8e6c1cSAndre Przywara u64 length; 521*fe8e6c1cSAndre Przywara u32 proc_id; 522*fe8e6c1cSAndre Przywara char *client_id; 523*fe8e6c1cSAndre Przywara }; 524*fe8e6c1cSAndre Przywara 525*fe8e6c1cSAndre Przywara struct p9_rstatfs { 526*fe8e6c1cSAndre Przywara u32 type; 527*fe8e6c1cSAndre Przywara u32 bsize; 528*fe8e6c1cSAndre Przywara u64 blocks; 529*fe8e6c1cSAndre Przywara u64 bfree; 530*fe8e6c1cSAndre Przywara u64 bavail; 531*fe8e6c1cSAndre Przywara u64 files; 532*fe8e6c1cSAndre Przywara u64 ffree; 533*fe8e6c1cSAndre Przywara u64 fsid; 534*fe8e6c1cSAndre Przywara u32 namelen; 535*fe8e6c1cSAndre Przywara }; 536*fe8e6c1cSAndre Przywara 537*fe8e6c1cSAndre Przywara /** 538*fe8e6c1cSAndre Przywara * struct p9_fcall - primary packet structure 539*fe8e6c1cSAndre Przywara * @size: prefixed length of the structure 540*fe8e6c1cSAndre Przywara * @id: protocol operating identifier of type &p9_msg_t 541*fe8e6c1cSAndre Przywara * @tag: transaction id of the request 542*fe8e6c1cSAndre Przywara * @offset: used by marshalling routines to track current position in buffer 543*fe8e6c1cSAndre Przywara * @capacity: used by marshalling routines to track total malloc'd capacity 544*fe8e6c1cSAndre Przywara * @sdata: payload 545*fe8e6c1cSAndre Przywara * 546*fe8e6c1cSAndre Przywara * &p9_fcall represents the structure for all 9P RPC 547*fe8e6c1cSAndre Przywara * transactions. Requests are packaged into fcalls, and reponses 548*fe8e6c1cSAndre Przywara * must be extracted from them. 549*fe8e6c1cSAndre Przywara * 550*fe8e6c1cSAndre Przywara * See Also: http://plan9.bell-labs.com/magic/man2html/2/fcall 551*fe8e6c1cSAndre Przywara */ 552*fe8e6c1cSAndre Przywara 553*fe8e6c1cSAndre Przywara struct p9_fcall { 554*fe8e6c1cSAndre Przywara u32 size; 555*fe8e6c1cSAndre Przywara u8 id; 556*fe8e6c1cSAndre Przywara u16 tag; 557*fe8e6c1cSAndre Przywara 558*fe8e6c1cSAndre Przywara size_t offset; 559*fe8e6c1cSAndre Przywara size_t capacity; 560*fe8e6c1cSAndre Przywara 561*fe8e6c1cSAndre Przywara u8 *sdata; 562*fe8e6c1cSAndre Przywara }; 563*fe8e6c1cSAndre Przywara 564*fe8e6c1cSAndre Przywara struct p9_idpool; 565*fe8e6c1cSAndre Przywara 566*fe8e6c1cSAndre Przywara int p9_errstr2errno(char *errstr, int len); 567*fe8e6c1cSAndre Przywara 568*fe8e6c1cSAndre Przywara struct p9_idpool *p9_idpool_create(void); 569*fe8e6c1cSAndre Przywara void p9_idpool_destroy(struct p9_idpool *); 570*fe8e6c1cSAndre Przywara int p9_idpool_get(struct p9_idpool *p); 571*fe8e6c1cSAndre Przywara void p9_idpool_put(int id, struct p9_idpool *p); 572*fe8e6c1cSAndre Przywara int p9_idpool_check(int id, struct p9_idpool *p); 573*fe8e6c1cSAndre Przywara 574*fe8e6c1cSAndre Przywara int p9_error_init(void); 575*fe8e6c1cSAndre Przywara int p9_trans_fd_init(void); 576*fe8e6c1cSAndre Przywara void p9_trans_fd_exit(void); 577*fe8e6c1cSAndre Przywara #endif /* NET_9P_H */ 578