Added option to specify timeout on readReady.
[dyninst.git] / pdutil / h / rpcUtil.h
1
2 #ifndef RPC_UTIL
3 #define RPC_UTIL
4
5 /*
6  * $Log: rpcUtil.h,v $
7  * Revision 1.14  1994/03/25 16:07:31  markc
8  * Added option to specify timeout on readReady.
9  *
10  * Revision 1.13  1994/03/20  01:45:23  markc
11  * Changed xdr_Boolean to char rather than int to reflect Boolean change.
12  *
13  * Revision 1.12  1994/03/11  21:01:24  hollings
14  * Changed Boolean from int to char to match X11 convention.
15  *
16  *
17  */
18
19 /* prevents malloc from being redefined */
20 #ifdef MIPS
21 #define MALLOC_DEFINED_AS_VOID
22 #endif
23
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include <errno.h>
28 #include <assert.h>
29 #include <fcntl.h>
30 #include <memory.h>
31 #include <sys/types.h>
32 #include <sys/socket.h>
33 #include <netinet/in.h>
34 #include <netdb.h>
35 #include <sys/time.h>
36 #include <unistd.h>
37 #include <sys/file.h>
38
39 extern "C" {
40 #include <rpc/types.h>
41 #include <rpc/xdr.h>
42 }
43
44 // functions that g++-fixincludes missed
45 #ifdef MIPS
46 void bzero (char*, int);
47 int select (int, fd_set*, fd_set*, fd_set*, struct timeval*);
48 char *strdup (char*);
49 int gethostname(char*, int);
50 int socket(int, int, int);
51 int bind(int s, struct sockaddr *, int);
52 int getsockname(int, struct sockaddr*, int *);
53 int listen(int, int);
54 int connect(int s, struct sockaddr*, int);
55 int socketpair(int, int, int, int sv[2]);
56 int vfork();
57 int accept(int, struct sockaddr *addr, int *);
58 #endif
59
60 #define xdr_Boolean xdr_char
61 typedef XDR *XDRptr;
62 typedef int (*xdrIOFunc)(int handle, char *buf, unsigned int len);
63
64 typedef char Boolean;
65 typedef char *String;
66
67 //
68 // Functions common to server and client side.
69 //
70 class XDRrpc {
71   public:
72     XDRrpc(char *m, char *u, char *p, xdrIOFunc, xdrIOFunc, 
73            char **arg_list=0, int nblock=0);
74     XDRrpc(int fd, xdrIOFunc readRoutine, xdrIOFunc writeRoutine, int nblock=0);
75     XDRrpc(int family, int port, int type, char *machine, xdrIOFunc readFunc,
76            xdrIOFunc writeFunc, int nblock=0);
77     virtual ~XDRrpc();
78     void closeConnect() { if (fd >= 0) close(fd); fd = -1;}
79     void setNonBlock();
80     int get_fd() { return fd;}
81     int readReady(int timeout=0);
82     XDR *__xdrs__;
83     int fd;
84     int pid;            // pid of child;
85     // should the fd be closed by a destructor ??
86 };
87
88 class THREADrpc {
89   public:
90     THREADrpc(int tid);
91     void setNonBlock() { ; }
92     void setTid(int id) { tid = id; }
93   protected:
94     int tid;
95     // these are only to be used by implmentors of thread RPCs.
96     //   the value is only valid during a thread RPC.
97     unsigned int requestingThread;
98     unsigned int getRequestingThread()  { return requestingThread; }
99 };
100
101
102 //
103 // client side common routines that are transport independent.
104 //
105 class RPCUser {
106   public:
107     void awaitResponce(int tag);
108     void verifyProtocolAndVersion();
109 };
110
111 //
112 // server side routines that are transport independent.
113 //
114 class RPCServer {
115   public:
116         int __versionVerifyDone__;
117 };
118
119 extern int RPC_readReady (int fd, int timeout=0);
120 extern int RPC_setup_socket (int *sfd,   // return file descriptor
121                              int family, // AF_INET ...
122                              int type);   // SOCK_STREAM ...
123 extern int xdr_String(XDR*, String*);
124 extern int RPCprocessCreate(int *pid, char *hostName, char *userName,
125                             char *commandLine, char **arg_list = 0);
126 extern char **RPC_make_arg_list (char *program, int family, int type, int port, int flag);
127 extern int 
128 RPC_undo_arg_list (int argc, char **arg_list, char **machine, int &family,
129                    int &type, int &well_known_socket, int &flag);
130 extern int RPC_getConnect (int fd);
131
132 #endif