Updated scheme for creating remote processes, implemented this scheme for
[dyninst.git] / common / h / rpcUtil.h
1 /*
2  * Copyright (c) 1996-1999 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 // $Id: rpcUtil.h,v 1.43 1999/12/17 16:11:14 pcroth Exp $
46
47 #include "util/h/headers.h"
48 #include "util/h/pdsocket.h"
49 #include "util/h/String.h"
50 // trace data streams
51 #include "util/h/ByteArray.h"
52 #include "util/h/Vector.h"
53 #include "util/h/vectorSet.h"
54
55
56 /* define following variables are needed for linux platform as they are
57    missed in /usr/include/sys/file.h                                     */
58 #if defined(i386_unknown_linux2_0)
59   #define FSYNC O_FSYNC
60 #endif
61
62 // Boolean defined for igen -- xdr_bool uses an int, which clashes with gcc
63 // typedef bool Boolean;
64
65 extern bool RPC_readReady (PDSOCKET sock, int timeout=0);
66
67 //
68 // Functions common to server and client side.
69 //
70 class XDRrpc {
71 public:
72   XDRrpc(const string &machine, const string &user, const string &program,
73          const string &remote_shell, xdr_rd_func r, xdr_wr_func w,
74          const vector<string> &arg_list, const int nblock, PDSOCKET wellKnownSock);
75   XDRrpc(PDSOCKET use_sock, xdr_rd_func readRoutine, xdr_wr_func writeRoutine,
76          const int nblock);
77   XDRrpc(int family, int port, int type, const string machine,
78          xdr_rd_func readFunc, xdr_wr_func writeFunc, const int nblock);
79   ~XDRrpc();
80   // This function does work on Windows NT. Since it is not being used
81   // anywhere, I'm commenting it out -- mjrg
82   //void setNonBlock() { if (fd >= 0) fcntl (fd, F_SETFL, O_NONBLOCK); }
83   void closeConnect() {if (sock != PDSOCKET_ERROR) CLOSEPDSOCKET(sock); sock = INVALID_PDSOCKET; }
84   PDSOCKET get_sock() const { return sock; }
85   int readReady(const int timeout=0) { return RPC_readReady (sock, timeout); }
86
87   void setDirEncode() {xdrs->x_op = XDR_ENCODE;}
88   void setDirDecode() {xdrs->x_op = XDR_DECODE;}
89   XDR *net_obj() { return xdrs;}
90   bool opened() const { return (xdrs && (sock != PDSOCKET_ERROR));}
91
92  private:
93   // Since we haven't defined these, private makes sure they're not used. -ari
94   XDRrpc(const XDRrpc &);
95   XDRrpc &operator=(const XDRrpc &);
96
97   XDR *xdrs;
98   PDSOCKET sock;
99 };
100
101 //
102 // common routines that are transport independent.
103 //
104 class RPCBase {
105 public:
106   RPCBase(const int st=0, bool v=0) { err_state = st; versionVerifyDone = v;}
107   // ~RPCBase() { }
108   int get_err_state() const { return err_state;}
109   void clear_err_state() {err_state = 0;}
110   int did_error_occur() const {return (err_state != 0);}
111   bool getVersionVerifyDone() const { return versionVerifyDone;}
112   void setVersionVerifyDone() { versionVerifyDone = true;}
113   void set_err_state(const int s) { err_state = s;}
114
115  private:
116   // Since we haven't defined these, private makes sure they're not used. -ari
117   RPCBase(const RPCBase &);
118   RPCBase &operator=(const RPCBase &);
119
120   bool versionVerifyDone;
121   int err_state;
122 };
123
124 extern int RPC_setup_socket (PDSOCKET &sfd,   // return file descriptor
125                              const int family, // AF_INET ...
126                              const int type);   // SOCK_STREAM ...
127
128 #if !defined(i386_unknown_nt4_0)
129 // setup a unix domain socket
130 extern bool RPC_setup_socket_un(PDSOCKET &sfd, const char *path);
131 #endif // !defined(i386_unknown_nt4_0)
132
133 extern bool_t xdr_string_pd(XDR*, string*);
134 // trace data streams
135 extern bool_t xdr_byteArray_pd(XDR *, byteArray *);
136 extern bool_t xdr_Boolean(XDR*, bool*);   
137
138 inline bool_t P_xdr_string_pd(XDR *x, string *s) {
139   return (xdr_string_pd(x, s));}
140 // trace data streams
141 inline bool_t P_xdr_byteArray_pd(XDR *x, byteArray *s) {
142   return (xdr_byteArray_pd(x, s));}
143
144 inline bool_t P_xdr_Boolean(XDR *x, bool *b) {
145   return (xdr_Boolean(x, b));}
146
147 extern PDSOCKET RPCprocessCreate(const string hostName, const string userName,
148                             const string commandLine, const string remote_shell,
149                             const vector<string> &arg_list,
150                             int wellKnownPort = 0);
151
152 extern bool RPC_make_arg_list (vector<string> &list, const int port, 
153                                const int flag, const int firstPVM,
154                                const string machineName, const bool useMachine);
155
156 extern PDSOCKET RPC_getConnect (PDSOCKET fd);
157
158 extern bool RPCgetArg(vector<string> &ret, const char *input);
159
160 extern double timing_loop(const unsigned TRIES=1,
161                           const unsigned LOOP_LIMIT=100000);
162
163 extern string getHostName();
164
165 class rpcBuffer {
166   public:
167     PDSOCKET fd;
168     char *buf;
169     int len;
170 };
171
172 #endif