예제 #1
0
파일: acl.c 프로젝트: mahaserver/MHSVLC
static int ACL_Resolve( vlc_object_t *p_this, uint8_t *p_bytes,
                        const char *psz_ip )
{
    struct addrinfo hints, *res;
    int i_family;

    memset (&hints, 0, sizeof (hints));
    hints.ai_socktype = SOCK_STREAM; /* doesn't matter */
    hints.ai_flags = AI_NUMERICHOST;

    if( vlc_getaddrinfo( p_this, psz_ip, 0, &hints, &res ) )
    {
        msg_Err( p_this, "invalid IP address %s", psz_ip );
        return -1;
    }

    p_bytes[16] = 0; /* avoids overflowing when i_bytes_match = 16 */

    i_family = res->ai_addr->sa_family;
    switch( i_family )
    {
        case AF_INET:
        {
            struct sockaddr_in *addr;

            addr = (struct sockaddr_in *)res->ai_addr;
            memset( p_bytes, 0, 12 );
            memcpy( p_bytes + 12, &addr->sin_addr, 4 );
            break;
        }

#if defined (HAVE_GETADDRINFO) || defined (WIN32)
        /* unfortunately many people define AF_INET6
           though they don't have struct sockaddr_in6 */
        case AF_INET6:
        {
            struct sockaddr_in6 *addr;

            addr = (struct sockaddr_in6 *)res->ai_addr;
            memcpy( p_bytes, &addr->sin6_addr, 16 );
            break;
        }
#endif

        default:
            msg_Err( p_this, "unknown address family" );
            vlc_freeaddrinfo( res );
            return -1;
    }

    vlc_freeaddrinfo( res );
    return i_family;
}
예제 #2
0
파일: announce.c 프로젝트: paa/vlc
/**
 *  Registers a new session with the announce handler, using a pregenerated SDP
 *
 * \param obj a VLC object
 * \param psz_sdp the SDP to register
 * \param psz_dst session address (needed for SAP address auto detection)
 * \param p_method an announce method descriptor
 * \return the new session descriptor structure
 */
session_descriptor_t *
sout_AnnounceRegisterSDP( vlc_object_t *obj, const char *psz_sdp,
                          const char *psz_dst, announce_method_t *p_method )
{
    assert (p_method == &sap_method);
    (void) p_method;

    session_descriptor_t *p_session = calloc( 1, sizeof (*p_session) );
    if( !p_session )
        return NULL;

    p_session->psz_sdp = strdup( psz_sdp );

    /* GRUIK. We should not convert back-and-forth from string to numbers */
    struct addrinfo *res;
    if (vlc_getaddrinfo (obj, psz_dst, 0, NULL, &res) == 0)
    {
        if (res->ai_addrlen <= sizeof (p_session->addr))
            memcpy (&p_session->addr, res->ai_addr,
                    p_session->addrlen = res->ai_addrlen);
        vlc_freeaddrinfo (res);
    }

    vlc_mutex_lock (&sap_mutex);
    sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap;
    if (p_sap == NULL)
    {
        p_sap = SAP_Create (VLC_OBJECT (obj->p_libvlc));
        libvlc_priv (obj->p_libvlc)->p_sap = p_sap;
        vlc_object_set_destructor ((vlc_object_t *)p_sap, sap_destroy);
    }
    else
        vlc_object_hold ((vlc_object_t *)p_sap);
    vlc_mutex_unlock (&sap_mutex);

    if (p_sap == NULL)
        goto error;

    msg_Dbg (obj, "adding SAP session");
    if (SAP_Add (p_sap, p_session))
    {
        vlc_mutex_lock (&sap_mutex);
        vlc_object_release ((vlc_object_t *)p_sap);
        vlc_mutex_unlock (&sap_mutex);
        goto error;
    }

    return p_session;

error:
    free (p_session->psz_sdp);
    free (p_session);
    return NULL;
}