// -------------------------------------------------------------------------- // Creates a named 0MQ socket within a named device, and configures the // socket as specified in the configuration data. Returns NULL if the // device or socket do not exist, or if there was an error configuring the // socket. // void * zfl_config_socket (zfl_config_t *self, char *device, char *name, int type) { assert (self); assert (device); assert (strneq (device, "context")); zfl_tree_t *tree = zfl_tree_locate (self->tree, device); if (!tree) return NULL; // No such device void *socket = zmq_socket (self->context, type); if (!socket) return NULL; // Can't create socket if (zfl_config_verbose (self)) printf ("I: Configuring '%s' socket in '%s' device...\n", name, device); // Find socket in device int rc = 0; tree = zfl_tree_locate (tree, name); if (tree) { tree = zfl_tree_child (tree); while (tree && rc == 0) { char *name = zfl_tree_name (tree); if (streq (name, "bind")) rc = zmq_bind (socket, zfl_tree_string (tree)); else if (streq (name, "connect")) rc = zmq_connect (socket, zfl_tree_string (tree)); else if (streq (name, "option")) rc = s_setsockopt (self, socket, tree); else if (self->verbose) printf ("W: ignoring socket setting '%s'\n", name); tree = zfl_tree_next (tree); } } else if (self->verbose) printf ("W: No configuration found for '%s'\n", name); if (rc) { printf ("E: configuration failed - %s\n", zmq_strerror (errno)); zmq_close (socket); socket = NULL; } return socket; }
// -------------------------------------------------------------------------- // Finds a node specified by path, consisting of name/name/... If the node // exists, returns its value as a string, else returns default_value. // char * zfl_tree_resolve (zfl_tree_t *self, char *path, char *default_value) { zfl_tree_t *tree = zfl_tree_locate (self, path); if (tree) return zfl_tree_string (tree); else return default_value; }
// Process options settings // int s_setsockopt (zfl_config_t *self, void *socket, zfl_tree_t *tree) { int rc = 0; tree = zfl_tree_child (tree); while (tree && rc == 0) { char *name = zfl_tree_name (tree); char *value = zfl_tree_string (tree); if (streq (name, "hwm")) { uint64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_HWM, &optvalue, sizeof (optvalue)); } else if (streq (name, "swap")) { int64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_SWAP, &optvalue, sizeof (optvalue)); } else if (streq (name, "affinity")) { uint64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_AFFINITY, &optvalue, sizeof (optvalue)); } else if (streq (name, "identity")) rc = zmq_setsockopt (socket, ZMQ_IDENTITY, value, strlen (value)); else if (streq (name, "subscribe")) rc = zmq_setsockopt (socket, ZMQ_SUBSCRIBE, value, strlen (value)); else if (streq (name, "rate")) { int64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_RATE, &optvalue, sizeof (optvalue)); } else if (streq (name, "recovery_ivl")) { int64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_RECOVERY_IVL, &optvalue, sizeof (optvalue)); } else if (streq (name, "mcast_loop")) { int64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_MCAST_LOOP, &optvalue, sizeof (optvalue)); } else if (streq (name, "sndbuf")) { uint64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_SNDBUF, &optvalue, sizeof (optvalue)); } else if (streq (name, "rcvbuf")) { uint64_t optvalue = atoi (value); rc = zmq_setsockopt (socket, ZMQ_RCVBUF, &optvalue, sizeof (optvalue)); } else if (self->verbose) printf ("W: ignoring socket option '%s'\n", name); tree = zfl_tree_next (tree); } return rc; }