Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * 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**);
uint sunCallSize(SunProg*, SunCall*);
void sunCallSetup(SunCall*, SunProg*, uint);

/*
 * 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 = 8192,
};

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;
        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;