Trivial change to compile under ultrix
[dyninst.git] / pdutil / src / rpcUtil.C
1
2 //
3 // This file defines a set of utility routines for RPC services.
4 //
5 //
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include <assert.h>
10 #include <sys/types.h>
11 #include <sys/socket.h>
12
13 extern "C" {
14 #include <rpc/types.h>
15 }
16 #include "util/h/rpcUtil.h"
17
18 int RPCdefaultXDRRead(int handle, char *buf, u_int len)
19 {
20     int ret;
21
22     do {
23         ret = read(handle, buf, len);
24     } while (ret < 0 && errno == EINTR);
25
26     if (ret <= 0) return(-1);
27     return (ret);
28 }
29
30 int RPCdefaultXDRWrite(int handle, char *buf, u_int len)
31 {
32     int ret;
33
34     do {
35         ret = write(handle, buf, len);
36     } while (ret < 0 && errno == EINTR);
37     assert(ret == len);
38     return (ret);
39 }
40
41 //
42 // prepare for RPC's to be done/received on the passed fd.
43 //
44 XDRrpc::XDRrpc(int f, xdrIOFunc readRoutine, xdrIOFunc writeRoutine)
45 {
46     fd = f;
47     __xdrs__ = (XDR *) malloc(sizeof(XDR));
48     if (!readRoutine) readRoutine = RPCdefaultXDRRead;
49     if (!writeRoutine) writeRoutine = RPCdefaultXDRWrite;
50     (void) xdrrec_create(__xdrs__, 0, 0, (char *) fd, readRoutine,writeRoutine);
51 }
52
53
54 //
55 // prepare for RPC's to be done/received on the passed fd.
56 //
57 XDRrpc::XDRrpc(char *machine,
58                char *user,
59                char *program,
60                xdrIOFunc readRoutine, 
61                xdrIOFunc writeRoutine)
62 {
63     fd = RPCprocessCreate(&pid, machine, user, program);
64     if (fd >= 0) {
65         __xdrs__ = (XDR *) malloc(sizeof(XDR));
66         if (!readRoutine) readRoutine = RPCdefaultXDRRead;
67         if (!writeRoutine) writeRoutine = RPCdefaultXDRWrite;
68         (void) xdrrec_create(__xdrs__, 0, 0, (char *) fd, 
69                 readRoutine, writeRoutine);
70     } else {
71         __xdrs__ = NULL;
72         fd = -1;
73     }
74 }
75
76 //
77 // prepare for RPC's to be done/received on the passed thread id.
78 //
79 THREADrpc::THREADrpc(int thread)
80 {
81     tid = thread;
82 }
83
84 //
85 // This should never be called, it should be replaced by a virtual function
86 //    from the derived class created by igen.
87 //
88 void RPCUser::verifyProtocolAndVersion()
89 {
90     abort();
91 }
92
93 //
94 // our version of string encoding that does malloc as needed.
95 //
96 bool_t xdr_String(XDR *xdrs, String *str)
97 {
98     int len;
99
100     if (xdrs->x_op == XDR_ENCODE) {
101         len = strlen(*str)+1;
102     } else {
103         *str = NULL;
104     }
105     // should we have a better max length ???. 
106     xdr_bytes(xdrs, str, &len, 65536*32768);
107     return(TRUE);
108 }
109
110 int RPCprocessCreate(int *pid, char *hostName, char *userName, char *command)
111 {
112     int ret;
113     int sv[2];
114     int execlERROR;
115
116     if (!hostName || !strcmp(hostName, "") || !strcmp(hostName, "localhost")) {
117         ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
118         if (ret) return(ret);
119         execlERROR = 0;
120         *pid = vfork();
121         if (*pid == 0) {
122             close(sv[0]);
123             dup2(sv[1], 0);
124             execl(command, command);
125             execlERROR = errno;
126             _exit(-1);
127         } else if (*pid > 0 && !execlERROR) {
128             close(sv[1]);
129             return(sv[0]);
130         } else {
131             return(-1);
132         }
133     } else {
134         // need to rsh to machine and setup io path.
135         printf("remote starts not implemented\n");
136         exit(-1);
137     }
138 }
139
140 //
141 // wait for an expected RPC responce, but also handle upcalls while waiting.
142 //    Should not be called directly !!!
143 //
144 void RPCUser::awaitResponce(int tag)
145 {
146     abort();
147 }