V10/lsys/sys/netb.h
/*
* network filesystem protocol
*
* messages are character arrays,
* encoding structures of characters,
* two-byte shorts, and four-byte longs.
* shorts and longs have a specific byte order,
* and should be accessed through the macros below.
*/
/*
* general numbers
*/
#define NETB 2 /* protocol version */
#define NBMAXMSG (5*1024) /* max message size */
#define NBROOTTAG 0 /* i_tag assumed for the root */
/*
* turn network numbers into host numbers
* unsigned char *p
*/
#define frnetlong(p, off) (p[off+0]+(p[off+1]<<8)+((long)p[off+2]<<16)+((long)p[off+3]<<24))
#define frnetshort(p, off) (p[off+0]+(p[off+1]<<8))
#define frnetchar(p, off) p[off]
/*
* turn host numbers to network numbers
*/
#define tonetlong(p, off, l) (p[off+0]=(l), p[off+1]=(l)>>8, p[off+2]=(l)>>16, p[off+3]=(l)>>24)
#define tonetshort(p, off, s) (p[off+0]=(s), p[off+1]=(s)>>8)
#define tonetchar(p, off, c) (p[off]=c)
/*
* messages from client to server
*/
/*
* general header
*/
#define SNB_VERSION 0 /* (char) version */
#define SNB_CMD 1 /* (char) command; see below */
#define SNB_FLAGS 2 /* (char) mostly for nami */
/* one byte of padding */
#define SNB_TRANNUM 4 /* (long) unique transaction ID */
#define SNB_LEN 8 /* (long) including header and any data */
#define SNB_TAG 12 /* (long) which file this is about */
#define SNB_UID 16 /* (short) who wants to do IO */
#define SNB_GID 18 /* (short) ditto */
/* four more bytes of junk */
#define SNBSIZE 24
/*
* commands
*/
#define NBPUT 1 /* put file */
/* 2 was NAGET */
#define NBUPD 3 /* update attributes */
#define NBREAD 4 /* read data */
#define NBWRT 5 /* write data */
#define NBNAMI 6 /* translate name (with many side effects) */
#define NBSTAT 7 /* read file status */
#define NBIOCTL 8 /* ioctl */
#define NBTRNC 9 /* truncate */
#define NBDIR 10 /* directory read */
/*
* flags, for namei sub-function code,
* are defined in inode.h
* should they be here too?
*/
/*
* additional data for each command
*/
/*
* update
*/
#define SUP_MODE (SNBSIZE+0) /* (short) new mode */
/* two bytes for raw device (mknod) */
/* four bytes of junk */
#define SUP_ATIME (SNBSIZE+8) /* (long) access time */
#define SUP_MTIME (SNBSIZE+12) /* (long) mod time */
#define SUPSIZE (SNBSIZE+16)
/*
* read, dirread
*/
#define SRD_LEN (SNBSIZE+0) /* (long) how much to read */
#define SRD_OFFSET (SNBSIZE+4) /* (long) file offset */
#define SRDSIZE (SNBSIZE+8)
/*
* write
*/
#define SWR_LEN (SNBSIZE+0) /* (long) how much to write */
#define SWR_OFFSET (SNBSIZE+4) /* (long) where to write it */
#define SWRSIZE (SNBSIZE+8)
/* data to be written follows immediately */
/*
* namei
*/
#define SNM_MODE (SNBSIZE+0) /* (short) mode for creat */
#define SNM_DEV (SNBSIZE+2) /* (short) device (mknod); used? */
#define SNM_INO (SNBSIZE+4) /* (long) i-number, for link */
#define SNMSIZE (SNBSIZE+8)
/* name to be translated follows immediately */
/*
* SNB_FLAGS: namei function codes
* these must match the numbers in inode.h;
* they are repeated here so the protocol
* is all defined in one place
*/
#define NI_SEARCH 0 /* search only (0 value known to nilargnamei, beware) */
#define NI_DEL 1 /* unlink this file */
#define NI_CREAT 2 /* create it if it doesn't exits */
#define NI_NXCREAT 3 /* create it, error if it already exists */
#define NI_LINK 4 /* make a link */
#define NI_MKDIR 5 /* make a directory */
#define NI_RMDIR 6 /* remove a directory */
/*
* stat
*/
#define SST_TIME (SNBSIZE+0) /* (long) time, for synchronization */
/* four bytes of padding */
#define SSTSIZE (SNBSIZE+8)
/*
* ioctl
*/
#define SIO_CMD (SNBSIZE+0) /* (long) function code */
#define SIO_FLAG (SNBSIZE+4) /* (short) file flags; silly? */
/* two bytes padding */
#define SIOSIZE (SNBSIZE+8)
#define SIODATA 64 /* bytes of data follow */
/* does some ioctl data follow? */
/*
* responses from server to client
*/
/*
* general header
*/
#define RNB_TRANNUM 0 /* (long) transaction ID */
#define RNB_ERRNO 4 /* (short) error number; zero if OK */
#define RNB_FLAGS 6 /* (char) see below */
/* one byte of pad */
#define RNB_LEN 8 /* (long) including header and any data */
#define RNB_FSIZE 12 /* (long) file size after write (why here?) */
#define RNBSIZE 16
/*
* flags
*/
#define NBROOT 1 /* namei popped out of root */
#define NBEND 2 /* last read was short, probably end of file */
/*
* extra data for each type of response
*/
/*
* read: no extra header info;
* data follows at offset RNBSIZE
*/
/*
* namei
* contains an entire stat response
* so sys stat sends one namei message and no stat message
* not exactly a stat message, though: RNM_USED is in the middle
*/
#define RNM_TAG (RNBSIZE+0) /* (long) new file */
#define RNM_INO (RNBSIZE+4) /* (long) its i-number */
#define RNM_DEV (RNBSIZE+8) /* (short) st_dev */
#define RNM_MODE (RNBSIZE+10) /* (short) mode */
#define RNM_USED (RNBSIZE+12) /* (long) filename chars consumed (NBROOT only) */
#define RNM_NLINK (RNBSIZE+16) /* (short) */
#define RNM_UID (RNBSIZE+18) /* (short) */
#define RNM_GID (RNBSIZE+20) /* (short) */
#define RNM_RDEV (RNBSIZE+22) /* (short) st_rdev; useful? */
#define RNM_SIZE (RNBSIZE+24) /* (long) */
#define RNM_ATIME (RNBSIZE+28) /* (long) */
#define RNM_MTIME (RNBSIZE+32) /* (long) */
#define RNM_CTIME (RNBSIZE+36) /* (long) */
#define RNMSIZE (RNBSIZE+40)
/*
* stat
*/
#define RST_INO (RNBSIZE+0) /* (long) i-number */
#define RST_DEV (RNBSIZE+4) /* (short) st_dev */
#define RST_MODE (RNBSIZE+6) /* (short) */
#define RST_NLINK (RNBSIZE+8) /* (short) */
#define RST_UID (RNBSIZE+10) /* (short) */
#define RST_GID (RNBSIZE+12) /* (short) */
#define RST_RDEV (RNBSIZE+14) /* (short) st_rdev; used? */
#define RST_SIZE (RNBSIZE+16) /* (long) */
#define RST_ATIME (RNBSIZE+20) /* (long) */
#define RST_MTIME (RNBSIZE+24) /* (long) */
#define RST_CTIME (RNBSIZE+28) /* (long) */
#define RSTSIZE (RNBSIZE+32)
/*
* ioctl:
* no header, just SIOSIZE bytes of ioctl data
*/
/*
* dirread
*/
#define RDI_USED (RNBSIZE+0) /* (long) advance file pointer this much */
/* four bytes of junk */
#define RDISIZE (RNBSIZE+8)