$(call to_forb_subdir, request.h) \
$(call to_forb_subdir, syncobj.h) \
$(call to_forb_subdir, server_id.h) \
+ $(call to_forb_subdir, peer.h) \
$(call to_forb_subdir, uuid.h)
renamed_include_GEN_HEADERS = \
return CORBA_TRUE;
}
+int forb_iop_send_hello_to(forb_peer_t *peer)
+{
+ forb_port_t *port = peer->port;
+ FORB_CDR_Codec codec;
+ int ret;
+ FORB_CDR_codec_init_static(&codec, port->forb->orb);
+ if (!FORB_CDR_buffer_init(&codec, 1024, 0))
+ return -1;
+ if (!FORB_CDR_buffer_reset(&codec, forb_iop_MESSAGE_HEADER_SIZE)) {
+ ret = -1;
+ goto free;
+ }
+ if (!forb_iop_prepare_hello(&codec, &port->forb->server_id,
+ port->desc.addr,
+ port->desc.proto->serialize_addr,
+ port->forb->attr.orb_id)) {
+ ret = -1;
+ goto free;
+ }
+ ret = forb_proto_send(peer, &codec);
+ if (ret > 0) ret = 0;
+free:
+ FORB_CDR_codec_release_buffer(&codec);
+ return ret;
+}
+
bool
forb_iop_process_message_header(forb_iop_message_header *mh, FORB_CDR_Codec *codec)
{
forb_free(peer_orb_id);
forb_peer_put(peer);
} else {
+ if (port->new_peer) {
+ if (peer)
+ ul_logerr("Unahandled case - FORB_PEER_WANTED && port->new_peer\n");
+ peer = port->new_peer;
+ port->new_peer = NULL;
+ }
+
forb_new_peer_discovered(port, peer, server_id, addr, peer_orb_id);
}
}
#include <forb/iop-idl.h>
#include <forb/cdr.h>
#include <forb/request.h>
+#include <forb/peer.h>
CORBA_boolean
forb_iop_prepend_message_header(FORB_CDR_Codec *codec, forb_iop_message_type mt);
void
forb_request_send(forb_request_t *req, CORBA_Environment *env);
+int
+forb_iop_send_hello_to(forb_peer_t *peer);
+
#endif
#include <unistd.h>
#include <forb/config.h>
#include "discovery.h"
+#include "iop.h" /* FIXME: Sending hello should be handled in IOP layer */
/**
* @file proto_inet.c
return ret;
}
-static struct inet_peer *
+static int
inet_connect(forb_peer_t *peer)
{
struct inet_peer *ipeer;
if (!addr) {
ul_logerr("No address to connect\n");
- return NULL;
+ goto err;
}
ipeer = forb_malloc(sizeof(*ipeer));
if (!ipeer)
goto err_close;
}
+ peer->proto_priv = ipeer;
+
+#ifndef TEST /* FIXME: Move hello to IOP, introduce proto connect callback */
+ ret = forb_iop_send_hello_to(peer);
+ if (ret) {
+ goto err_close;
+ }
+#endif
- return ipeer;
+ return 0;
err_close:
close(ipeer->socket);
err_free:
forb_free(ipeer);
err:
- return NULL;
+ return -1;
}
ssize_t ret, sent;
if (!ipeer) {
- ipeer = inet_connect(peer);
- if (!ipeer) {
- return -1;
+ ret = inet_connect(peer);
+ if (ret) {
+ return ret;
}
- peer->proto_priv = ipeer;
-
+ ipeer = peer->proto_priv;
}
sent = 0;
peer->port = port;
peer->state = FORB_PEER_DISCOVERED;
inet_port_new_peer_insert(p, peer);
- //printf("New connection d=%d\n", client);
} else {
forb_peer_put(peer);
}