Changes made for nonblocking write
[dyninst.git] / pdutil / h / rpcUtil.h
1 /*
2  * Copyright (c) 1996 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 #ifndef RPC_UTIL
43 #define RPC_UTIL
44
45 /*
46  * $Log: rpcUtil.h,v $
47  * Revision 1.37  1997/05/17 20:00:58  lzheng
48  * Changes made for nonblocking write
49  *
50  * Revision 1.36  1997/05/08 00:10:15  mjrg
51  * Changes for Windows NT port
52  *
53  * Revision 1.35  1997/04/29 23:04:50  mjrg
54  * added explicit "int" to declaration
55  *
56  * Revision 1.34  1997/04/21 16:57:39  hseom
57  * added support for trace data (in a byte array)
58  *
59  * Revision 1.1.1.3  1997/04/01 20:37:56  buck
60  * Update Maryland repository with latest from Wisconsin.
61  *
62  * Revision 1.33  1997/01/21 20:09:49  mjrg
63  * Added support for unix domain sockets.
64  * Added getHostName function
65  *
66  * Revision 1.32  1997/01/16 20:51:40  tamches
67  * removed RPC_undo_arg_list
68  *
69  * Revision 1.31  1996/08/16 21:30:42  tamches
70  * updated copyright for release 1.1
71  *
72  * Revision 1.30  1996/05/31 23:41:08  tamches
73  * removed pid from XDRrpc
74  *
75  * Revision 1.29  1995/11/22 00:05:54  mjrg
76  * Updates for paradyndPVM on solaris
77  * Fixed problem with wrong daemon getting connection to paradyn
78  * Removed -f and -t arguments to paradyn
79  * Added cleanUpAndExit to clean up and exit from pvm before we exit paradynd
80  * Fixed bug in my previous commit
81  *
82  * Revision 1.28  1995/05/18  11:11:35  markc
83  * add P_xdrrec_eof
84  *
85  * Revision 1.27  1995/02/16  09:27:11  markc
86  * Modified code to remove compiler warnings.
87  * Added #defines to simplify inlining.
88  * Cleaned up Object file classes.
89  *
90  * Revision 1.26  1994/11/11  06:59:09  markc
91  * Added additional argument to RPC_make_arg_list and RPC_undo_arg_list to
92  * support remote executition for paradyndPVM.
93  *
94  * Revision 1.25  1994/11/01  16:07:33  markc
95  * Added Object classes that provide os independent symbol tables.
96  * Added stl-like container classes with iterators.
97  *
98  * Revision 1.24  1994/10/12  20:22:08  krisna
99  * hpux update
100  *
101  * Revision 1.23  1994/09/22  03:18:05  markc
102  * changes to remove compiler warnings
103  * changed pid passed to RPCprocessCreate
104  *
105  */
106
107 #include "util/h/headers.h"
108 #include "util/h/String.h"
109 // trace data streams
110 #include "util/h/ByteArray.h"
111 #include "util/h/Vector.h"
112 #include "util/h/vectorSet.h"
113
114 // Boolean defined for igen -- xdr_bool uses an int, which clashes with gcc
115 // typedef bool Boolean;
116
117 extern bool RPC_readReady (int fd, int timeout=0);
118
119 //
120 // Functions common to server and client side.
121 //
122 class XDRrpc {
123 public:
124   XDRrpc(const string &machine, const string &user, const string &program,
125          xdr_rd_func r, xdr_wr_func w,
126          const vector<string> &arg_list, const int nblock, const int wellKnownPortFd);
127   XDRrpc(const int use_fd, xdr_rd_func readRoutine, xdr_wr_func writeRoutine,
128          const int nblock);
129   XDRrpc(int family, int port, int type, const string machine,
130          xdr_rd_func readFunc, xdr_wr_func writeFunc, const int nblock);
131   ~XDRrpc();
132   // This function does work on Windows NT. Since it is not being used
133   // anywhere, I'm commenting it out -- mjrg
134   //void setNonBlock() { if (fd >= 0) fcntl (fd, F_SETFL, O_NONBLOCK); }
135   void closeConnect() {if (fd >= 0) close(fd); fd = -1; }
136   int get_fd() const { return fd; }
137   int readReady(const int timeout=0) { return RPC_readReady (fd, timeout); }
138
139   void setDirEncode() {xdrs->x_op = XDR_ENCODE;}
140   void setDirDecode() {xdrs->x_op = XDR_DECODE;}
141   XDR *net_obj() { return xdrs;}
142   bool opened() const { return (xdrs && (fd >= 0));}
143
144  private:
145   // Since we haven't defined these, private makes sure they're not used. -ari
146   XDRrpc(const XDRrpc &);
147   XDRrpc &operator=(const XDRrpc &);
148
149   XDR *xdrs;
150   int fd;
151 };
152
153 //
154 // common routines that are transport independent.
155 //
156 class RPCBase {
157 public:
158   RPCBase(const int st=0, const int v=0) { err_state = st; versionVerifyDone = v;}
159   // ~RPCBase() { }
160   int get_err_state() const { return err_state;}
161   void clear_err_state() {err_state = 0;}
162   int did_error_occur() const {return (err_state != 0);}
163   bool getVersionVerifyDone() const { return versionVerifyDone;}
164   void setVersionVerifyDone() { versionVerifyDone = true;}
165   void set_err_state(const int s) { err_state = s;}
166
167  private:
168   // Since we haven't defined these, private makes sure they're not used. -ari
169   RPCBase(const RPCBase &);
170   RPCBase &operator=(const RPCBase &);
171
172   bool versionVerifyDone;
173   int err_state;
174 };
175
176 class THREADrpc {
177 public:
178   THREADrpc(const unsigned t) { tid = t; }
179   // ~THREADrpc() { }
180   void setTid(const unsigned id) { tid = id; }
181   unsigned getTid() const { return tid;}
182
183   // see not on requestingThread, the use of this may be unsafe
184   unsigned getRequestingThread() const { return requestingThread; }
185   void setRequestingThread(const unsigned t) { requestingThread = t;}
186   unsigned net_obj() const { return tid;}
187
188  private:
189   unsigned tid;
190   // these are only to be used by implmentors of thread RPCs.
191   //   the value is only valid during a thread RPC.
192   unsigned requestingThread;
193 };
194
195 extern int RPC_setup_socket (int &sfd,   // return file descriptor
196                              const int family, // AF_INET ...
197                              const int type);   // SOCK_STREAM ...
198
199 // setup a unix domain socket
200 extern bool RPC_setup_socket_un(int &sfd, const char *path);
201
202
203 extern bool_t xdr_string_pd(XDR*, string*);
204 // trace data streams
205 extern bool_t xdr_byteArray_pd(XDR *, byteArray *);
206 extern bool_t xdr_Boolean(XDR*, bool*);   
207
208 inline bool_t P_xdr_string_pd(XDR *x, string *s) {
209   return (xdr_string_pd(x, s));}
210 // trace data streams
211 inline bool_t P_xdr_byteArray_pd(XDR *x, byteArray *s) {
212   return (xdr_byteArray_pd(x, s));}
213
214 inline bool_t P_xdr_Boolean(XDR *x, bool *b) {
215   return (xdr_Boolean(x, b));}
216
217 extern int RPCprocessCreate(const string hostName, const string userName,
218                             const string commandLine,
219                             const vector<string> &arg_list,
220                             int wellKnownPort = 0,
221                             const bool useRexec=false);
222
223 extern bool RPC_make_arg_list (vector<string> &list, const int port, 
224                                const int flag, const int firstPVM,
225                                const string machineName, const bool useMachine);
226
227 extern int RPC_getConnect (const int fd);
228
229 extern bool RPCgetArg(vector<string> &ret, const char *input);
230
231 extern double timing_loop(const unsigned TRIES=1,
232                           const unsigned LOOP_LIMIT=100000);
233
234 extern string getHostName();
235
236 class rpcBuffer {
237   public:
238     int fd;
239     char *buf;
240     int len;
241 };
242
243 #endif