예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
message_channel_t *message_channel_get(message_channel_type_t type)
{
    return message_channel_get_generic(type, 0, 0, NULL, 0, NULL, 0, 1);
}