19a747e4fSDavid du Colombier typedef struct Ioclust Ioclust; 23e12c5d1SDavid du Colombier typedef struct Iobuf Iobuf; 39a747e4fSDavid du Colombier typedef struct Isofile Isofile; 43e12c5d1SDavid du Colombier typedef struct Xdata Xdata; 53e12c5d1SDavid du Colombier typedef struct Xfile Xfile; 63e12c5d1SDavid du Colombier typedef struct Xfs Xfs; 73e12c5d1SDavid du Colombier typedef struct Xfsub Xfsub; 83e12c5d1SDavid du Colombier 912fd1c83SDavid du Colombier #pragma incomplete Isofile 1012fd1c83SDavid du Colombier 11bd389b36SDavid du Colombier enum 12bd389b36SDavid du Colombier { 139a747e4fSDavid du Colombier Sectorsize = 2048, 149a747e4fSDavid du Colombier Maxname = 256, 153e12c5d1SDavid du Colombier }; 163e12c5d1SDavid du Colombier 173e12c5d1SDavid du Colombier struct Iobuf 183e12c5d1SDavid du Colombier { 199a747e4fSDavid du Colombier Ioclust* clust; 203e12c5d1SDavid du Colombier long addr; 219a747e4fSDavid du Colombier uchar* iobuf; 229a747e4fSDavid du Colombier }; 239a747e4fSDavid du Colombier 249a747e4fSDavid du Colombier struct Ioclust 259a747e4fSDavid du Colombier { 26e67f3b95SDavid du Colombier long addr; /* in sectors; good to 8TB */ 279a747e4fSDavid du Colombier Xdata* dev; 289a747e4fSDavid du Colombier Ioclust* next; 299a747e4fSDavid du Colombier Ioclust* prev; 303e12c5d1SDavid du Colombier int busy; 319a747e4fSDavid du Colombier int nbuf; 329a747e4fSDavid du Colombier Iobuf* buf; 333e12c5d1SDavid du Colombier uchar* iobuf; 343e12c5d1SDavid du Colombier }; 353e12c5d1SDavid du Colombier 363e12c5d1SDavid du Colombier struct Xdata 373e12c5d1SDavid du Colombier { 383e12c5d1SDavid du Colombier Xdata* next; 393e12c5d1SDavid du Colombier char* name; /* of underlying file */ 403e12c5d1SDavid du Colombier Qid qid; 413e12c5d1SDavid du Colombier short type; 423e12c5d1SDavid du Colombier short fdev; 433e12c5d1SDavid du Colombier int ref; /* attach count */ 443e12c5d1SDavid du Colombier int dev; /* for read/write */ 453e12c5d1SDavid du Colombier }; 463e12c5d1SDavid du Colombier 47bd389b36SDavid du Colombier struct Xfsub 48bd389b36SDavid du Colombier { 493e12c5d1SDavid du Colombier void (*reset)(void); 503e12c5d1SDavid du Colombier int (*attach)(Xfile*); 513e12c5d1SDavid du Colombier void (*clone)(Xfile*, Xfile*); 523e12c5d1SDavid du Colombier void (*walkup)(Xfile*); 533e12c5d1SDavid du Colombier void (*walk)(Xfile*, char*); 543e12c5d1SDavid du Colombier void (*open)(Xfile*, int); 553e12c5d1SDavid du Colombier void (*create)(Xfile*, char*, long, int); 569a747e4fSDavid du Colombier long (*readdir)(Xfile*, uchar*, long, long); 57*31919746SDavid du Colombier long (*read)(Xfile*, char*, vlong, long); 58*31919746SDavid du Colombier long (*write)(Xfile*, char*, vlong, long); 593e12c5d1SDavid du Colombier void (*clunk)(Xfile*); 603e12c5d1SDavid du Colombier void (*remove)(Xfile*); 613e12c5d1SDavid du Colombier void (*stat)(Xfile*, Dir*); 623e12c5d1SDavid du Colombier void (*wstat)(Xfile*, Dir*); 633e12c5d1SDavid du Colombier }; 643e12c5d1SDavid du Colombier 65bd389b36SDavid du Colombier struct Xfs 66bd389b36SDavid du Colombier { 673e12c5d1SDavid du Colombier Xdata* d; /* how to get the bits */ 683e12c5d1SDavid du Colombier Xfsub* s; /* how to use them */ 693e12c5d1SDavid du Colombier int ref; 7059cc4ca5SDavid du Colombier int issusp; /* follows system use sharing protocol */ 7159cc4ca5SDavid du Colombier long suspoff; /* if so, offset at which SUSP area begins */ 7259cc4ca5SDavid du Colombier int isrock; /* Rock Ridge format */ 733e12c5d1SDavid du Colombier int isplan9; /* has Plan 9-specific directory info */ 743e12c5d1SDavid du Colombier Qid rootqid; 759a747e4fSDavid du Colombier Isofile* ptr; /* private data */ 763e12c5d1SDavid du Colombier }; 773e12c5d1SDavid du Colombier 78bd389b36SDavid du Colombier struct Xfile 79bd389b36SDavid du Colombier { 803e12c5d1SDavid du Colombier Xfile* next; /* in fid hash bucket */ 813e12c5d1SDavid du Colombier Xfs* xf; 823e12c5d1SDavid du Colombier long fid; 833e12c5d1SDavid du Colombier ulong flags; 843e12c5d1SDavid du Colombier Qid qid; 853e12c5d1SDavid du Colombier int len; /* of private data */ 869a747e4fSDavid du Colombier Isofile* ptr; 873e12c5d1SDavid du Colombier }; 883e12c5d1SDavid du Colombier 89bd389b36SDavid du Colombier enum 90bd389b36SDavid du Colombier { 913e12c5d1SDavid du Colombier Asis, 923e12c5d1SDavid du Colombier Clean, 933e12c5d1SDavid du Colombier Clunk 943e12c5d1SDavid du Colombier }; 953e12c5d1SDavid du Colombier 96bd389b36SDavid du Colombier enum 97bd389b36SDavid du Colombier { 983e12c5d1SDavid du Colombier Oread = 1, 993e12c5d1SDavid du Colombier Owrite = 2, 1003e12c5d1SDavid du Colombier Orclose = 4, 1013e12c5d1SDavid du Colombier Omodes = 3, 1023e12c5d1SDavid du Colombier }; 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier extern char Enonexist[]; /* file does not exist */ 1053e12c5d1SDavid du Colombier extern char Eperm[]; /* permission denied */ 1063e12c5d1SDavid du Colombier extern char Enofile[]; /* no file system specified */ 1073e12c5d1SDavid du Colombier extern char Eauth[]; /* authentication failed */ 1083e12c5d1SDavid du Colombier 1093e12c5d1SDavid du Colombier extern char *srvname; 1103e12c5d1SDavid du Colombier extern char *deffile; 1113e12c5d1SDavid du Colombier extern int chatty; 1123e12c5d1SDavid du Colombier extern jmp_buf err_lab[]; 1133e12c5d1SDavid du Colombier extern int nerr_lab; 1143e12c5d1SDavid du Colombier extern char err_msg[]; 1157dd7cddfSDavid du Colombier 1167dd7cddfSDavid du Colombier extern int nojoliet; 1177dd7cddfSDavid du Colombier extern int noplan9; 11859cc4ca5SDavid du Colombier extern int norock; 119