}
}
+static void
+zclient_sync_init(u_short instance)
+{
+ /* Initialize special zclient for synchronous message exchanges. */
+ log_debug("Initializing synchronous zclient for label manager");
+ zclient_sync = zclient_new(master);
+ zclient_sync->sock = -1;
+ zclient_sync->redist_default = ZEBRA_ROUTE_LDP;
+ zclient_sync->instance = instance;
+ while (zclient_socket_connect(zclient_sync) < 0) {
+ log_warnx("Error connecting synchronous zclient!");
+ sleep(1);
+ }
++ /* make socket non-blocking */
++ sock_set_nonblock(zclient_sync->sock);
+
+ /* Connect to label manager */
+ while (lm_label_manager_connect(zclient_sync) != 0) {
+ log_warnx("Error connecting to label manager!");
+ sleep(1);
+ }
+}
+
static void
lde_del_label_chunk(void *val)
{
log_debug("Getting label chunk");
ret = lm_get_label_chunk(zclient_sync, 0, CHUNK_SIZE, &start, &end);
- if (ret < 0)
- {
+ if (ret < 0) {
log_warnx("Error getting label chunk!");
- close(zclient_sync->sock);
- zclient_sync->sock = -1;
return -1;
}
if (zclient_socket_connect(zclient) < 0) {
zlog_err("Error connecting synchronous zclient!");
- thread_add_timer(zebrad.master, zclient_connect, zclient,
- THREAD_TIMER_ON(zebrad.master, zclient->t_connect,
- lm_zclient_connect,
- zclient, CONNECTION_DELAY);
++ thread_add_timer(zebrad.master, lm_zclient_connect, zclient,
+ CONNECTION_DELAY, &zclient->t_connect);
return -1;
}