+/* **********************************************************************
+ * Forwarder code
+ * **********************************************************************/
+typedef struct {
+ gras_socket_t server;
+ int done;
+} s_forward_data_t, *forward_data_t;
+
+static int forwarder_cb_kill(gras_msg_cb_ctx_t ctx,
+ void *payload_data) {
+ forward_data_t fdata;
+ gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
+ INFO2("Asked to die by %s:%d",gras_socket_peer_name(expeditor),gras_socket_peer_port(expeditor));
+ fdata=gras_userdata_get();
+ fdata->done = 1;
+ return 0;
+}
+
+static int forwarder_cb_forward_ex(gras_msg_cb_ctx_t ctx,
+ void *payload_data) {
+ forward_data_t fdata=gras_userdata_get();
+
+ INFO0("Forward a request");
+ gras_msg_rpccall(fdata->server, 60, "raise exception",NULL,NULL);
+ return 0;
+}
+
+int forwarder (int argc,char *argv[]) {
+ gras_socket_t mysock;
+ int port;
+ forward_data_t fdata;
+
+ gras_init(&argc,argv);
+
+ xbt_assert(argc == 4);
+
+ fdata=gras_userdata_new(s_forward_data_t);
+ fdata->done = 0;
+ port=atoi(argv[1]);
+
+ INFO1("Launch forwarder (port=%d)", port);
+ mysock = gras_socket_server(port);
+
+ gras_os_sleep(1); /* wait for the server to be ready */
+ fdata->server=gras_socket_client(argv[2],atoi(argv[3]));
+
+ register_messages();
+ gras_cb_register("forward exception", &forwarder_cb_forward_ex);
+ gras_cb_register("kill", &forwarder_cb_kill);
+
+ while (!fdata->done) {
+ gras_msg_handle(600.0);
+ }
+
+ gras_socket_close(mysock);
+ gras_socket_close(fdata->server);
+ free(fdata);
+ INFO0("Done.");
+ gras_exit();
+ return 0;
+}
+