Man page for igen.
[dyninst.git] / igen / tests / xdrc_pvm.C
1
2 // xdr client pvm client/server
3
4 // xdr client, pvm server
5 // this is started by 'paradyn' and starts the other paradynd's
6 //
7
8 // xdr client, pvm client
9 // started by pvm server, attempts to establish socket to xdr server
10 // by passing messages to pvm server
11 //
12
13 #include <stdio.h>
14 #include "xdr_link.CLNT.h"
15 #include <util/h/list.h>
16 #include <pvm3.h>
17 #include <string.h>
18 #include <assert.h>
19
20 static int started_by_paradynd(char *m, int f, int t, int s);
21 static int get_list_of_pvm_clients(char *m, int f, int t, int s, int flag);
22 static xdr_linkUser *xdr_link_conn= 0;
23 int kidid;
24
25 main (int argc, char *argv[])
26 {
27   // is this the first 'paradyn' --> no args passed in
28   // else, this is not the first paradyn
29   int family, type, well_known_socket, flag;
30   char *machine;
31   int tid;
32
33   tid = pvm_parent();
34   if (tid != PvmNoParent)
35     {
36       pvm_recv (tid, -1);
37     }
38   RPC_undo_arg_list (argc, argv, &machine, &family, &type, &well_known_socket, &flag);
39
40   if (flag)
41     {
42       // the first paradynd started
43       // start others and act as server until they all report
44       pvm_perror("In first\n");
45       xdr_link_conn = new xdr_linkUser (0, NULL, NULL);
46       xdr_link_conn->connected("from first\n");
47
48
49       if (get_list_of_pvm_clients(machine, family, type, well_known_socket, 0)
50           != 0)
51         {
52           // there was an error starting the remote paradynd's, exit
53           assert (0);
54         }
55       pvm_initsend(0);
56       pvm_send(kidid, 0);
57       delete (machine);
58       delete (xdr_link_conn);
59       exit (0);
60     }
61   else
62     {
63       pvm_perror("In else\n");
64       // talk to paradyn through 'first' paradynd
65       if (started_by_paradynd(machine, family, type, well_known_socket) == -1)
66         assert (0);
67     }
68
69   delete(xdr_link_conn);
70   // do normal paradynd behavior here
71   exit(0);
72 }
73
74 int
75 get_list_of_pvm_clients(char *machine, int family, int type,
76                         int well_known_socket, int flag)
77 {
78   struct taskinfo *taskp;
79   struct hostinfo *hostp;
80   int narch, nhost, loop, pvmd_tid, tids, i;
81   char **pvm_argv;
82
83   if ((pvm_tasks(pvm_mytid(), &narch, &taskp) < 0) || (narch < 1))
84     return -1;
85
86   pvmd_tid = taskp[0].ti_host;
87   if (pvm_config(&nhost, &narch, &hostp) < 0)
88     return -1;
89
90   pvm_argv = RPC_make_arg_list ("xdrc_pvm", family, type, well_known_socket, 0);
91   for (loop=0; loop<nhost; ++loop)
92     {
93       assert (hostp->hi_name);
94       
95       // don't start a paradyn on this machine
96       //if (pvmd_tid != hostp[loop].hi_tid)
97         {
98           if (pvm_spawn("xdrc_pvm", pvm_argv, 1, hostp->hi_name, 1, &kidid) != 1)
99             {
100               pvm_perror("spawn failed\n");
101               pvm_exit();
102               exit(-1);
103             }
104         }
105     }
106
107   i = 0;
108   while (pvm_argv[i])
109     {
110       free (pvm_argv[i]);
111       i++;
112     }
113   delete (pvm_argv);
114   return 0;
115 }
116
117 int
118 started_by_paradynd(char *machine, int family, int type, int well_known_socket)
119 {
120   xdr_link_conn = new xdr_linkUser(family, well_known_socket, type, machine, NULL, NULL);
121
122   xdr_link_conn->connected("pvm client connected\n");
123   return 0;
124 }
125
126