Small tweaks
Lots of new code imported.
This commit is contained in:
parent
a770daa795
commit
2277c5d7bb
86 changed files with 12444 additions and 91 deletions
244
include/9p.h
Normal file
244
include/9p.h
Normal file
|
|
@ -0,0 +1,244 @@
|
|||
#ifndef __9P_H__
|
||||
#define __9P_H__ 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
#pragma src "/sys/src/lib9p"
|
||||
#pragma lib "lib9p.a"
|
||||
*/
|
||||
|
||||
/*
|
||||
* Maps from ulongs to void*s.
|
||||
*/
|
||||
typedef struct Intmap Intmap;
|
||||
|
||||
Intmap* allocmap(void (*inc)(void*));
|
||||
void freemap(Intmap*, void (*destroy)(void*));
|
||||
void* lookupkey(Intmap*, ulong);
|
||||
void* insertkey(Intmap*, ulong, void*);
|
||||
int caninsertkey(Intmap*, ulong, void*);
|
||||
void* deletekey(Intmap*, ulong);
|
||||
|
||||
/*
|
||||
* Fid and Request structures.
|
||||
*/
|
||||
typedef struct Fid Fid;
|
||||
typedef struct Req Req;
|
||||
typedef struct Fidpool Fidpool;
|
||||
typedef struct Reqpool Reqpool;
|
||||
typedef struct File File;
|
||||
typedef struct Filelist Filelist;
|
||||
typedef struct Tree Tree;
|
||||
typedef struct Readdir Readdir;
|
||||
typedef struct Srv Srv;
|
||||
|
||||
struct Fid
|
||||
{
|
||||
ulong fid;
|
||||
char omode; /* -1 = not open */
|
||||
File* file;
|
||||
char* uid;
|
||||
Qid qid;
|
||||
void* aux;
|
||||
|
||||
/* below is implementation-specific; don't use */
|
||||
Readdir* rdir;
|
||||
Ref ref;
|
||||
Fidpool* pool;
|
||||
vlong diroffset;
|
||||
long dirindex;
|
||||
};
|
||||
|
||||
struct Req
|
||||
{
|
||||
ulong tag;
|
||||
void* aux;
|
||||
Fcall ifcall;
|
||||
Fcall ofcall;
|
||||
Dir d;
|
||||
Req* oldreq;
|
||||
Fid* fid;
|
||||
Fid* afid;
|
||||
Fid* newfid;
|
||||
Srv* srv;
|
||||
|
||||
/* below is implementation-specific; don't use */
|
||||
QLock lk;
|
||||
Ref ref;
|
||||
Reqpool* pool;
|
||||
uchar* buf;
|
||||
uchar type;
|
||||
uchar responded;
|
||||
char* error;
|
||||
void* rbuf;
|
||||
Req** flush;
|
||||
int nflush;
|
||||
};
|
||||
|
||||
/*
|
||||
* Pools to maintain Fid <-> fid and Req <-> tag maps.
|
||||
*/
|
||||
|
||||
struct Fidpool {
|
||||
Intmap *map;
|
||||
void (*destroy)(Fid*);
|
||||
Srv *srv;
|
||||
};
|
||||
|
||||
struct Reqpool {
|
||||
Intmap *map;
|
||||
void (*destroy)(Req*);
|
||||
Srv *srv;
|
||||
};
|
||||
|
||||
Fidpool* allocfidpool(void (*destroy)(Fid*));
|
||||
void freefidpool(Fidpool*);
|
||||
Fid* allocfid(Fidpool*, ulong);
|
||||
Fid* lookupfid(Fidpool*, ulong);
|
||||
void closefid(Fid*);
|
||||
Fid* removefid(Fidpool*, ulong);
|
||||
|
||||
Reqpool* allocreqpool(void (*destroy)(Req*));
|
||||
void freereqpool(Reqpool*);
|
||||
Req* allocreq(Reqpool*, ulong);
|
||||
Req* lookupreq(Reqpool*, ulong);
|
||||
void closereq(Req*);
|
||||
Req* removereq(Reqpool*, ulong);
|
||||
|
||||
typedef int Dirgen(int, Dir*, void*);
|
||||
void dirread9p(Req*, Dirgen*, void*);
|
||||
|
||||
/*
|
||||
* File trees.
|
||||
*/
|
||||
struct File {
|
||||
Ref ref;
|
||||
Dir dir;
|
||||
File *parent;
|
||||
void *aux;
|
||||
|
||||
/* below is implementation-specific; don't use */
|
||||
RWLock rwlock;
|
||||
Filelist *filelist;
|
||||
Tree *tree;
|
||||
int nchild;
|
||||
int allocd;
|
||||
};
|
||||
|
||||
struct Tree {
|
||||
File *root;
|
||||
void (*destroy)(File *file);
|
||||
|
||||
/* below is implementation-specific; don't use */
|
||||
Lock genlock;
|
||||
ulong qidgen;
|
||||
ulong dirqidgen;
|
||||
};
|
||||
|
||||
Tree* alloctree(char*, char*, ulong, void(*destroy)(File*));
|
||||
void freetree(Tree*);
|
||||
File* createfile(File*, char*, char*, ulong, void*);
|
||||
int removefile(File*);
|
||||
void closefile(File*);
|
||||
File* walkfile(File*, char*);
|
||||
Readdir* opendirfile(File*);
|
||||
long readdirfile(Readdir*, uchar*, long);
|
||||
void closedirfile(Readdir*);
|
||||
|
||||
/*
|
||||
* Kernel-style command parser
|
||||
*/
|
||||
typedef struct Cmdbuf Cmdbuf;
|
||||
typedef struct Cmdtab Cmdtab;
|
||||
Cmdbuf* parsecmd(char *a, int n);
|
||||
void respondcmderror(Req*, Cmdbuf*, char*, ...);
|
||||
Cmdtab* lookupcmd(Cmdbuf*, Cmdtab*, int);
|
||||
/*
|
||||
#pragma varargck argpos respondcmderr 3
|
||||
*/
|
||||
struct Cmdbuf
|
||||
{
|
||||
char *buf;
|
||||
char **f;
|
||||
int nf;
|
||||
};
|
||||
|
||||
struct Cmdtab
|
||||
{
|
||||
int index; /* used by client to switch on result */
|
||||
char *cmd; /* command name */
|
||||
int narg; /* expected #args; 0 ==> variadic */
|
||||
};
|
||||
|
||||
/*
|
||||
* File service loop.
|
||||
*/
|
||||
struct Srv {
|
||||
Tree* tree;
|
||||
void (*destroyfid)(Fid*);
|
||||
void (*destroyreq)(Req*);
|
||||
void (*end)(Srv*);
|
||||
void* aux;
|
||||
|
||||
void (*attach)(Req*);
|
||||
void (*auth)(Req*);
|
||||
void (*open)(Req*);
|
||||
void (*create)(Req*);
|
||||
void (*read)(Req*);
|
||||
void (*write)(Req*);
|
||||
void (*remove)(Req*);
|
||||
void (*flush)(Req*);
|
||||
void (*stat)(Req*);
|
||||
void (*wstat)(Req*);
|
||||
void (*walk)(Req*);
|
||||
char* (*clone)(Fid*, Fid*);
|
||||
char* (*walk1)(Fid*, char*, Qid*);
|
||||
|
||||
int infd;
|
||||
int outfd;
|
||||
int nopipe;
|
||||
int srvfd;
|
||||
int leavefdsopen; /* magic for acme win */
|
||||
|
||||
/* below is implementation-specific; don't use */
|
||||
Fidpool* fpool;
|
||||
Reqpool* rpool;
|
||||
uint msize;
|
||||
|
||||
uchar* rbuf;
|
||||
QLock rlock;
|
||||
uchar* wbuf;
|
||||
QLock wlock;
|
||||
};
|
||||
|
||||
void srv(Srv*);
|
||||
void postmountsrv(Srv*, char*, char*, int);
|
||||
int postfd(char*, int);
|
||||
int chatty9p;
|
||||
void respond(Req*, char*);
|
||||
void threadpostmountsrv(Srv*, char*, char*, int);
|
||||
|
||||
/*
|
||||
* Helper. Assumes user is same as group.
|
||||
*/
|
||||
int hasperm(File*, char*, int);
|
||||
|
||||
void* emalloc9p(ulong);
|
||||
void* erealloc9p(void*, ulong);
|
||||
char* estrdup9p(char*);
|
||||
|
||||
enum {
|
||||
OMASK = 3
|
||||
};
|
||||
|
||||
void readstr(Req*, char*);
|
||||
void readbuf(Req*, void*, long);
|
||||
void walkandclone(Req*, char*(*walk1)(Fid*,char*,void*), char*(*clone)(Fid*,Fid*,void*), void*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
159
include/auth.h
Normal file
159
include/auth.h
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
#ifndef __AUTH_H__
|
||||
#define __AUTH_H__ 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
#pragma src "/sys/src/libauth"
|
||||
#pragma lib "libauth.a"
|
||||
*/
|
||||
|
||||
/*
|
||||
* Interface for typical callers.
|
||||
*/
|
||||
|
||||
typedef struct AuthInfo AuthInfo;
|
||||
typedef struct Chalstate Chalstate;
|
||||
typedef struct Chapreply Chapreply;
|
||||
typedef struct MSchapreply MSchapreply;
|
||||
typedef struct UserPasswd UserPasswd;
|
||||
typedef struct AuthRpc AuthRpc;
|
||||
|
||||
enum
|
||||
{
|
||||
MAXCHLEN= 256, /* max challenge length */
|
||||
MAXNAMELEN= 256, /* maximum name length */
|
||||
MD5LEN= 16,
|
||||
|
||||
ARok = 0, /* rpc return values */
|
||||
ARdone,
|
||||
ARerror,
|
||||
ARneedkey,
|
||||
ARbadkey,
|
||||
ARwritenext,
|
||||
ARtoosmall,
|
||||
ARtoobig,
|
||||
ARrpcfailure,
|
||||
ARphase,
|
||||
|
||||
AuthRpcMax = 4096,
|
||||
};
|
||||
|
||||
struct AuthRpc
|
||||
{
|
||||
int afd;
|
||||
char ibuf[AuthRpcMax];
|
||||
char obuf[AuthRpcMax];
|
||||
char *arg;
|
||||
uint narg;
|
||||
};
|
||||
|
||||
struct AuthInfo
|
||||
{
|
||||
char *cuid; /* caller id */
|
||||
char *suid; /* server id */
|
||||
char *cap; /* capability (only valid on server side) */
|
||||
int nsecret; /* length of secret */
|
||||
uchar *secret; /* secret */
|
||||
};
|
||||
|
||||
struct Chalstate
|
||||
{
|
||||
char *user;
|
||||
char chal[MAXCHLEN];
|
||||
int nchal;
|
||||
void *resp;
|
||||
int nresp;
|
||||
|
||||
/* for implementation only */
|
||||
int afd; /* to factotum */
|
||||
AuthRpc *rpc; /* to factotum */
|
||||
char userbuf[MAXNAMELEN]; /* temp space if needed */
|
||||
int userinchal; /* user was sent to obtain challenge */
|
||||
};
|
||||
|
||||
struct Chapreply /* for protocol "chap" */
|
||||
{
|
||||
uchar id;
|
||||
char resp[MD5LEN];
|
||||
};
|
||||
|
||||
struct MSchapreply /* for protocol "mschap" */
|
||||
{
|
||||
char LMresp[24]; /* Lan Manager response */
|
||||
char NTresp[24]; /* NT response */
|
||||
};
|
||||
|
||||
struct UserPasswd
|
||||
{
|
||||
char *user;
|
||||
char *passwd;
|
||||
};
|
||||
|
||||
extern int newns(char*, char*);
|
||||
extern int addns(char*, char*);
|
||||
|
||||
extern int noworld(char*);
|
||||
extern int amount(int, char*, int, char*);
|
||||
|
||||
/* these two may get generalized away -rsc */
|
||||
extern int login(char*, char*, char*);
|
||||
extern int httpauth(char*, char*);
|
||||
|
||||
typedef struct Attr Attr;
|
||||
enum {
|
||||
AttrNameval, /* name=val -- when matching, must have name=val */
|
||||
AttrQuery, /* name? -- when matching, must be present */
|
||||
AttrDefault, /* name:=val -- when matching, if present must match INTERNAL */
|
||||
};
|
||||
struct Attr
|
||||
{
|
||||
int type;
|
||||
Attr *next;
|
||||
char *name;
|
||||
char *val;
|
||||
};
|
||||
|
||||
typedef int AuthGetkey(char*);
|
||||
|
||||
int _attrfmt(Fmt*);
|
||||
Attr *_copyattr(Attr*);
|
||||
Attr *_delattr(Attr*, char*);
|
||||
Attr *_findattr(Attr*, char*);
|
||||
void _freeattr(Attr*);
|
||||
Attr *_mkattr(int, char*, char*, Attr*);
|
||||
Attr *_parseattr(char*);
|
||||
char *_strfindattr(Attr*, char*);
|
||||
/*
|
||||
#pragma varargck type "A" Attr*
|
||||
*/
|
||||
|
||||
extern AuthInfo* fauth_proxy(int, AuthRpc *rpc, AuthGetkey *getkey, char *params);
|
||||
extern AuthInfo* auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...);
|
||||
extern int auth_getkey(char*);
|
||||
extern int (*amount_getkey)(char*);
|
||||
extern void auth_freeAI(AuthInfo *ai);
|
||||
extern int auth_chuid(AuthInfo *ai, char *ns);
|
||||
extern Chalstate *auth_challenge(char*, ...);
|
||||
extern AuthInfo* auth_response(Chalstate*);
|
||||
extern int auth_respond(void*, uint, char*, uint, void*, uint, AuthGetkey *getkey, char*, ...);
|
||||
extern void auth_freechal(Chalstate*);
|
||||
extern AuthInfo* auth_userpasswd(char *user, char *passwd);
|
||||
extern UserPasswd* auth_getuserpasswd(AuthGetkey *getkey, char*, ...);
|
||||
extern AuthInfo* auth_getinfo(AuthRpc *rpc);
|
||||
extern AuthRpc* auth_allocrpc(int afd);
|
||||
extern Attr* auth_attr(AuthRpc *rpc);
|
||||
extern void auth_freerpc(AuthRpc *rpc);
|
||||
extern uint auth_rpc(AuthRpc *rpc, char *verb, void *a, int n);
|
||||
extern int auth_wep(char*, char*, ...);
|
||||
/*
|
||||
#pragma varargck argpos auth_proxy 3
|
||||
#pragma varargck argpos auth_challenge 1
|
||||
#pragma varargck argpos auth_respond 3
|
||||
#pragma varargck argpos auth_getuserpasswd 2
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
177
include/authsrv.h
Normal file
177
include/authsrv.h
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
#ifndef __AUTHSRV_H__
|
||||
#define __AUTHSRV_H__ 1
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
#pragma src "/sys/src/libauthsrv"
|
||||
#pragma lib "libauthsrv.a"
|
||||
*/
|
||||
|
||||
/*
|
||||
* Interface for talking to authentication server.
|
||||
*/
|
||||
typedef struct Ticket Ticket;
|
||||
typedef struct Ticketreq Ticketreq;
|
||||
typedef struct Authenticator Authenticator;
|
||||
typedef struct Nvrsafe Nvrsafe;
|
||||
typedef struct Passwordreq Passwordreq;
|
||||
typedef struct OChapreply OChapreply;
|
||||
typedef struct OMSchapreply OMSchapreply;
|
||||
|
||||
enum
|
||||
{
|
||||
ANAMELEN= 28, /* maximum size of name in previous proto */
|
||||
AERRLEN= 64, /* maximum size of errstr in previous proto */
|
||||
DOMLEN= 48, /* length of an authentication domain name */
|
||||
DESKEYLEN= 7, /* length of a des key for encrypt/decrypt */
|
||||
CHALLEN= 8, /* length of a plan9 sk1 challenge */
|
||||
NETCHLEN= 16, /* max network challenge length (used in AS protocol) */
|
||||
CONFIGLEN= 14,
|
||||
SECRETLEN= 32, /* max length of a secret */
|
||||
|
||||
KEYDBOFF= 8, /* length of random data at the start of key file */
|
||||
OKEYDBLEN= ANAMELEN+DESKEYLEN+4+2, /* length of an entry in old key file */
|
||||
KEYDBLEN= OKEYDBLEN+SECRETLEN, /* length of an entry in key file */
|
||||
OMD5LEN= 16,
|
||||
};
|
||||
|
||||
/* encryption numberings (anti-replay) */
|
||||
enum
|
||||
{
|
||||
AuthTreq=1, /* ticket request */
|
||||
AuthChal=2, /* challenge box request */
|
||||
AuthPass=3, /* change password */
|
||||
AuthOK=4, /* fixed length reply follows */
|
||||
AuthErr=5, /* error follows */
|
||||
AuthMod=6, /* modify user */
|
||||
AuthApop=7, /* apop authentication for pop3 */
|
||||
AuthOKvar=9, /* variable length reply follows */
|
||||
AuthChap=10, /* chap authentication for ppp */
|
||||
AuthMSchap=11, /* MS chap authentication for ppp */
|
||||
AuthCram=12, /* CRAM verification for IMAP (RFC2195 & rfc2104) */
|
||||
AuthHttp=13, /* http domain login */
|
||||
AuthVNC=14, /* VNC server login (deprecated) */
|
||||
|
||||
|
||||
AuthTs=64, /* ticket encrypted with server's key */
|
||||
AuthTc, /* ticket encrypted with client's key */
|
||||
AuthAs, /* server generated authenticator */
|
||||
AuthAc, /* client generated authenticator */
|
||||
AuthTp, /* ticket encrypted with client's key for password change */
|
||||
AuthHr, /* http reply */
|
||||
};
|
||||
|
||||
struct Ticketreq
|
||||
{
|
||||
char type;
|
||||
char authid[ANAMELEN]; /* server's encryption id */
|
||||
char authdom[DOMLEN]; /* server's authentication domain */
|
||||
char chal[CHALLEN]; /* challenge from server */
|
||||
char hostid[ANAMELEN]; /* host's encryption id */
|
||||
char uid[ANAMELEN]; /* uid of requesting user on host */
|
||||
};
|
||||
#define TICKREQLEN (3*ANAMELEN+CHALLEN+DOMLEN+1)
|
||||
|
||||
struct Ticket
|
||||
{
|
||||
char num; /* replay protection */
|
||||
char chal[CHALLEN]; /* server challenge */
|
||||
char cuid[ANAMELEN]; /* uid on client */
|
||||
char suid[ANAMELEN]; /* uid on server */
|
||||
char key[DESKEYLEN]; /* nonce DES key */
|
||||
};
|
||||
#define TICKETLEN (CHALLEN+2*ANAMELEN+DESKEYLEN+1)
|
||||
|
||||
struct Authenticator
|
||||
{
|
||||
char num; /* replay protection */
|
||||
char chal[CHALLEN];
|
||||
ulong id; /* authenticator id, ++'d with each auth */
|
||||
};
|
||||
#define AUTHENTLEN (CHALLEN+4+1)
|
||||
|
||||
struct Passwordreq
|
||||
{
|
||||
char num;
|
||||
char old[ANAMELEN];
|
||||
char new[ANAMELEN];
|
||||
char changesecret;
|
||||
char secret[SECRETLEN]; /* new secret */
|
||||
};
|
||||
#define PASSREQLEN (2*ANAMELEN+1+1+SECRETLEN)
|
||||
|
||||
struct OChapreply
|
||||
{
|
||||
uchar id;
|
||||
char uid[ANAMELEN];
|
||||
char resp[OMD5LEN];
|
||||
};
|
||||
|
||||
struct OMSchapreply
|
||||
{
|
||||
char uid[ANAMELEN];
|
||||
char LMresp[24]; /* Lan Manager response */
|
||||
char NTresp[24]; /* NT response */
|
||||
};
|
||||
|
||||
/*
|
||||
* convert to/from wire format
|
||||
*/
|
||||
extern int convT2M(Ticket*, char*, char*);
|
||||
extern void convM2T(char*, Ticket*, char*);
|
||||
extern void convM2Tnoenc(char*, Ticket*);
|
||||
extern int convA2M(Authenticator*, char*, char*);
|
||||
extern void convM2A(char*, Authenticator*, char*);
|
||||
extern int convTR2M(Ticketreq*, char*);
|
||||
extern void convM2TR(char*, Ticketreq*);
|
||||
extern int convPR2M(Passwordreq*, char*, char*);
|
||||
extern void convM2PR(char*, Passwordreq*, char*);
|
||||
|
||||
/*
|
||||
* convert ascii password to DES key
|
||||
*/
|
||||
extern int opasstokey(char*, char*);
|
||||
extern int passtokey(char*, char*);
|
||||
|
||||
/*
|
||||
* Nvram interface
|
||||
*/
|
||||
enum {
|
||||
NVwrite = 1<<0, /* always prompt and rewrite nvram */
|
||||
NVwriteonerr = 1<<1, /* prompt and rewrite nvram when corrupt */
|
||||
};
|
||||
|
||||
struct Nvrsafe
|
||||
{
|
||||
char machkey[DESKEYLEN];
|
||||
uchar machsum;
|
||||
char authkey[DESKEYLEN];
|
||||
uchar authsum;
|
||||
char config[CONFIGLEN];
|
||||
uchar configsum;
|
||||
char authid[ANAMELEN];
|
||||
uchar authidsum;
|
||||
char authdom[DOMLEN];
|
||||
uchar authdomsum;
|
||||
};
|
||||
|
||||
extern uchar nvcsum(void*, int);
|
||||
extern int readnvram(Nvrsafe*, int);
|
||||
|
||||
/*
|
||||
* call up auth server
|
||||
*/
|
||||
extern int authdial(char *netroot, char *authdom);
|
||||
|
||||
/*
|
||||
* exchange messages with auth server
|
||||
*/
|
||||
extern int _asgetticket(int, char*, char*);
|
||||
extern int _asrdresp(int, char*, int);
|
||||
extern int sslnegotiate(int, Ticket*, char**, char**);
|
||||
extern int srvsslnegotiate(int, Ticket*, char**, char**);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
153
include/mp.h
Normal file
153
include/mp.h
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
#ifndef __MP_H__
|
||||
#define __MP_H__ 1
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
#pragma src "/sys/src/libmp"
|
||||
#pragma lib "libmp.a"
|
||||
*/
|
||||
|
||||
#define _MPINT 1
|
||||
|
||||
typedef long mpdigit;
|
||||
|
||||
// the code assumes mpdigit to be at least an int
|
||||
// mpdigit must be an atomic type. mpdigit is defined
|
||||
// in the architecture specific u.h
|
||||
|
||||
typedef struct mpint mpint;
|
||||
|
||||
struct mpint
|
||||
{
|
||||
int sign; // +1 or -1
|
||||
int size; // allocated digits
|
||||
int top; // significant digits
|
||||
mpdigit *p;
|
||||
char flags;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MPstatic= 0x01,
|
||||
Dbytes= sizeof(mpdigit), // bytes per digit
|
||||
Dbits= Dbytes*8 // bits per digit
|
||||
};
|
||||
|
||||
// allocation
|
||||
void mpsetminbits(int n); // newly created mpint's get at least n bits
|
||||
mpint* mpnew(int n); // create a new mpint with at least n bits
|
||||
void mpfree(mpint *b);
|
||||
void mpbits(mpint *b, int n); // ensure that b has at least n bits
|
||||
void mpnorm(mpint *b); // dump leading zeros
|
||||
mpint* mpcopy(mpint *b);
|
||||
void mpassign(mpint *old, mpint *new);
|
||||
|
||||
// random bits
|
||||
mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b);
|
||||
|
||||
// conversion
|
||||
mpint* strtomp(char*, char**, int, mpint*); // ascii
|
||||
int mpfmt(Fmt*);
|
||||
char* mptoa(mpint*, int, char*, int);
|
||||
mpint* letomp(uchar*, uint, mpint*); // byte array, little-endian
|
||||
int mptole(mpint*, uchar*, uint, uchar**);
|
||||
mpint* betomp(uchar*, uint, mpint*); // byte array, little-endian
|
||||
int mptobe(mpint*, uchar*, uint, uchar**);
|
||||
uint mptoui(mpint*); // unsigned int
|
||||
mpint* uitomp(uint, mpint*);
|
||||
int mptoi(mpint*); // int
|
||||
mpint* itomp(int, mpint*);
|
||||
uvlong mptouv(mpint*); // unsigned vlong
|
||||
mpint* uvtomp(uvlong, mpint*);
|
||||
vlong mptov(mpint*); // vlong
|
||||
mpint* vtomp(vlong, mpint*);
|
||||
|
||||
// divide 2 digits by one
|
||||
void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient);
|
||||
|
||||
// in the following, the result mpint may be
|
||||
// the same as one of the inputs.
|
||||
void mpadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2
|
||||
void mpsub(mpint *b1, mpint *b2, mpint *diff); // diff = b1-b2
|
||||
void mpleft(mpint *b, int shift, mpint *res); // res = b<<shift
|
||||
void mpright(mpint *b, int shift, mpint *res); // res = b>>shift
|
||||
void mpmul(mpint *b1, mpint *b2, mpint *prod); // prod = b1*b2
|
||||
void mpexp(mpint *b, mpint *e, mpint *m, mpint *res); // res = b**e mod m
|
||||
void mpmod(mpint *b, mpint *m, mpint *remainder); // remainder = b mod m
|
||||
|
||||
// quotient = dividend/divisor, remainder = dividend % divisor
|
||||
void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder);
|
||||
|
||||
// return neg, 0, pos as b1-b2 is neg, 0, pos
|
||||
int mpcmp(mpint *b1, mpint *b2);
|
||||
|
||||
// extended gcd return d, x, and y, s.t. d = gcd(a,b) and ax+by = d
|
||||
void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y);
|
||||
|
||||
// res = b**-1 mod m
|
||||
void mpinvert(mpint *b, mpint *m, mpint *res);
|
||||
|
||||
// bit counting
|
||||
int mpsignif(mpint*); // number of sigificant bits in mantissa
|
||||
int mplowbits0(mpint*); // k, where n = 2**k * q for odd q
|
||||
|
||||
// well known constants
|
||||
extern mpint *mpzero, *mpone, *mptwo;
|
||||
|
||||
// sum[0:alen] = a[0:alen-1] + b[0:blen-1]
|
||||
// prereq: alen >= blen, sum has room for alen+1 digits
|
||||
void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum);
|
||||
|
||||
// diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
|
||||
// prereq: alen >= blen, diff has room for alen digits
|
||||
void mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff);
|
||||
|
||||
// p[0:n] += m * b[0:n-1]
|
||||
// prereq: p has room for n+1 digits
|
||||
void mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p);
|
||||
|
||||
// p[0:n] -= m * b[0:n-1]
|
||||
// prereq: p has room for n+1 digits
|
||||
int mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p);
|
||||
|
||||
// p[0:alen*blen-1] = a[0:alen-1] * b[0:blen-1]
|
||||
// prereq: alen >= blen, p has room for m*n digits
|
||||
void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p);
|
||||
|
||||
// sign of a - b or zero if the same
|
||||
int mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen);
|
||||
|
||||
// divide the 2 digit dividend by the one digit divisor and stick in quotient
|
||||
// we assume that the result is one digit - overflow is all 1's
|
||||
void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient);
|
||||
|
||||
// playing with magnitudes
|
||||
int mpmagcmp(mpint *b1, mpint *b2);
|
||||
void mpmagadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2
|
||||
void mpmagsub(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2
|
||||
|
||||
// chinese remainder theorem
|
||||
typedef struct CRTpre CRTpre; // precomputed values for converting
|
||||
// twixt residues and mpint
|
||||
typedef struct CRTres CRTres; // residue form of an mpint
|
||||
|
||||
struct CRTres
|
||||
{
|
||||
int n; // number of residues
|
||||
mpint *r[1]; // residues
|
||||
};
|
||||
|
||||
CRTpre* crtpre(int, mpint**); // precompute conversion values
|
||||
CRTres* crtin(CRTpre*, mpint*); // convert mpint to residues
|
||||
void crtout(CRTpre*, CRTres*, mpint*); // convert residues to mpint
|
||||
void crtprefree(CRTpre*);
|
||||
void crtresfree(CRTres*);
|
||||
|
||||
|
||||
/* #pragma varargck type "B" mpint* */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
801
include/nfs3.h
Normal file
801
include/nfs3.h
Normal file
|
|
@ -0,0 +1,801 @@
|
|||
/*
|
||||
* NFS mounter V3; see RFC 1813
|
||||
*/
|
||||
/*
|
||||
#pragma lib "libsunrpc.a"
|
||||
#pragma src "/sys/src/libsunrpc"
|
||||
*/
|
||||
#define _NFS3H_ /* sorry */
|
||||
|
||||
enum {
|
||||
NfsMount1HandleSize = 32,
|
||||
NfsMount3MaxPathSize = 1024,
|
||||
NfsMount3MaxNameSize = 255,
|
||||
NfsMount3MaxHandleSize = 64,
|
||||
NfsMount3Program = 100005,
|
||||
NfsMount3Version = 3,
|
||||
NfsMount1Program = 100005,
|
||||
NfsMount1Version = 1
|
||||
};
|
||||
typedef struct NfsMount3TNull NfsMount3TNull;
|
||||
typedef struct NfsMount3RNull NfsMount3RNull;
|
||||
typedef struct NfsMount3TMnt NfsMount3TMnt;
|
||||
typedef struct NfsMount3RMnt NfsMount3RMnt;
|
||||
typedef struct NfsMount3TDump NfsMount3TDump;
|
||||
typedef struct NfsMount3Entry NfsMount3Entry;
|
||||
typedef struct NfsMount3RDump NfsMount3RDump;
|
||||
typedef struct NfsMount3TUmnt NfsMount3TUmnt;
|
||||
typedef struct NfsMount3RUmnt NfsMount3RUmnt;
|
||||
typedef struct NfsMount3Export NfsMount3Export;
|
||||
typedef struct NfsMount3TUmntall NfsMount3TUmntall;
|
||||
typedef struct NfsMount3RUmntall NfsMount3RUmntall;
|
||||
typedef struct NfsMount3TExport NfsMount3TExport;
|
||||
typedef struct NfsMount3RExport NfsMount3RExport;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NfsMount3CallTNull,
|
||||
NfsMount3CallRNull,
|
||||
NfsMount3CallTMnt,
|
||||
NfsMount3CallRMnt,
|
||||
NfsMount3CallTDump,
|
||||
NfsMount3CallRDump,
|
||||
NfsMount3CallTUmnt,
|
||||
NfsMount3CallRUmnt,
|
||||
NfsMount3CallTUmntall,
|
||||
NfsMount3CallRUmntall,
|
||||
NfsMount3CallTExport,
|
||||
NfsMount3CallRExport
|
||||
} NfsMount3CallType;
|
||||
|
||||
struct NfsMount3TNull {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3RNull {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3TMnt {
|
||||
SunCall call;
|
||||
char *path;
|
||||
};
|
||||
|
||||
struct NfsMount3RMnt {
|
||||
SunCall call;
|
||||
uint status;
|
||||
uchar *handle;
|
||||
uint len;
|
||||
u32int *auth;
|
||||
u32int nauth;
|
||||
};
|
||||
|
||||
struct NfsMount3TDump {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3Entry {
|
||||
char *host;
|
||||
char *path;
|
||||
};
|
||||
|
||||
struct NfsMount3RDump {
|
||||
SunCall call;
|
||||
uchar *data;
|
||||
u32int count;
|
||||
};
|
||||
|
||||
struct NfsMount3TUmnt {
|
||||
SunCall call;
|
||||
char *path;
|
||||
};
|
||||
|
||||
struct NfsMount3RUmnt {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3Export {
|
||||
char *path;
|
||||
char **g;
|
||||
u32int ng;
|
||||
};
|
||||
|
||||
struct NfsMount3TUmntall {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3RUmntall {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3TExport {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct NfsMount3RExport {
|
||||
SunCall call;
|
||||
uchar *data;
|
||||
u32int count;
|
||||
};
|
||||
|
||||
uint nfsmount3exportgroupsize(uchar*);
|
||||
uint nfsmount3exportsize(NfsMount3Export*);
|
||||
int nfsmount3exportpack(uchar*, uchar*, uchar**, NfsMount3Export*);
|
||||
int nfsmount3exportunpack(uchar*, uchar*, uchar**, char**, char***, NfsMount3Export*);
|
||||
int nfsmount3entrypack(uchar*, uchar*, uchar**, NfsMount3Entry*);
|
||||
int nfsmount3entryunpack(uchar*, uchar*, uchar**, NfsMount3Entry*);
|
||||
uint nfsmount3entrysize(NfsMount3Entry*);
|
||||
|
||||
extern SunProg nfsmount3prog;
|
||||
|
||||
/*
|
||||
* NFS V3; see RFC 1813
|
||||
*/
|
||||
enum {
|
||||
Nfs3MaxHandleSize = 64,
|
||||
Nfs3CookieVerfSize = 8,
|
||||
Nfs3CreateVerfSize = 8,
|
||||
Nfs3WriteVerfSize = 8,
|
||||
Nfs3AccessRead = 1,
|
||||
Nfs3AccessLookup = 2,
|
||||
Nfs3AccessModify = 4,
|
||||
Nfs3AccessExtend = 8,
|
||||
Nfs3AccessDelete = 16,
|
||||
Nfs3AccessExecute = 32,
|
||||
Nfs3FsHasLinks = 1,
|
||||
Nfs3FsHasSymlinks = 2,
|
||||
Nfs3FsHomogeneous = 8,
|
||||
Nfs3FsCanSetTime = 16,
|
||||
|
||||
Nfs3Version = 3,
|
||||
Nfs3Program = 100003,
|
||||
};
|
||||
typedef enum
|
||||
{
|
||||
Nfs3Ok = 0,
|
||||
Nfs3ErrNotOwner = 1,
|
||||
Nfs3ErrNoEnt = 2,
|
||||
Nfs3ErrIo = 5,
|
||||
Nfs3ErrNxio = 6,
|
||||
Nfs3ErrNoMem = 12,
|
||||
Nfs3ErrAcces = 13,
|
||||
Nfs3ErrExist = 17,
|
||||
Nfs3ErrXDev = 18,
|
||||
Nfs3ErrNoDev = 19,
|
||||
Nfs3ErrNotDir = 20,
|
||||
Nfs3ErrIsDir = 21,
|
||||
Nfs3ErrInval = 22,
|
||||
Nfs3ErrFbig = 27,
|
||||
Nfs3ErrNoSpc = 28,
|
||||
Nfs3ErrRoFs = 30,
|
||||
Nfs3ErrMLink = 31,
|
||||
Nfs3ErrNameTooLong = 63,
|
||||
Nfs3ErrNotEmpty = 66,
|
||||
Nfs3ErrDQuot = 69,
|
||||
Nfs3ErrStale = 70,
|
||||
Nfs3ErrRemote = 71,
|
||||
Nfs3ErrBadHandle = 10001,
|
||||
Nfs3ErrNotSync = 10002,
|
||||
Nfs3ErrBadCookie = 10003,
|
||||
Nfs3ErrNotSupp = 10004,
|
||||
Nfs3ErrTooSmall = 10005,
|
||||
Nfs3ErrServerFault = 10006,
|
||||
Nfs3ErrBadType = 10007,
|
||||
Nfs3ErrJukebox = 10008,
|
||||
Nfs3ErrFprintNotFound = 10009,
|
||||
Nfs3ErrAborted = 10010,
|
||||
} Nfs3Status;
|
||||
|
||||
void nfs3Errstr(Nfs3Status);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
Nfs3FileReg = 1,
|
||||
Nfs3FileDir = 2,
|
||||
Nfs3FileBlock = 3,
|
||||
Nfs3FileChar = 4,
|
||||
Nfs3FileSymlink = 5,
|
||||
Nfs3FileSocket = 6,
|
||||
Nfs3FileFifo = 7,
|
||||
} Nfs3FileType;
|
||||
|
||||
enum
|
||||
{
|
||||
Nfs3ModeSetUid = 0x800,
|
||||
Nfs3ModeSetGid = 0x400,
|
||||
Nfs3ModeSticky = 0x200,
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
Nfs3CallTNull,
|
||||
Nfs3CallRNull,
|
||||
Nfs3CallTGetattr,
|
||||
Nfs3CallRGetattr,
|
||||
Nfs3CallTSetattr,
|
||||
Nfs3CallRSetattr,
|
||||
Nfs3CallTLookup,
|
||||
Nfs3CallRLookup,
|
||||
Nfs3CallTAccess,
|
||||
Nfs3CallRAccess,
|
||||
Nfs3CallTReadlink,
|
||||
Nfs3CallRReadlink,
|
||||
Nfs3CallTRead,
|
||||
Nfs3CallRRead,
|
||||
Nfs3CallTWrite,
|
||||
Nfs3CallRWrite,
|
||||
Nfs3CallTCreate,
|
||||
Nfs3CallRCreate,
|
||||
Nfs3CallTMkdir,
|
||||
Nfs3CallRMkdir,
|
||||
Nfs3CallTSymlink,
|
||||
Nfs3CallRSymlink,
|
||||
Nfs3CallTMknod,
|
||||
Nfs3CallRMknod,
|
||||
Nfs3CallTRemove,
|
||||
Nfs3CallRRemove,
|
||||
Nfs3CallTRmdir,
|
||||
Nfs3CallRRmdir,
|
||||
Nfs3CallTRename,
|
||||
Nfs3CallRRename,
|
||||
Nfs3CallTLink,
|
||||
Nfs3CallRLink,
|
||||
Nfs3CallTReadDir,
|
||||
Nfs3CallRReadDir,
|
||||
Nfs3CallTReadDirPlus,
|
||||
Nfs3CallRReadDirPlus,
|
||||
Nfs3CallTFsStat,
|
||||
Nfs3CallRFsStat,
|
||||
Nfs3CallTFsInfo,
|
||||
Nfs3CallRFsInfo,
|
||||
Nfs3CallTPathconf,
|
||||
Nfs3CallRPathconf,
|
||||
Nfs3CallTCommit,
|
||||
Nfs3CallRCommit,
|
||||
} Nfs3CallType;
|
||||
|
||||
typedef struct Nfs3Handle Nfs3Handle;
|
||||
typedef struct Nfs3Time Nfs3Time;
|
||||
typedef struct Nfs3Attr Nfs3Attr;
|
||||
typedef struct Nfs3WccAttr Nfs3WccAttr;
|
||||
typedef struct Nfs3Wcc Nfs3Wcc;
|
||||
typedef enum
|
||||
{
|
||||
Nfs3SetTimeDont = 0,
|
||||
Nfs3SetTimeServer = 1,
|
||||
Nfs3SetTimeClient = 2,
|
||||
} Nfs3SetTime;
|
||||
|
||||
typedef struct Nfs3SetAttr Nfs3SetAttr;
|
||||
typedef struct Nfs3TNull Nfs3TNull;
|
||||
typedef struct Nfs3RNull Nfs3RNull;
|
||||
typedef struct Nfs3TGetattr Nfs3TGetattr;
|
||||
typedef struct Nfs3RGetattr Nfs3RGetattr;
|
||||
typedef struct Nfs3TSetattr Nfs3TSetattr;
|
||||
typedef struct Nfs3RSetattr Nfs3RSetattr;
|
||||
typedef struct Nfs3TLookup Nfs3TLookup;
|
||||
typedef struct Nfs3RLookup Nfs3RLookup;
|
||||
typedef struct Nfs3TAccess Nfs3TAccess;
|
||||
typedef struct Nfs3RAccess Nfs3RAccess;
|
||||
typedef struct Nfs3TReadlink Nfs3TReadlink;
|
||||
typedef struct Nfs3RReadlink Nfs3RReadlink;
|
||||
typedef struct Nfs3TRead Nfs3TRead;
|
||||
typedef struct Nfs3RRead Nfs3RRead;
|
||||
typedef enum
|
||||
{
|
||||
Nfs3SyncNone = 0,
|
||||
Nfs3SyncData = 1,
|
||||
Nfs3SyncFile = 2,
|
||||
} Nfs3Sync;
|
||||
|
||||
typedef struct Nfs3TWrite Nfs3TWrite;
|
||||
typedef struct Nfs3RWrite Nfs3RWrite;
|
||||
typedef enum
|
||||
{
|
||||
Nfs3CreateUnchecked = 0,
|
||||
Nfs3CreateGuarded = 1,
|
||||
Nfs3CreateExclusive = 2,
|
||||
} Nfs3Create;
|
||||
|
||||
typedef struct Nfs3TCreate Nfs3TCreate;
|
||||
typedef struct Nfs3RCreate Nfs3RCreate;
|
||||
typedef struct Nfs3TMkdir Nfs3TMkdir;
|
||||
typedef struct Nfs3RMkdir Nfs3RMkdir;
|
||||
typedef struct Nfs3TSymlink Nfs3TSymlink;
|
||||
typedef struct Nfs3RSymlink Nfs3RSymlink;
|
||||
typedef struct Nfs3TMknod Nfs3TMknod;
|
||||
typedef struct Nfs3RMknod Nfs3RMknod;
|
||||
typedef struct Nfs3TRemove Nfs3TRemove;
|
||||
typedef struct Nfs3RRemove Nfs3RRemove;
|
||||
typedef struct Nfs3TRmdir Nfs3TRmdir;
|
||||
typedef struct Nfs3RRmdir Nfs3RRmdir;
|
||||
typedef struct Nfs3TRename Nfs3TRename;
|
||||
typedef struct Nfs3RRename Nfs3RRename;
|
||||
typedef struct Nfs3TLink Nfs3TLink;
|
||||
typedef struct Nfs3RLink Nfs3RLink;
|
||||
typedef struct Nfs3TReadDir Nfs3TReadDir;
|
||||
typedef struct Nfs3Entry Nfs3Entry;
|
||||
typedef struct Nfs3RReadDir Nfs3RReadDir;
|
||||
typedef struct Nfs3TReadDirPlus Nfs3TReadDirPlus;
|
||||
typedef struct Nfs3EntryPlus Nfs3EntryPlus;
|
||||
typedef struct Nfs3RReadDirPlus Nfs3RReadDirPlus;
|
||||
typedef struct Nfs3TFsStat Nfs3TFsStat;
|
||||
typedef struct Nfs3RFsStat Nfs3RFsStat;
|
||||
typedef struct Nfs3TFsInfo Nfs3TFsInfo;
|
||||
typedef struct Nfs3RFsInfo Nfs3RFsInfo;
|
||||
typedef struct Nfs3TPathconf Nfs3TPathconf;
|
||||
typedef struct Nfs3RPathconf Nfs3RPathconf;
|
||||
typedef struct Nfs3TCommit Nfs3TCommit;
|
||||
typedef struct Nfs3RCommit Nfs3RCommit;
|
||||
|
||||
struct Nfs3Handle {
|
||||
uchar h[Nfs3MaxHandleSize];
|
||||
u32int len;
|
||||
};
|
||||
|
||||
struct Nfs3Time {
|
||||
u32int sec;
|
||||
u32int nsec;
|
||||
};
|
||||
|
||||
struct Nfs3Attr {
|
||||
Nfs3FileType type;
|
||||
u32int mode;
|
||||
u32int nlink;
|
||||
u32int uid;
|
||||
u32int gid;
|
||||
u64int size;
|
||||
u64int used;
|
||||
u32int major;
|
||||
u32int minor;
|
||||
u64int fsid;
|
||||
u64int fileid;
|
||||
Nfs3Time atime;
|
||||
Nfs3Time mtime;
|
||||
Nfs3Time ctime;
|
||||
};
|
||||
|
||||
struct Nfs3WccAttr {
|
||||
u64int size;
|
||||
Nfs3Time mtime;
|
||||
Nfs3Time ctime;
|
||||
};
|
||||
|
||||
struct Nfs3Wcc {
|
||||
u1int haveWccAttr;
|
||||
Nfs3WccAttr wccAttr;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
};
|
||||
|
||||
struct Nfs3SetAttr {
|
||||
u1int setMode;
|
||||
u32int mode;
|
||||
u1int setUid;
|
||||
u32int uid;
|
||||
u1int setGid;
|
||||
u32int gid;
|
||||
u1int setSize;
|
||||
u64int size;
|
||||
Nfs3SetTime setAtime;
|
||||
Nfs3Time atime;
|
||||
Nfs3SetTime setMtime;
|
||||
Nfs3Time mtime;
|
||||
};
|
||||
|
||||
struct Nfs3TNull {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct Nfs3RNull {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct Nfs3TGetattr {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
};
|
||||
|
||||
struct Nfs3RGetattr {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Attr attr;
|
||||
};
|
||||
|
||||
struct Nfs3TSetattr {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
Nfs3SetAttr attr;
|
||||
u1int checkCtime;
|
||||
Nfs3Time ctime;
|
||||
};
|
||||
|
||||
struct Nfs3RSetattr {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Wcc wcc;
|
||||
};
|
||||
|
||||
struct Nfs3TLookup {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct Nfs3RLookup {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Handle handle;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u1int haveDirAttr;
|
||||
Nfs3Attr dirAttr;
|
||||
};
|
||||
|
||||
struct Nfs3TAccess {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
u32int access;
|
||||
};
|
||||
|
||||
struct Nfs3RAccess {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u32int access;
|
||||
};
|
||||
|
||||
struct Nfs3TReadlink {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
};
|
||||
|
||||
struct Nfs3RReadlink {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
char *data;
|
||||
};
|
||||
|
||||
struct Nfs3TRead {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
u64int offset;
|
||||
u32int count;
|
||||
};
|
||||
|
||||
struct Nfs3RRead {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u32int count;
|
||||
u1int eof;
|
||||
uchar *data;
|
||||
u32int ndata;
|
||||
};
|
||||
|
||||
struct Nfs3TWrite {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
u64int offset;
|
||||
u32int count;
|
||||
Nfs3Sync stable;
|
||||
uchar *data;
|
||||
u32int ndata;
|
||||
};
|
||||
|
||||
struct Nfs3RWrite {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Wcc wcc;
|
||||
u32int count;
|
||||
Nfs3Sync committed;
|
||||
uchar verf[Nfs3WriteVerfSize];
|
||||
};
|
||||
|
||||
struct Nfs3TCreate {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
Nfs3Create mode;
|
||||
Nfs3SetAttr attr;
|
||||
uchar verf[Nfs3CreateVerfSize];
|
||||
};
|
||||
|
||||
struct Nfs3RCreate {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveHandle;
|
||||
Nfs3Handle handle;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
Nfs3Wcc dirWcc;
|
||||
};
|
||||
|
||||
struct Nfs3TMkdir {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
Nfs3SetAttr attr;
|
||||
};
|
||||
|
||||
struct Nfs3RMkdir {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveHandle;
|
||||
Nfs3Handle handle;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
Nfs3Wcc dirWcc;
|
||||
};
|
||||
|
||||
struct Nfs3TSymlink {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
Nfs3SetAttr attr;
|
||||
char *data;
|
||||
};
|
||||
|
||||
struct Nfs3RSymlink {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveHandle;
|
||||
Nfs3Handle handle;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
Nfs3Wcc dirWcc;
|
||||
};
|
||||
|
||||
struct Nfs3TMknod {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
Nfs3FileType type;
|
||||
Nfs3SetAttr attr;
|
||||
u32int major;
|
||||
u32int minor;
|
||||
};
|
||||
|
||||
struct Nfs3RMknod {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveHandle;
|
||||
Nfs3Handle handle;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
Nfs3Wcc dirWcc;
|
||||
};
|
||||
|
||||
struct Nfs3TRemove {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct Nfs3RRemove {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Wcc wcc;
|
||||
};
|
||||
|
||||
struct Nfs3TRmdir {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct Nfs3RRmdir {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Wcc wcc;
|
||||
};
|
||||
|
||||
struct Nfs3TRename {
|
||||
SunCall call;
|
||||
struct {
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
} from;
|
||||
struct {
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
} to;
|
||||
};
|
||||
|
||||
struct Nfs3RRename {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Wcc fromWcc;
|
||||
Nfs3Wcc toWcc;
|
||||
};
|
||||
|
||||
struct Nfs3TLink {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
struct {
|
||||
Nfs3Handle handle;
|
||||
char *name;
|
||||
} link;
|
||||
};
|
||||
|
||||
struct Nfs3RLink {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
Nfs3Wcc dirWcc;
|
||||
};
|
||||
|
||||
struct Nfs3TReadDir {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
u64int cookie;
|
||||
uchar verf[Nfs3CookieVerfSize];
|
||||
u32int count;
|
||||
};
|
||||
|
||||
struct Nfs3RReadDir {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
uchar verf[Nfs3CookieVerfSize];
|
||||
uchar *data;
|
||||
u32int count;
|
||||
u1int eof;
|
||||
};
|
||||
|
||||
struct Nfs3TReadDirPlus {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
u64int cookie;
|
||||
uchar verf[Nfs3CookieVerfSize];
|
||||
u32int dirCount;
|
||||
u32int maxCount;
|
||||
};
|
||||
|
||||
struct Nfs3Entry {
|
||||
u64int fileid;
|
||||
char *name;
|
||||
u64int cookie;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u1int haveHandle;
|
||||
Nfs3Handle handle;
|
||||
};
|
||||
|
||||
struct Nfs3RReadDirPlus {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
uchar verf[Nfs3CookieVerfSize];
|
||||
uchar *data;
|
||||
u32int count;
|
||||
u1int eof;
|
||||
};
|
||||
|
||||
struct Nfs3TFsStat {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
};
|
||||
|
||||
struct Nfs3RFsStat {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u64int totalBytes;
|
||||
u64int freeBytes;
|
||||
u64int availBytes;
|
||||
u64int totalFiles;
|
||||
u64int freeFiles;
|
||||
u64int availFiles;
|
||||
u32int invarSec;
|
||||
};
|
||||
|
||||
struct Nfs3TFsInfo {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
};
|
||||
|
||||
struct Nfs3RFsInfo {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u32int readMax;
|
||||
u32int readPref;
|
||||
u32int readMult;
|
||||
u32int writeMax;
|
||||
u32int writePref;
|
||||
u32int writeMult;
|
||||
u32int readDirPref;
|
||||
u64int maxFileSize;
|
||||
Nfs3Time timePrec;
|
||||
u32int flags;
|
||||
};
|
||||
|
||||
struct Nfs3TPathconf {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
};
|
||||
|
||||
struct Nfs3RPathconf {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
u1int haveAttr;
|
||||
Nfs3Attr attr;
|
||||
u32int maxLink;
|
||||
u32int maxName;
|
||||
u1int noTrunc;
|
||||
u1int chownRestricted;
|
||||
u1int caseInsensitive;
|
||||
u1int casePreserving;
|
||||
};
|
||||
|
||||
struct Nfs3TCommit {
|
||||
SunCall call;
|
||||
Nfs3Handle handle;
|
||||
u64int offset;
|
||||
u32int count;
|
||||
};
|
||||
|
||||
struct Nfs3RCommit {
|
||||
SunCall call;
|
||||
Nfs3Status status;
|
||||
Nfs3Wcc wcc;
|
||||
uchar verf[Nfs3WriteVerfSize];
|
||||
};
|
||||
|
||||
char *nfs3statusstr(Nfs3Status);
|
||||
char *nfs3typestr(SunCallType);
|
||||
char *nfs3settimestr(Nfs3SetTime);
|
||||
char *nfs3syncstr(Nfs3Sync);
|
||||
|
||||
void nfs3handleprint(Fmt*, Nfs3Handle*);
|
||||
u32int nfs3handlesize(Nfs3Handle*);
|
||||
int nfs3handlepack(uchar*, uchar*, uchar**, Nfs3Handle*);
|
||||
int nfs3handleunpack(uchar*, uchar*, uchar**, Nfs3Handle*);
|
||||
|
||||
void nfs3timeprint(Fmt*, Nfs3Time*);
|
||||
u32int nfs3timesize(Nfs3Time*);
|
||||
int nfs3timepack(uchar*, uchar*, uchar**, Nfs3Time*);
|
||||
int nfs3timeunpack(uchar*, uchar*, uchar**, Nfs3Time*);
|
||||
|
||||
void nfs3attrprint(Fmt*, Nfs3Attr*);
|
||||
u32int nfs3attrsize(Nfs3Attr*);
|
||||
int nfs3attrpack(uchar*, uchar*, uchar**, Nfs3Attr*);
|
||||
int nfs3attrunpack(uchar*, uchar*, uchar**, Nfs3Attr*);
|
||||
|
||||
void nfs3wccattrprint(Fmt*, Nfs3WccAttr*);
|
||||
u32int nfs3wccattrsize(Nfs3WccAttr*);
|
||||
int nfs3wccattrpack(uchar*, uchar*, uchar**, Nfs3WccAttr*);
|
||||
int nfs3wccattrunpack(uchar*, uchar*, uchar**, Nfs3WccAttr*);
|
||||
|
||||
void nfs3wccprint(Fmt*, Nfs3Wcc*);
|
||||
u32int nfs3wccsize(Nfs3Wcc*);
|
||||
int nfs3wccpack(uchar*, uchar*, uchar**, Nfs3Wcc*);
|
||||
int nfs3wccunpack(uchar*, uchar*, uchar**, Nfs3Wcc*);
|
||||
|
||||
void nfs3setattrprint(Fmt*, Nfs3SetAttr*);
|
||||
u32int nfs3setattrsize(Nfs3SetAttr*);
|
||||
int nfs3setattrpack(uchar*, uchar*, uchar**, Nfs3SetAttr*);
|
||||
int nfs3setattrunpack(uchar*, uchar*, uchar**, Nfs3SetAttr*);
|
||||
|
||||
extern SunProg nfs3prog;
|
||||
|
||||
void nfs3entryprint(Fmt*, Nfs3Entry*);
|
||||
u32int nfs3entrysize(Nfs3Entry*);
|
||||
int nfs3entrypack(uchar*, uchar*, uchar**, Nfs3Entry*);
|
||||
int nfs3entryunpack(uchar*, uchar*, uchar**, Nfs3Entry*);
|
||||
|
||||
void nfs3entryplusprint(Fmt*, Nfs3Entry*);
|
||||
u32int nfs3entryplussize(Nfs3Entry*);
|
||||
int nfs3entrypluspack(uchar*, uchar*, uchar**, Nfs3Entry*);
|
||||
int nfs3entryplusunpack(uchar*, uchar*, uchar**, Nfs3Entry*);
|
||||
|
||||
400
include/sunrpc.h
Normal file
400
include/sunrpc.h
Normal file
|
|
@ -0,0 +1,400 @@
|
|||
/*
|
||||
* Sun RPC; see RFC 1057
|
||||
*/
|
||||
|
||||
/*
|
||||
#pragma lib "libsunrpc.a"
|
||||
#pragma src "/sys/src/libsunrpc"
|
||||
*/
|
||||
|
||||
typedef uchar u1int;
|
||||
|
||||
typedef struct SunAuthInfo SunAuthInfo;
|
||||
typedef struct SunAuthUnix SunAuthUnix;
|
||||
typedef struct SunRpc SunRpc;
|
||||
typedef struct SunCall SunCall;
|
||||
|
||||
enum
|
||||
{
|
||||
/* Authinfo.flavor */
|
||||
SunAuthNone = 0,
|
||||
SunAuthSys,
|
||||
SunAuthShort,
|
||||
SunAuthDes,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
SunAcceptError = 0x10000,
|
||||
SunRejectError = 0x20000,
|
||||
SunAuthError = 0x40000,
|
||||
|
||||
/* Reply.status */
|
||||
SunSuccess = 0,
|
||||
|
||||
SunProgUnavail = SunAcceptError | 1,
|
||||
SunProgMismatch,
|
||||
SunProcUnavail,
|
||||
SunGarbageArgs,
|
||||
SunSystemErr,
|
||||
|
||||
SunRpcMismatch = SunRejectError | 0,
|
||||
|
||||
SunAuthBadCred = SunAuthError | 1,
|
||||
SunAuthRejectedCred,
|
||||
SunAuthBadVerf,
|
||||
SunAuthRejectedVerf,
|
||||
SunAuthTooWeak,
|
||||
SunAuthInvalidResp,
|
||||
SunAuthFailed,
|
||||
} SunStatus;
|
||||
|
||||
struct SunAuthInfo
|
||||
{
|
||||
uint flavor;
|
||||
uchar *data;
|
||||
uint ndata;
|
||||
};
|
||||
|
||||
struct SunAuthUnix
|
||||
{
|
||||
u32int stamp;
|
||||
char *sysname;
|
||||
u32int uid;
|
||||
u32int gid;
|
||||
u32int g[16];
|
||||
u32int ng;
|
||||
};
|
||||
|
||||
struct SunRpc
|
||||
{
|
||||
u32int xid;
|
||||
uint iscall;
|
||||
|
||||
/*
|
||||
* only sent on wire in call
|
||||
* caller fills in for the reply unpackers.
|
||||
*/
|
||||
u32int proc;
|
||||
|
||||
/* call */
|
||||
// uint proc;
|
||||
u32int prog, vers;
|
||||
SunAuthInfo cred;
|
||||
SunAuthInfo verf;
|
||||
uchar *data;
|
||||
uint ndata;
|
||||
|
||||
/* reply */
|
||||
u32int status;
|
||||
// SunAuthInfo verf;
|
||||
u32int low, high;
|
||||
// uchar *data;
|
||||
// uint ndata;
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SunCallTypeTNull,
|
||||
SunCallTypeRNull,
|
||||
} SunCallType;
|
||||
|
||||
struct SunCall
|
||||
{
|
||||
SunRpc rpc;
|
||||
SunCallType type;
|
||||
};
|
||||
|
||||
void sunerrstr(SunStatus);
|
||||
|
||||
void sunrpcprint(Fmt*, SunRpc*);
|
||||
uint sunrpcsize(SunRpc*);
|
||||
SunStatus sunrpcpack(uchar*, uchar*, uchar**, SunRpc*);
|
||||
SunStatus sunrpcunpack(uchar*, uchar*, uchar**, SunRpc*);
|
||||
|
||||
void sunauthinfoprint(Fmt*, SunAuthInfo*);
|
||||
uint sunauthinfosize(SunAuthInfo*);
|
||||
int sunauthinfopack(uchar*, uchar*, uchar**, SunAuthInfo*);
|
||||
int sunauthinfounpack(uchar*, uchar*, uchar**, SunAuthInfo*);
|
||||
|
||||
void sunauthunixprint(Fmt*, SunAuthUnix*);
|
||||
uint sunauthunixsize(SunAuthUnix*);
|
||||
int sunauthunixpack(uchar*, uchar*, uchar**, SunAuthUnix*);
|
||||
int sunauthunixunpack(uchar*, uchar*, uchar**, SunAuthUnix*);
|
||||
|
||||
int sunenumpack(uchar*, uchar*, uchar**, int*);
|
||||
int sunenumunpack(uchar*, uchar*, uchar**, int*);
|
||||
int sunuint1pack(uchar*, uchar*, uchar**, u1int*);
|
||||
int sunuint1unpack(uchar*, uchar*, uchar**, u1int*);
|
||||
|
||||
int sunstringpack(uchar*, uchar*, uchar**, char**, u32int);
|
||||
int sunstringunpack(uchar*, uchar*, uchar**, char**, u32int);
|
||||
uint sunstringsize(char*);
|
||||
|
||||
int sunuint32pack(uchar*, uchar*, uchar**, u32int*);
|
||||
int sunuint32unpack(uchar*, uchar*, uchar**, u32int*);
|
||||
int sunuint64pack(uchar*, uchar*, uchar**, u64int*);
|
||||
int sunuint64unpack(uchar*, uchar*, uchar**, u64int*);
|
||||
|
||||
int sunvaropaquepack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
|
||||
int sunvaropaqueunpack(uchar*, uchar*, uchar**, uchar**, u32int*, u32int);
|
||||
uint sunvaropaquesize(u32int);
|
||||
|
||||
int sunfixedopaquepack(uchar*, uchar*, uchar**, uchar*, u32int);
|
||||
int sunfixedopaqueunpack(uchar*, uchar*, uchar**, uchar*, u32int);
|
||||
uint sunfixedopaquesize(u32int);
|
||||
|
||||
/*
|
||||
* Sun RPC Program
|
||||
*/
|
||||
typedef struct SunProc SunProc;
|
||||
typedef struct SunProg SunProg;
|
||||
struct SunProg
|
||||
{
|
||||
uint prog;
|
||||
uint vers;
|
||||
SunProc *proc;
|
||||
int nproc;
|
||||
};
|
||||
|
||||
struct SunProc
|
||||
{
|
||||
int (*pack)(uchar*, uchar*, uchar**, SunCall*);
|
||||
int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
|
||||
uint (*size)(SunCall*);
|
||||
void (*fmt)(Fmt*, SunCall*);
|
||||
uint sizeoftype;
|
||||
};
|
||||
|
||||
SunStatus suncallpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
|
||||
SunStatus suncallunpack(SunProg*, uchar*, uchar*, uchar**, SunCall*);
|
||||
SunStatus suncallunpackalloc(SunProg*, SunCallType, uchar*, uchar*, uchar**, SunCall**);
|
||||
void suncallsetup(SunCall*, SunProg*, uint);
|
||||
uint suncallsize(SunProg*, SunCall*);
|
||||
|
||||
/*
|
||||
* Formatting
|
||||
#pragma varargck type "B" SunRpc*
|
||||
#pragma varargck type "C" SunCall*
|
||||
*/
|
||||
|
||||
int sunrpcfmt(Fmt*);
|
||||
int suncallfmt(Fmt*);
|
||||
void sunfmtinstall(SunProg*);
|
||||
|
||||
|
||||
/*
|
||||
* Sun RPC Server
|
||||
*/
|
||||
typedef struct SunMsg SunMsg;
|
||||
typedef struct SunSrv SunSrv;
|
||||
|
||||
enum
|
||||
{
|
||||
SunStackSize = 32768,
|
||||
};
|
||||
|
||||
struct SunMsg
|
||||
{
|
||||
uchar *data;
|
||||
int count;
|
||||
SunSrv *srv;
|
||||
SunRpc rpc;
|
||||
SunProg *pg;
|
||||
SunCall *call;
|
||||
Channel *creply; /* chan(SunMsg*) */
|
||||
};
|
||||
|
||||
struct SunSrv
|
||||
{
|
||||
int chatty;
|
||||
int cachereplies;
|
||||
int alwaysreject;
|
||||
int localonly;
|
||||
int localparanoia;
|
||||
SunProg **map;
|
||||
Channel *crequest;
|
||||
|
||||
/* implementation use only */
|
||||
Channel **cdispatch;
|
||||
SunProg **prog;
|
||||
int nprog;
|
||||
void *cache;
|
||||
Channel *creply;
|
||||
Channel *cthread;
|
||||
};
|
||||
|
||||
SunSrv *sunsrv(void);
|
||||
|
||||
void sunsrvprog(SunSrv *srv, SunProg *prog, Channel *c);
|
||||
int sunsrvannounce(SunSrv *srv, char *address);
|
||||
int sunsrvudp(SunSrv *srv, char *address);
|
||||
int sunsrvnet(SunSrv *srv, char *address);
|
||||
int sunsrvfd(SunSrv *srv, int fd);
|
||||
void sunsrvthreadcreate(SunSrv *srv, void (*fn)(void*), void*);
|
||||
void sunsrvclose(SunSrv*);
|
||||
|
||||
int sunmsgreply(SunMsg*, SunCall*);
|
||||
int sunmsgdrop(SunMsg*);
|
||||
int sunmsgreplyerror(SunMsg*, SunStatus);
|
||||
|
||||
/*
|
||||
* Sun RPC Client
|
||||
*/
|
||||
typedef struct SunClient SunClient;
|
||||
|
||||
struct SunClient
|
||||
{
|
||||
int fd;
|
||||
int chatty;
|
||||
int needcount;
|
||||
ulong maxwait;
|
||||
ulong xidgen;
|
||||
int nsend;
|
||||
int nresend;
|
||||
struct {
|
||||
ulong min;
|
||||
ulong max;
|
||||
ulong avg;
|
||||
} rtt;
|
||||
Channel *dying;
|
||||
Channel *rpcchan;
|
||||
Channel *timerchan;
|
||||
Channel *flushchan;
|
||||
Channel *readchan;
|
||||
SunProg **prog;
|
||||
int nprog;
|
||||
int timertid;
|
||||
int nettid;
|
||||
};
|
||||
|
||||
SunClient *sundial(char*);
|
||||
|
||||
int sunclientrpc(SunClient*, ulong, SunCall*, SunCall*, uchar**);
|
||||
void sunclientclose(SunClient*);
|
||||
void sunclientflushrpc(SunClient*, ulong);
|
||||
void sunclientprog(SunClient*, SunProg*);
|
||||
|
||||
|
||||
/*
|
||||
* Provided by callers.
|
||||
* Should remove dependence on this, but hard.
|
||||
*/
|
||||
void *emalloc(ulong);
|
||||
void *erealloc(void*, ulong);
|
||||
|
||||
|
||||
/*
|
||||
* Sun RPC port mapper; see RFC 1057 Appendix A
|
||||
*/
|
||||
|
||||
typedef struct PortMap PortMap;
|
||||
typedef struct PortTNull PortTNull;
|
||||
typedef struct PortRNull PortRNull;
|
||||
typedef struct PortTSet PortTSet;
|
||||
typedef struct PortRSet PortRSet;
|
||||
typedef struct PortTUnset PortTUnset;
|
||||
typedef struct PortRUnset PortRUnset;
|
||||
typedef struct PortTGetport PortTGetport;
|
||||
typedef struct PortRGetport PortRGetport;
|
||||
typedef struct PortTDump PortTDump;
|
||||
typedef struct PortRDump PortRDump;
|
||||
typedef struct PortTCallit PortTCallit;
|
||||
typedef struct PortRCallit PortRCallit;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PortCallTNull,
|
||||
PortCallRNull,
|
||||
PortCallTSet,
|
||||
PortCallRSet,
|
||||
PortCallTUnset,
|
||||
PortCallRUnset,
|
||||
PortCallTGetport,
|
||||
PortCallRGetport,
|
||||
PortCallTDump,
|
||||
PortCallRDump,
|
||||
PortCallTCallit,
|
||||
PortCallRCallit,
|
||||
} PortCallType;
|
||||
|
||||
enum
|
||||
{
|
||||
PortProgram = 100000,
|
||||
PortVersion = 2,
|
||||
|
||||
PortProtoTcp = 6, /* protocol number for TCP/IP */
|
||||
PortProtoUdp = 17 /* protocol number for UDP/IP */
|
||||
};
|
||||
|
||||
struct PortMap {
|
||||
u32int prog;
|
||||
u32int vers;
|
||||
u32int prot;
|
||||
u32int port;
|
||||
};
|
||||
|
||||
struct PortTNull {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct PortRNull {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct PortTSet {
|
||||
SunCall call;
|
||||
PortMap map;
|
||||
};
|
||||
|
||||
struct PortRSet {
|
||||
SunCall call;
|
||||
u1int b;
|
||||
};
|
||||
|
||||
struct PortTUnset {
|
||||
SunCall call;
|
||||
PortMap map;
|
||||
};
|
||||
|
||||
struct PortRUnset {
|
||||
SunCall call;
|
||||
u1int b;
|
||||
};
|
||||
|
||||
struct PortTGetport {
|
||||
SunCall call;
|
||||
PortMap map;
|
||||
};
|
||||
|
||||
struct PortRGetport {
|
||||
SunCall call;
|
||||
u32int port;
|
||||
};
|
||||
|
||||
struct PortTDump {
|
||||
SunCall call;
|
||||
};
|
||||
|
||||
struct PortRDump {
|
||||
SunCall call;
|
||||
PortMap *map;
|
||||
int nmap;
|
||||
};
|
||||
|
||||
struct PortTCallit {
|
||||
SunCall call;
|
||||
u32int prog;
|
||||
u32int vers;
|
||||
u32int proc;
|
||||
uchar *data;
|
||||
u32int count;
|
||||
};
|
||||
|
||||
struct PortRCallit {
|
||||
SunCall call;
|
||||
u32int port;
|
||||
uchar *data;
|
||||
u32int count;
|
||||
};
|
||||
|
||||
extern SunProg portprog;
|
||||
Loading…
Add table
Add a link
Reference in a new issue