struct hostctrl * hostctrl_remote_create_specific(const struct hostctrl_callback *cbs, void *context, struct sockaddr *local, socklen_t local_len , struct sockaddr *peer, socklen_t peer_len, unsigned short flags) { struct message_channel *mc = NULL; struct hostctrl *hc; mc = message_channel_get_generic(MSG_CHANNEL_UDP, SOCK_DGRAM, 0, local, local_len, peer, peer_len, 0); if (!mc) { LOG_DBG("Could not create remote host control interface\n"); return NULL; } hc = hostctrl_create(mc, cbs, context); if (!hc) message_channel_put(mc); else if (flags & HCF_START) { if (hostctrl_start(hc) == -1) { hostctrl_free(hc); return NULL; } } return hc; }
struct hostctrl *hostctrl_local_create(const struct hostctrl_callback *cbs, void *context, unsigned short flags) { struct message_channel *mc = NULL; struct hostctrl *hc; #if defined(OS_LINUX) struct sockaddr_nl local, peer; memset(&peer, 0, sizeof(peer)); peer.nl_family = AF_NETLINK; peer.nl_pid = 0; /* kernel */ /* the multicast group */ peer.nl_groups = 0; memset(&local, 0, sizeof(local)); local.nl_family = AF_NETLINK; local.nl_pid = 0; /* Auto assign ID */ /* the multicast group */ local.nl_groups = 1; mc = message_channel_get_generic(MSG_CHANNEL_NETLINK, SOCK_RAW, NETLINK_SERVAL, (struct sockaddr *)&local, sizeof(local), (struct sockaddr *)&peer, sizeof(peer), 0); #endif if (!mc) { #if defined(OS_UNIX) && defined(ENABLE_USERMODE) struct sockaddr_un local, peer; memset(&local, 0, sizeof(local)); memset(&peer, 0, sizeof(peer)); local.sun_family = PF_UNIX; snprintf(local.sun_path, sizeof(local.sun_path), "/tmp/serval-client-%u-ctrl.sock", getpid()); peer.sun_family = PF_UNIX; strcpy(peer.sun_path, SERVAL_STACK_CTRL_PATH); mc = message_channel_get_generic(MSG_CHANNEL_UNIX, SOCK_DGRAM, 0, (struct sockaddr *)&local, sizeof(local), (struct sockaddr *)&peer, sizeof(peer), 0); #endif if (!mc) { LOG_ERR("Could not create local host control interface\n"); return NULL; } } hc = hostctrl_create(mc, cbs, context); if (!hc) message_channel_put(mc); else if (flags & HCF_START) { if (hostctrl_start(hc) == -1) { hostctrl_free(hc); return NULL; } } return hc; }
message_channel_t *message_channel_get(message_channel_type_t type) { return message_channel_get_generic(type, 0, 0, NULL, 0, NULL, 0, 1); }