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; }
/** * 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; }