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