I'm starting to get tired of this.....
<snip>
+static int cli_zmq_init(struct teamdctl *tdc, const char *team_name,
+ void *priv)
+{
+ int err;
+ struct cli_zmq_priv *cli_zmq = priv;
+ void *context, *sock;
+
+ context = zmq_ctx_new();
+ if (!context) {
+ teamd_log_err("zmq: Failed to create context.");
+ return -errno;
+ }
+
+ sock = zmq_socket(context, ZMQ_REQ);
+ if (!sock) {
+ teamd_log_err("zmq: Failed to create socket.");
+ return -errno;
+ }
+
+ err = zmq_connect(sock, tdc->addr);
+ if (err == -1) {
+ err(tdc, "zmq: Failed to connect socket (%s).", tdc->addr);
+ zmq_close(sock);
+ zmq_ctx_destroy(context);
+ return -errno;
+ }
+
+ int recv_timeo = WAIT_MSEC;
^^^^^^^^^^^^^^
<snip>
+static int teamd_zmq_sock_open(struct teamd_context *ctx)
+{
+ int err;
+ void *context, *sock;
+ int rc;
+
+ context = zmq_ctx_new();
+ if (!context) {
+ teamd_log_err("zmq: Failed to create context.");
+ return -errno;
+ }
+
+ sock = zmq_socket(context, ZMQ_REP);
+ if (!sock) {
+ teamd_log_err("zmq: Failed to create socket.");
+ return -errno;
+ }
+
+ const char *addr;
^^^^^^^^^^^^^^^^
+ if (ctx->zmq.addr) {
+ addr = ctx->zmq.addr;
+ } else {
+ err = teamd_config_string_get(ctx, &addr, "$.runner.addr");
+ if (err) {
+ teamd_log_err("zmq: Failed to get address from config.");
+ return err;
+ }
+ }
+
+ rc = zmq_bind(sock, addr);
+ if (rc != 0) {
+ teamd_log_err("zmq: Failed to bind socket.");
+ err = -errno;
+ goto close_sock;
+ }
+
+ ctx->zmq.context = context;
+ ctx->zmq.sock = sock;
+ return 0;
+
+close_sock:
+ zmq_close(sock);
+ zmq_ctx_destroy(context);
+ return err;
+}
+
+static void teamd_zmq_sock_close(struct teamd_context *ctx)
+{
+ zmq_close(ctx->zmq.sock);
+ zmq_ctx_destroy(ctx->zmq.context);
+}
+
+#define ZMQ_CB_NAME "zmq"
+
+int teamd_zmq_init(struct teamd_context *ctx)
+{
+ int err;
+
+ if (!ctx->zmq.enabled)
+ return 0;
+ err = teamd_zmq_sock_open(ctx);
+ if (err)
+ return err;
+
+ int fd;
^^^^^^
+ size_t fd_size = sizeof(fd);
^^^^^^^^^^^^^^^
+ zmq_getsockopt(ctx->zmq.sock, ZMQ_FD, &fd, &fd_size);
+
+ err = teamd_loop_callback_fd_add(ctx, ZMQ_CB_NAME, ctx, callback_zmq,
+ fd, TEAMD_LOOP_FD_EVENT_READ);
+ if (err)
+ goto sock_close;
+ teamd_loop_callback_enable(ctx, ZMQ_CB_NAME, ctx);
+ return 0;
+sock_close:
+ teamd_zmq_sock_close(ctx);
+ return err;
+}
+
+void teamd_zmq_fini(struct teamd_context *ctx)
+{
+ if (!ctx->zmq.enabled)
+ return;
+ teamd_loop_callback_del(ctx, ZMQ_CB_NAME, ctx);
+ teamd_zmq_sock_close(ctx);
+}
diff --git a/teamd/teamd_zmq.h b/teamd/teamd_zmq.h
new file mode 100644
index 0000000..d919522
--- /dev/null
+++ b/teamd/teamd_zmq.h
@@ -0,0 +1,26 @@
+/*
+ * teamd_zmq.h - Teamd ZeroMQ api
+ * Copyright (C) 2012 Jiri Zupka <jzupka(a)redhat.com>
^^^^