Changes for Windows NT port
[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.36  1997/05/08 00:10:15  mjrg
48  * Changes for Windows NT port
49  *
50  * Revision 1.35  1997/04/29 23:04:50  mjrg
51  * added explicit "int" to declaration
52  *
53  * Revision 1.34  1997/04/21 16:57:39  hseom
54  * added support for trace data (in a byte array)
55  *
56  * Revision 1.1.1.3  1997/04/01 20:37:56  buck
57  * Update Maryland repository with latest from Wisconsin.
58  *
59  * Revision 1.33  1997/01/21 20:09:49  mjrg
60  * Added support for unix domain sockets.
61  * Added getHostName function
62  *
63  * Revision 1.32  1997/01/16 20:51:40  tamches
64  * removed RPC_undo_arg_list
65  *
66  * Revision 1.31  1996/08/16 21:30:42  tamches
67  * updated copyright for release 1.1
68  *
69  * Revision 1.30  1996/05/31 23:41:08  tamches
70  * removed pid from XDRrpc
71  *
72  * Revision 1.29  1995/11/22 00:05:54  mjrg
73  * Updates for paradyndPVM on solaris
74  * Fixed problem with wrong daemon getting connection to paradyn
75  * Removed -f and -t arguments to paradyn
76  * Added cleanUpAndExit to clean up and exit from pvm before we exit paradynd
77  * Fixed bug in my previous commit
78  *
79  * Revision 1.28  1995/05/18  11:11:35  markc
80  * add P_xdrrec_eof
81  *
82  * Revision 1.27  1995/02/16  09:27:11  markc
83  * Modified code to remove compiler warnings.
84  * Added #defines to simplify inlining.
85  * Cleaned up Object file classes.
86  *
87  * Revision 1.26  1994/11/11  06:59:09  markc
88  * Added additional argument to RPC_make_arg_list and RPC_undo_arg_list to
89  * support remote executition for paradyndPVM.
90  *
91  * Revision 1.25  1994/11/01  16:07:33  markc
92  * Added Object classes that provide os independent symbol tables.
93  * Added stl-like container classes with iterators.
94  *
95  * Revision 1.24  1994/10/12  20:22:08  krisna
96  * hpux update
97  *
98  * Revision 1.23  1994/09/22  03:18:05  markc
99  * changes to remove compiler warnings
100  * changed pid passed to RPCprocessCreate
101  *
102  */
103
104 #include "util/h/headers.h"
105 #include "util/h/String.h"
106 // trace data streams
107 #include "util/h/ByteArray.h"
108 #include "util/h/Vector.h"
109
110 // Boolean defined for igen -- xdr_bool uses an int, which clashes with gcc
111 // typedef bool Boolean;
112
113 extern bool RPC_readReady (int fd, int timeout=0);
114
115 //
116 // Functions common to server and client side.
117 //
118 class XDRrpc {
119 public:
120   XDRrpc(const string &machine, const string &user, const string &program,
121          xdr_rd_func r, xdr_wr_func w,
122          const vector<string> &arg_list, const bool nblock, const int wellKnownPortFd);
123   XDRrpc(const int use_fd, xdr_rd_func readRoutine, xdr_wr_func writeRoutine,
124          const bool nblock);
125   XDRrpc(int family, int port, int type, const string machine,
126          xdr_rd_func readFunc, xdr_wr_func writeFunc, const bool block);
127   ~XDRrpc();
128   // This function does work on Windows NT. Since it is not being used
129   // anywhere, I'm commenting it out -- mjrg
130   //void setNonBlock() { if (fd >= 0) fcntl (fd, F_SETFL, O_NONBLOCK); }
131   void closeConnect() {if (fd >= 0) close(fd); fd = -1; }
132   int get_fd() const { return fd; }
133   int readReady(const int timeout=0) { return RPC_readReady (fd, timeout); }
134
135   void setDirEncode() {xdrs->x_op = XDR_ENCODE;}
136   void setDirDecode() {xdrs->x_op = XDR_DECODE;}
137   XDR *net_obj() { return xdrs;}
138   bool opened() const { return (xdrs && (fd >= 0));}
139
140  private:
141   // Since we haven't defined these, private makes sure they're not used. -ari
142   XDRrpc(const XDRrpc &);
143   XDRrpc &operator=(const XDRrpc &);
144
145   XDR *xdrs;
146   int fd;
147 };
148
149 //
150 // common routines that are transport independent.
151 //
152 class RPCBase {
153 public:
154   RPCBase(const int st=0, const int v=0) { err_state = st; versionVerifyDone = v;}
155   // ~RPCBase() { }
156   int get_err_state() const { return err_state;}
157   void clear_err_state() {err_state = 0;}
158   int did_error_occur() const {return (err_state != 0);}
159   bool getVersionVerifyDone() const { return versionVerifyDone;}
160   void setVersionVerifyDone() { versionVerifyDone = true;}
161   void set_err_state(const int s) { err_state = s;}
162
163  private:
164   // Since we haven't defined these, private makes sure they're not used. -ari
165   RPCBase(const RPCBase &);
166   RPCBase &operator=(const RPCBase &);
167
168   bool versionVerifyDone;
169   int err_state;
170 };
171
172 class THREADrpc {
173 public:
174   THREADrpc(const unsigned t) { tid = t; }
175   // ~THREADrpc() { }
176   void setTid(const unsigned id) { tid = id; }
177   unsigned getTid() const { return tid;}
178
179   // see not on requestingThread, the use of this may be unsafe
180   unsigned getRequestingThread() const { return requestingThread; }
181   void setRequestingThread(const unsigned t) { requestingThread = t;}
182   unsigned net_obj() const { return tid;}
183
184  private:
185   unsigned tid;
186   // these are only to be used by implmentors of thread RPCs.
187   //   the value is only valid during a thread RPC.
188   unsigned requestingThread;
189 };
190
191 extern int RPC_setup_socket (int &sfd,   // return file descriptor
192                              const int family, // AF_INET ...
193                              const int type);   // SOCK_STREAM ...
194
195 // setup a unix domain socket
196 extern bool RPC_setup_socket_un(int &sfd, const char *path);
197
198
199 extern bool_t xdr_string_pd(XDR*, string*);
200 // trace data streams
201 extern bool_t xdr_byteArray_pd(XDR *, byteArray *);
202 extern bool_t xdr_Boolean(XDR*, bool*);   
203
204 inline bool_t P_xdr_string_pd(XDR *x, string *s) {
205   return (xdr_string_pd(x, s));}
206 // trace data streams
207 inline bool_t P_xdr_byteArray_pd(XDR *x, byteArray *s) {
208   return (xdr_byteArray_pd(x, s));}
209
210 inline bool_t P_xdr_Boolean(XDR *x, bool *b) {
211   return (xdr_Boolean(x, b));}
212
213 extern int RPCprocessCreate(const string hostName, const string userName,
214                             const string commandLine,
215                             const vector<string> &arg_list,
216                             int wellKnownPort = 0,
217                             const bool useRexec=false);
218
219 extern bool RPC_make_arg_list (vector<string> &list, const int port, 
220                                const int flag, const int firstPVM,
221                                const string machineName, const bool useMachine);
222
223 extern int RPC_getConnect (const int fd);
224
225 extern bool RPCgetArg(vector<string> &ret, const char *input);
226
227 extern double timing_loop(const unsigned TRIES=1,
228                           const unsigned LOOP_LIMIT=100000);
229
230 extern string getHostName();
231
232 #endif