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