diff --git a/CMakeLists.txt b/CMakeLists.txt index 7288faf7c84c21e3d116279cf31b94db21821e59..ba8d1d90bdb54de37a3e23de29fce1b859fd62d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,9 @@ cmake_minimum_required(VERSION 3.11) set (CMAKE_CONFIGURATION_TYPES "Debug;Release") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +#set(dir ${CMAKE_CURRENT_SOURCE_DIR}/build) + + project(aes67) ################ @@ -130,8 +133,8 @@ elseif("${AES67_MDNS}" STREQUAL "avahi") set(AES67_MDNS_INCLUDE_DIRS ${Avahi_CLIENT_INCLUDE_DIRS}) set(AES67_MDNS_LIBRARIES ${Avahi_COMMON_LIBRARY} ${Avahi_CLIENT_LIBRARY}) -else() - message(FATAL_ERROR "mDNS option '${AES67_MDNS}' unknown") +elseif(DEFINED AES67_MDNS) + message(ERROR "mDNS option '${AES67_MDNS}' unknown") endif() @@ -172,15 +175,17 @@ set_property(TARGET aes67 PROPERTY LINKER_LANGUAGE C) add_subdirectory("${AES67_DIR}/test" EXCLUDE_FROM_ALL) -add_subdirectory("${AES67_DIR}/src/utils") +#if(NOT ${AES67_WITHOUT_UTILS}) + add_subdirectory("${AES67_DIR}/src/utils") +#endif() -list(APPEND AES67_TARGET_LIST mytest) -add_executable(mytest test.c) -target_include_directories(mytest PRIVATE - ${AES67_DIR} - ${AES67_PORT_INCLUDE_DIRS} - ) -target_link_libraries(mytest aes67 ${AES67_PORT_LIB}) +#list(APPEND AES67_TARGET_LIST mytest) +#add_executable(mytest test.c) +#target_include_directories(mytest PRIVATE +# ${AES67_DIR} +# ${AES67_PORT_INCLUDE_DIRS} +# ) +#target_link_libraries(mytest aes67 ${AES67_PORT_LIB}) if(CMAKE_BUILD_TYPE MATCHES Debug) foreach(TARGET IN LISTS AES67_TARGET_LIST) diff --git a/README.md b/README.md index 6c3938c77d04ce04a0404bd649fab303fb9ac2e7..a0d58d92b539a07bb3e340900f362daa616ee803 100644 --- a/README.md +++ b/README.md @@ -52,20 +52,25 @@ https://github.com/tschiemer/aes67 - [ ] rtsp/http combo server? - RAVENNA - [ ] ~~RAV2SAP~~ -> [sapd](#sapd) - - [x] [rav-lookup](#rav-lookup): browse for RAVENNA sessions/devices - - [ ] [rav-publish](#rav-publish): publish RAVENNA sessions and optionally serve SDP files + - [x] [rav-lookup](#rav-lookup): browse for sessions/devices + - [ ] [rav-publish](#rav-publish): publish sessions and optionally serve SDP files - PTP - - [ ] ptp-monitor? -> https://www.ptptrackhound.com/ + - [ ] ptp-monitor? -> [ptptrackhound](https://www.ptptrackhound.com/) & [ptpmonkey](https://github.com/martim01/ptpmonkey) - [ ] ptp-server? - RTP/RTCP - [ ] rtp-send: send RTP (from STDIN) - [ ] rtp-recv: receive RTP (to STDOUT) - Support - - mDNS (abstraction for service *discovery*) - - [ ] dns-sd + - mDNS (abstraction for mdns service) + - [x] dns-sd - [x] discovery - - [ ] registration (?) - - [ ] ahavi + - [x] registration + - [ ] avahi + - [ ] dns-sd compat layer + - [ ] RTSP describe + - [x] retrieve SDP from server + - [ ] serve SDPs on request + diff --git a/src/core/sap.c b/src/core/sap.c index 7fd58562ec6f67e2c26687144d0bccc6a68c117c..10d5eb56896418ac6b197f7011c2dcdd57f19cf7 100644 --- a/src/core/sap.c +++ b/src/core/sap.c @@ -108,7 +108,7 @@ struct aes67_sap_session * aes67_sap_service_find(struct aes67_sap_service * sap struct aes67_sap_session * current = sap->first_session; while(current != NULL){ - if ((current->stat & AES67_SAP_SESSION_STAT_SET) && current->hash == hash && current->src.ipver == ipver && 0 == aes67_memcmp(current->src.addr, ip, AES67_NET_IPVER_SIZE(ipver))){ + if ((current->stat & AES67_SAP_SESSION_STAT_SET) && current->hash == hash && current->src.ipver == ipver && 0 == aes67_memcmp(current->src.ip, ip, AES67_NET_IPVER_SIZE(ipver))){ return current; } current = current->next; @@ -413,7 +413,7 @@ void aes67_sap_service_announcement_check(struct aes67_sap_service *sap, void *u if (timeout_after < age){ - aes67_sap_service_event(sap, aes67_sap_event_announcement_request, current->hash, current->src.ipver, current->src.addr, NULL, 0, NULL, 0, user_data); + aes67_sap_service_event(sap, aes67_sap_event_announcement_request, current->hash, current->src.ipver, current->src.ip, NULL, 0, NULL, 0, user_data); } } @@ -500,7 +500,7 @@ void aes67_sap_service_timeouts_cleanup(struct aes67_sap_service *sap, void *use if (timeout_after < age){ - aes67_sap_service_event(sap, aes67_sap_event_timeout, current->hash, current->src.ipver, current->src.addr, NULL, 0, NULL, 0, user_data); + aes67_sap_service_event(sap, aes67_sap_event_timeout, current->hash, current->src.ipver, current->src.ip, NULL, 0, NULL, 0, user_data); aes67_sap_service_unregister(sap, current); } diff --git a/src/include/aes67/arch.h b/src/include/aes67/arch.h index 47a1e53cd7b328a30a6cc0c65389a821e67675a8..77951252f8d91f0dd01bd9301724032b0369bb6b 100644 --- a/src/include/aes67/arch.h +++ b/src/include/aes67/arch.h @@ -77,4 +77,8 @@ typedef struct { #define WEAK_FUN __attribute__((weak)) #endif +#ifndef INLINE_FUN +#define INLINE_FUN __attribute__((always_inline)) inline +#endif + #endif //AES67_ARCH_H diff --git a/src/include/aes67/net.h b/src/include/aes67/net.h index 5a75544d1a1a468c8dba695db8be8e882f2a8044..45e380620b72dd4b3d5dcd3f7f8795238fb0c027 100644 --- a/src/include/aes67/net.h +++ b/src/include/aes67/net.h @@ -63,17 +63,17 @@ struct aes67_net_addr { s32_t aes67_net_str2ip(enum aes67_net_ipver * ipver, u8_t * addr, u16_t * port, u8_t * str, u16_t slen); u16_t aes67_net_ip2str(u8_t * str, enum aes67_net_ipver ipver, u8_t * addr, u16_t port); -inline s32_t aes67_net_str2addr(struct aes67_net_addr * addr, u8_t * str, u16_t slen) +INLINE_FUN s32_t aes67_net_str2addr(struct aes67_net_addr * addr, u8_t * str, u16_t slen) { return aes67_net_str2ip(&addr->ipver, addr->ip, &addr->port, str, slen); } -inline u16_t aes67_net_addr2str(u8_t * str, struct aes67_net_addr * addr) +INLINE_FUN u16_t aes67_net_addr2str(u8_t * str, struct aes67_net_addr * addr) { return aes67_net_ip2str(str, addr->ipver, addr->ip, addr->port); } -inline u8_t aes67_net_addr2mem(u8_t * to, const struct aes67_net_addr * from) +INLINE_FUN u8_t aes67_net_addr2mem(u8_t * to, const struct aes67_net_addr * from) { if (from->ipver == aes67_net_ipver_4){ ((u32_t*)to)[0] = ((u32_t*)from->ip)[0]; @@ -88,7 +88,7 @@ inline u8_t aes67_net_addr2mem(u8_t * to, const struct aes67_net_addr * from) return 0; } -inline void aes67_net_addrcp(struct aes67_net_addr * to, const struct aes67_net_addr * from) +INLINE_FUN void aes67_net_addrcp(struct aes67_net_addr * to, const struct aes67_net_addr * from) { aes67_memcmp(to, from, sizeof(struct aes67_net_addr)); } @@ -96,7 +96,7 @@ inline void aes67_net_addrcp(struct aes67_net_addr * to, const struct aes67_net_ u8_t aes67_net_ipeq(const struct aes67_net_addr * lhs, const struct aes67_net_addr * rhs); -inline u8_t aes67_net_ismcastip(const enum aes67_net_ipver ipver, const u8_t * ip) +INLINE_FUN u8_t aes67_net_ismcastip(const enum aes67_net_ipver ipver, const u8_t * ip) { if (ipver == aes67_net_ipver_4){ // 224.0.0.0 - 239.255.255.255 @@ -108,12 +108,12 @@ inline u8_t aes67_net_ismcastip(const enum aes67_net_ipver ipver, const u8_t * i return 0; } -inline u8_t aes67_net_ismcastip_addr(const struct aes67_net_addr * addr) +INLINE_FUN u8_t aes67_net_ismcastip_addr(const struct aes67_net_addr * addr) { return aes67_net_ismcastip(addr->ipver, (u8_t *)addr->ip); } -inline u8_t aes67_net_isallip(const enum aes67_net_ipver ipver, const u8_t * ip) +INLINE_FUN u8_t aes67_net_isallip(const enum aes67_net_ipver ipver, const u8_t * ip) { if (ipver == aes67_net_ipver_4){ return ((u32_t*)ip)[0] == 0; @@ -122,12 +122,12 @@ inline u8_t aes67_net_isallip(const enum aes67_net_ipver ipver, const u8_t * ip) } return 0; } -inline u8_t aes67_net_isallip_addr(const struct aes67_net_addr * addr) +INLINE_FUN u8_t aes67_net_isallip_addr(const struct aes67_net_addr * addr) { return aes67_net_isallip(addr->ipver, addr->ip); } -inline u8_t aes67_net_addreq(const struct aes67_net_addr * lhs, const struct aes67_net_addr * rhs) +INLINE_FUN u8_t aes67_net_addreq(const struct aes67_net_addr * lhs, const struct aes67_net_addr * rhs) { if (aes67_net_ipeq(lhs, rhs) == false) return false; if (lhs->port != rhs->port) return false; diff --git a/src/include/aes67/sap.h b/src/include/aes67/sap.h index d02841020b8b2e991bd14348c7e6c18d2f188073..98ead3dbc0f1cdb79ba371ca5a582d2443e0a534 100644 --- a/src/include/aes67/sap.h +++ b/src/include/aes67/sap.h @@ -282,7 +282,7 @@ void aes67_sap_service_unregister(struct aes67_sap_service * sap, struct aes67_s #define aes67_sap_service_unregister(session, sap) #endif -inline u16_t aes67_sap_no_of_ads(struct aes67_sap_service * sap) +INLINE_FUN u16_t aes67_sap_no_of_ads(struct aes67_sap_service * sap) { return sap->no_of_ads_other + sap->no_of_ads_self; } @@ -307,7 +307,7 @@ void aes67_sap_compute_times_sec(s32_t no_of_ads, s32_t announcement_size, u32_t * @param sap * @return true iff announcement may/should occur now */ -inline enum aes67_timer_state aes67_sap_service_announcement_timer_state(struct aes67_sap_service * sap) +INLINE_FUN enum aes67_timer_state aes67_sap_service_announcement_timer_state(struct aes67_sap_service * sap) { return aes67_timer_getstate(&sap->announcement_timer); } @@ -330,7 +330,7 @@ void aes67_sap_service_set_announcement_timer(struct aes67_sap_service * sap); * @param sap * @return true iff the timeout timer expired */ -inline enum aes67_timer_state aes67_sap_service_timeout_timer_state(struct aes67_sap_service * sap) +INLINE_FUN enum aes67_timer_state aes67_sap_service_timeout_timer_state(struct aes67_sap_service * sap) { return aes67_timer_getstate(&sap->timeout_timer); } diff --git a/src/include/aes67/sdp.h b/src/include/aes67/sdp.h index c3a0c0a0f6e4d4eb41174e6420fe02af3a849163..3f644134f6bb9764d9aace8d6a54895c5d0b674b 100644 --- a/src/include/aes67/sdp.h +++ b/src/include/aes67/sdp.h @@ -335,7 +335,7 @@ void aes67_sdp_origin_init(struct aes67_sdp_originator * origin); */ void aes67_sdp_init(struct aes67_sdp * sdp); -inline u16_t aes67_sdp_origin_size(struct aes67_sdp_originator * origin) +INLINE_FUN u16_t aes67_sdp_origin_size(struct aes67_sdp_originator * origin) { #if 0 < AES67_SDP_MAXUSERNAME return sizeof("o= IN IP4 \n") + (origin->username.length ? origin->username.length : 1) + origin->session_id.length + origin->session_version.length + + origin->address.length; @@ -350,7 +350,7 @@ inline u16_t aes67_sdp_origin_size(struct aes67_sdp_originator * origin) * @param sdp * @return */ -inline u8_t aes67_sdp_get_ptpdomain(struct aes67_sdp * sdp) +INLINE_FUN u8_t aes67_sdp_get_ptpdomain(struct aes67_sdp * sdp) { return AES67_SDP_PTPDOMAIN_VALUE & sdp->ptp_domain; } @@ -362,7 +362,7 @@ inline u8_t aes67_sdp_get_ptpdomain(struct aes67_sdp * sdp) * @param domain * @return */ -inline u8_t aes67_sdp_set_ptpdomain(struct aes67_sdp * sdp, u8_t domain) +INLINE_FUN u8_t aes67_sdp_set_ptpdomain(struct aes67_sdp * sdp, u8_t domain) { return sdp->ptp_domain = AES67_SDP_PTPDOMAIN_SET | (AES67_SDP_PTPDOMAIN_VALUE & domain); } @@ -374,7 +374,7 @@ inline u8_t aes67_sdp_set_ptpdomain(struct aes67_sdp * sdp, u8_t domain) * @param domain * @return */ -inline u8_t aes67_sdp_unset_ptpdomain(struct aes67_sdp * sdp) +INLINE_FUN u8_t aes67_sdp_unset_ptpdomain(struct aes67_sdp * sdp) { return sdp->ptp_domain = 0; } @@ -387,7 +387,7 @@ inline u8_t aes67_sdp_unset_ptpdomain(struct aes67_sdp * sdp) * @param sdp * @return */ -inline u8_t aes67_sdp_get_connection_count(struct aes67_sdp * sdp) +INLINE_FUN u8_t aes67_sdp_get_connection_count(struct aes67_sdp * sdp) { AES67_ASSERT("sdp != NULL", sdp != NULL); @@ -415,7 +415,7 @@ struct aes67_sdp_connection * aes67_sdp_get_connection(struct aes67_sdp * sdp, a * @param di * @return */ -inline struct aes67_sdp_connection * aes67_sdp_add_connection(struct aes67_sdp * sdp, aes67_sdp_flags flags) +INLINE_FUN struct aes67_sdp_connection * aes67_sdp_add_connection(struct aes67_sdp * sdp, aes67_sdp_flags flags) { AES67_ASSERT("sdp != NULL", sdp != NULL); AES67_ASSERT("sdp->connections.count < AES67_SDP_MAXCONNECTIONS", sdp->connections.count < AES67_SDP_MAXCONNECTIONS); @@ -435,7 +435,7 @@ inline struct aes67_sdp_connection * aes67_sdp_add_connection(struct aes67_sdp * * @param sdp * @return */ -inline u8_t aes67_sdp_get_stream_count(struct aes67_sdp * sdp) +INLINE_FUN u8_t aes67_sdp_get_stream_count(struct aes67_sdp * sdp) { AES67_ASSERT("sdp != NULL", sdp != NULL); @@ -449,7 +449,7 @@ inline u8_t aes67_sdp_get_stream_count(struct aes67_sdp * sdp) * @param si stream index * @return */ -inline struct aes67_sdp_stream * aes67_sdp_get_stream(struct aes67_sdp * sdp, u8_t si) +INLINE_FUN struct aes67_sdp_stream * aes67_sdp_get_stream(struct aes67_sdp * sdp, u8_t si) { AES67_ASSERT("sdp != NULL", sdp != NULL); AES67_ASSERT("si < sdp->streams.count", si < sdp->streams.count); @@ -464,7 +464,7 @@ inline struct aes67_sdp_stream * aes67_sdp_get_stream(struct aes67_sdp * sdp, u8 * @param si if not NULL, is set to stream index * @return */ -inline struct aes67_sdp_stream * aes67_sdp_add_stream(struct aes67_sdp * sdp, u8_t * si) +INLINE_FUN struct aes67_sdp_stream * aes67_sdp_add_stream(struct aes67_sdp * sdp, u8_t * si) { AES67_ASSERT("sdp != NULL", sdp != NULL); AES67_ASSERT("si < sdp->streams.count", sdp->streams.count < AES67_SDP_MAXSTREAMS); @@ -486,7 +486,7 @@ inline struct aes67_sdp_stream * aes67_sdp_add_stream(struct aes67_sdp * sdp, u8 * @param si stream index * @return */ -inline u8_t aes67_sdp_get_stream_encoding_count(struct aes67_sdp * sdp, u8_t si) +INLINE_FUN u8_t aes67_sdp_get_stream_encoding_count(struct aes67_sdp * sdp, u8_t si) { AES67_ASSERT("sdp != NULL", sdp != NULL); AES67_ASSERT("si < sdp->streams.count", si < sdp->streams.count); @@ -511,7 +511,7 @@ struct aes67_sdp_attr_encoding * aes67_sdp_get_stream_encoding(struct aes67_sdp * @param si * @return */ -inline struct aes67_sdp_attr_encoding * aes67_sdp_add_stream_encoding(struct aes67_sdp * sdp, u8_t si) +INLINE_FUN struct aes67_sdp_attr_encoding * aes67_sdp_add_stream_encoding(struct aes67_sdp * sdp, u8_t si) { AES67_ASSERT("sdp != NULL", sdp != NULL); AES67_ASSERT("si < sdp->streams.count", si < sdp->streams.count); @@ -529,7 +529,7 @@ inline struct aes67_sdp_attr_encoding * aes67_sdp_add_stream_encoding(struct aes } -inline u8_t aes67_sdp_get_refclk_count(struct aes67_sdp * sdp, aes67_sdp_flags flags) +INLINE_FUN u8_t aes67_sdp_get_refclk_count(struct aes67_sdp * sdp, aes67_sdp_flags flags) { AES67_ASSERT("sdp != NULL", sdp != NULL); @@ -571,7 +571,7 @@ struct aes67_sdp_attr_refclk * aes67_sdp_get_refclk(struct aes67_sdp * sdp, aes6 * @param pi * @return */ -inline struct aes67_sdp_attr_refclk * aes67_sdp_add_refclk(struct aes67_sdp * sdp, aes67_sdp_flags flags) +INLINE_FUN struct aes67_sdp_attr_refclk * aes67_sdp_add_refclk(struct aes67_sdp * sdp, aes67_sdp_flags flags) { AES67_ASSERT("sdp != NULL", sdp != NULL); AES67_ASSERT("(flags & AES67_SDP_FLAG_DEFLVL_MASK) != 0", (flags & AES67_SDP_FLAG_DEFLVL_MASK) != 0); @@ -600,7 +600,7 @@ inline struct aes67_sdp_attr_refclk * aes67_sdp_add_refclk(struct aes67_sdp * sd * @param flags either AES67_SDP_FLAG_DEFLVL_SESSION or AES67_SDP_FLAG_DEFLVL_STREAM | <stream-index> * @return */ -inline enum aes67_sdp_attr_mode aes67_sdp_get_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags) +INLINE_FUN enum aes67_sdp_attr_mode aes67_sdp_get_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags) { // if specifically requested session level mode return it if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){ @@ -621,7 +621,7 @@ inline enum aes67_sdp_attr_mode aes67_sdp_get_mode(struct aes67_sdp * sdp, aes67 * @param flags * @param mode */ -inline void aes67_sdp_set_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags, enum aes67_sdp_attr_mode mode) +INLINE_FUN void aes67_sdp_set_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags, enum aes67_sdp_attr_mode mode) { if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){ sdp->mode = mode; @@ -639,7 +639,7 @@ inline void aes67_sdp_set_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags, en * @param flags * @return */ -inline struct aes67_sdp_attr_mediaclk * aes67_sdp_get_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags) +INLINE_FUN struct aes67_sdp_attr_mediaclk * aes67_sdp_get_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags) { // if specifically requested session level mode return it if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){ @@ -661,7 +661,7 @@ inline struct aes67_sdp_attr_mediaclk * aes67_sdp_get_mediaclock(struct aes67_sd * @param set * @param offset */ -inline void aes67_sdp_set_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags, u8_t set, u32_t offset) +INLINE_FUN void aes67_sdp_set_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags, u8_t set, u32_t offset) { if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){ sdp->mediaclock.set = set; diff --git a/src/include/aes67/utils/sapsrv.h b/src/include/aes67/utils/sapsrv.h index 5e9f582e5e0315cbcd952c103b0b11299f7f14c8..338da40257c89142070431dba1c7fe837268fbe7 100644 --- a/src/include/aes67/utils/sapsrv.h +++ b/src/include/aes67/utils/sapsrv.h @@ -30,6 +30,8 @@ #include "aes67/opt.h" //#include "aes67/debug.h" +#include <stdbool.h> + #if AES67_SAP_MEMORY != AES67_MEMORY_DYNAMIC #error sap-server requires dynamic memory allocation (at this point in time) #endif diff --git a/src/utils/mdns-avahi.c b/src/utils/mdns-avahi.c index 481b7f181a75400529fe0d1c2492d29c9c8d54f7..1fb13c6d1bbeec034f7139ee5493d891bc85a8f3 100644 --- a/src/utils/mdns-avahi.c +++ b/src/utils/mdns-avahi.c @@ -27,7 +27,7 @@ #include <avahi-common/malloc.h> #include <avahi-common/error.h> -#error TODO see https://www.avahi.org/doxygen/html/client-browse-services_8c-example.html +//#error TODO see https://www.avahi.org/doxygen/html/client-browse-services_8c-example.html typedef struct { AvahiServiceBrowser *sb; @@ -36,7 +36,7 @@ typedef struct { typedef struct { AvahiSimplePoll *simple_poll; AvahiClient *client; -} ahavi_context_t; +} avahi_context_t; static void resolve_callback( @@ -134,7 +134,7 @@ static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UN aes67_mdns_context_t aes67_mdns_new(void) { - ahavi_context_t * context = calloc(1, sizeof(ahavi_context_t); + avahi_context_t * context = calloc(1, sizeof(avahi_context_t); /* Allocate main loop object */ if (!(context->simple_poll = avahi_simple_poll_new())) { @@ -160,7 +160,7 @@ void aes67_mdns_delete(aes67_mdns_context_t ctx) { assert(ctx != NULL); - ahavi_context_t * context = ctx; + avahi_context_t * context = ctx; diff --git a/src/utils/rav-publish/rav-publish.c b/src/utils/rav-publish/rav-publish.c index 3b0facaf710dd86ce8f5f76d757c426f7c8567f5..ade1a7386817504b9e72100ef12d03f6b09b63e2 100644 --- a/src/utils/rav-publish/rav-publish.c +++ b/src/utils/rav-publish/rav-publish.c @@ -31,6 +31,8 @@ #include <fcntl.h> #include <ctype.h> #include <sys/stat.h> +#include <sys/socket.h> +#include <dns_util.h> typedef struct sdpres_st { char * name; @@ -61,6 +63,10 @@ static struct { static volatile bool keep_running; +static struct { + int sockfd; +} rtsp; + static aes67_mdns_context_t mdns; static sdpres_t * first_sdpres = NULL; @@ -99,6 +105,97 @@ static void publish_callback(aes67_mdns_resource_t res, enum aes67_mdns_result r } } +static void fd_blocking(int fd, bool yes){ + + // set non-blocking + int flags = fcntl(fd, F_GETFL, 0); + flags = (flags & ~O_NONBLOCK) | (yes ? 0 : O_NONBLOCK); + if (fcntl(fd, F_SETFL, flags) == -1){ + perror("fcntl()"); + close(fd); + exit(EXIT_FAILURE); + } +} + +static int rtsp_setup() +{ + rtsp.sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (rtsp.sockfd == -1){ + perror("socket()"); + return EXIT_FAILURE; + } + + struct sockaddr_in addr; + + addr.sin_family = AF_INET; + addr.sin_port = htons(opts.port); + addr.sin_addr.s_addr = INADDR_ANY; + + if (bind(rtsp.sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1){ + perror("bind()"); + close(rtsp.sockfd); + rtsp.sockfd = - 1; + return EXIT_FAILURE; + } + + if (listen(rtsp.sockfd, 10) == -1){ + close(rtsp.sockfd); + rtsp.sockfd = -1; + perror ("listen()"); + return EXIT_FAILURE; + } + + fd_blocking(rtsp.sockfd, false); + + return EXIT_SUCCESS; +} + +static void rtsp_teardown() { + if (!opts.rtsp || rtsp.sockfd == -1) { + return; + } + + close(rtsp.sockfd); + rtsp.sockfd = -1; + + +} + +static void rtsp_process() +{ + static int sockfd = -1; + + if (sockfd == -1){ + struct sockaddr_in addr; + socklen_t socklen; + + memset(&addr, 0, sizeof(struct sockaddr_in)); + + if ((sockfd = accept(rtsp.sockfd, (struct sockaddr *)&addr, &socklen)) != -1) { + + fd_blocking(sockfd, true); + + u8_t ip[4]; + *(u32_t*)ip = addr.sin_addr.s_addr; + u16_t port = ntohs(addr.sin_port); + + printf("Connected! from %d.%d.%d.%d:%hu\n", ip[0], ip[1], ip[2], ip[3], port); + + u8_t buf[1024]; + + ssize_t rlen = read(sockfd, buf, sizeof(buf)); + + if (rlen > 0){ + buf[rlen] = '\0'; + printf("%s\n", buf); + } + + close(sockfd); + sockfd = -1; + } + } +} + static int load_sdpres(char * fname, size_t maxlen) { if (access(fname, F_OK) != 0){ @@ -280,6 +377,14 @@ int main(int argc, char * argv[]) } } + if (opts.rtsp){ + if (rtsp_setup()){ + fprintf(stderr, "failed rtsp setup\n"); + goto shutdown; + } + } + + mdns = aes67_mdns_new(); @@ -324,13 +429,49 @@ int main(int argc, char * argv[]) signal(SIGTERM, sig_stop); keep_running = true; while(keep_running){ - aes67_mdns_process(mdns, NULL); + + int nfds = rtsp.sockfd; + struct fd_set fds; +// sigset_t sigmask; + + FD_ZERO(&fds); + + // set all AF_LOCAL sockets + FD_SET(rtsp.sockfd, &fds); + + int * sockfds; + size_t count = 0; + aes67_mdns_getsockfds(mdns, &sockfds, &count); + for (size_t i = 0; i < count; i++) { + FD_SET(sockfds[i], &fds); + if (sockfds[i] > nfds) { + nfds = sockfds[i]; + } + } + + nfds++; + + // just wait until something interesting happens + select(nfds, &fds, NULL, &fds, NULL); + + + + struct timeval tv = { + .tv_usec = 0, + .tv_sec = 0 + }; + aes67_mdns_process(mdns, &tv); + + rtsp_process(); } shutdown: - aes67_mdns_delete(mdns); + if (mdns) { + aes67_mdns_delete(mdns); + } + rtsp_teardown(); cleanup_sdpres(); diff --git a/src/utils/rtsp-describe/rtsp-describe.c b/src/utils/rtsp-describe/rtsp-describe.c index d2753df45f10260521c191854967f7da6005c4b6..af11dd581e97a692f0a01f2ab9febbb49af24634 100644 --- a/src/utils/rtsp-describe/rtsp-describe.c +++ b/src/utils/rtsp-describe/rtsp-describe.c @@ -144,15 +144,21 @@ static int lookup2(char * rtsp) if (opts.verbose){ char str[256]; ssize_t l = snprintf(str, sizeof(str), "RTSP-DESCRIBE %s %s\n", res.statuscode == AES67_RTSP_STATUS_OK ? "OK" : "FAIL", rtsp); - write(STDERR_FILENO,str, l); + if (write(STDERR_FILENO,str, l) == -1){ + // + } } if (opts.print_rtsp && res.hdrlen > 0){ - write(STDERR_FILENO, res.buf, res.hdrlen); + if (write(STDERR_FILENO, res.buf, res.hdrlen) == -1){ + // + } } if (res.contentlen > 0){ - write(STDOUT_FILENO, aes67_rtsp_dsc_content(&res), res.contentlen); + if (write(STDOUT_FILENO, aes67_rtsp_dsc_content(&res), res.contentlen) == -1){ + // + } } aes67_rtsp_dsc_deinit(&res); diff --git a/src/utils/sap-pack/sap-pack.c b/src/utils/sap-pack/sap-pack.c index fdaf135ce81db764dc6cf7f896f6f0f7e23b8f57..79532ddb4bc850597fab7d50f1a3a4e32be5f856 100644 --- a/src/utils/sap-pack/sap-pack.c +++ b/src/utils/sap-pack/sap-pack.c @@ -19,8 +19,12 @@ #include "aes67/sap.h" #include "aes67/sdp.h" -#include <getopt.h> +#include <stdbool.h> #include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <getopt.h> +#include <fcntl.h> enum extract_mode { explicit_with_sdp_fallback, @@ -128,7 +132,7 @@ static int generate_packet(u8_t * payload, size_t plen, size_t typelen) parsed_sdp = get_originator(&payload[typelen], plen, &origin); } - u16_t hash; + u16_t hash = 0; if (opts.extractMode == sdp_with_explicit_fallback){ if (parsed_sdp){ @@ -201,7 +205,9 @@ static int generate_packet(u8_t * payload, size_t plen, size_t typelen) return EXIT_FAILURE; } - write(STDOUT_FILENO, packet, len); + if (write(STDOUT_FILENO, packet, len) == -1){ + fprintf(stderr, "error writing to stdout\n"); + } return EXIT_SUCCESS; } diff --git a/src/utils/sap-unpack/sap-unpack.c b/src/utils/sap-unpack/sap-unpack.c index 39d06a44f7012c716c4d9092ace457619a82d7c1..45203d3f169ebdc1bfbf839d948d7dac8d2d87e6 100644 --- a/src/utils/sap-unpack/sap-unpack.c +++ b/src/utils/sap-unpack/sap-unpack.c @@ -18,11 +18,12 @@ #include "aes67/sap.h" -#include <getopt.h> +#include <stdbool.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/errno.h> +#include <getopt.h> static char * argv0; @@ -83,7 +84,9 @@ aes67_sap_service_event(struct aes67_sap_service *sap, enum aes67_sap_event even printf("\n"); } - write(STDOUT_FILENO, payload, payloadlen); + if (write(STDOUT_FILENO, payload, payloadlen) == -1){ + fprintf(stderr, "error writing to stdout\n"); + } fflush(stdout); } diff --git a/src/utils/sapd/sapd.c b/src/utils/sapd/sapd.c index eef7e837f89df8cac04341c1aaef18419b066114..19208dd028aa66cdfae10facc6d90b5f1b559c9f 100644 --- a/src/utils/sapd/sapd.c +++ b/src/utils/sapd/sapd.c @@ -28,7 +28,10 @@ #include "dnmfarrell/URI-Encode-C/src/uri_encode.h" #endif +#include <stdbool.h> #include <stdlib.h> +#include <unistd.h> +#include <stddef.h> #include <string.h> #include <getopt.h> #include <signal.h> @@ -37,6 +40,9 @@ #include <sys/un.h> #include <net/if.h> #include <assert.h> +#include <sys/errno.h> +#include <fcntl.h> +#include <sys/select.h> #include <dirent.h> //#define BUFSIZE 1024 @@ -357,18 +363,22 @@ static int sock_nonblock(int sockfd){ static void block_until_event() { int nfds = 0; - struct fd_set fds; + fd_set rfds; + fd_set xfds; // sigset_t sigmask; - FD_ZERO(&fds); + FD_ZERO(&rfds); + FD_ZERO(&xfds); // set all AF_LOCAL sockets - FD_SET(local.sockfd, &fds); + FD_SET(local.sockfd, &rfds); + FD_SET(local.sockfd, &xfds); nfds = local.sockfd; struct connection_st * con = local.first_connection; for(;con != NULL; con = con->next){ - FD_SET(con->sockfd, &fds); + FD_SET(con->sockfd, &rfds); + FD_SET(con->sockfd, &xfds); if (con->sockfd > nfds){ nfds = con->sockfd; } @@ -378,7 +388,8 @@ static void block_until_event() size_t count = 0; aes67_sapsrv_getsockfds(sapsrv, &sockfds, &count); for(size_t i = 0; i < count; i++){ - FD_SET(sockfds[i], &fds); + FD_SET(sockfds[i], &rfds); + FD_SET(sockfds[i], &xfds); if (sockfds[i] > nfds){ nfds = sockfds[i]; } @@ -389,14 +400,16 @@ static void block_until_event() aes67_mdns_getsockfds(rav.mdns_context, &sockfds, &count); for (size_t i = 0; i < count; i++) { - FD_SET(sockfds[i], &fds); + FD_SET(sockfds[i], &rfds); + FD_SET(sockfds[i], &xfds); if (sockfds[i] > nfds) { nfds = sockfds[i]; } } if (rav.rtsp.state == aes67_rtsp_dsc_state_awaiting_response && rav.rtsp.sockfd != -1){ - FD_SET(rav.rtsp.sockfd, &fds); + FD_SET(rav.rtsp.sockfd, &rfds); + FD_SET(rav.rtsp.sockfd, &xfds); if (rav.rtsp.sockfd > nfds){ nfds = rav.rtsp.sockfd; } @@ -408,7 +421,7 @@ static void block_until_event() nfds++; // just wait until something interesting happens - select(nfds, &fds, NULL, &fds, NULL); + select(nfds, &rfds, NULL, &xfds, NULL); } static int sapsrv_setup() @@ -1027,7 +1040,7 @@ static int load_sdp_dir(const char * dname) } while ((dir = readdir(d)) != NULL) { - u8_t l = dir->d_namlen; + u8_t l = strlen(dir->d_name); if (l >= sizeof(".sdp") && strcmp(&dir->d_name[l - sizeof(".sdp")], ".sdp")){ printf("%s\n", dir->d_name); } @@ -1059,7 +1072,7 @@ static struct connection_st * connection_new(int sockfd, struct sockaddr_un * ad con->euid = 0; con->egid = 0; - getpeereid(sockfd, &con->euid, &con->egid); +// getpeereid(sockfd, &con->euid, &con->egid); con->next = local.first_connection; @@ -1115,10 +1128,10 @@ static int local_setup(const char * fname) strncpy (local.addr.sun_path, AES67_SAPD_LOCAL_SOCK, sizeof (local.addr.sun_path)); local.addr.sun_path[sizeof (local.addr.sun_path) - 1] = '\0'; - local.addr.sun_len = (offsetof (struct sockaddr_un, sun_path) + socklen_t un_len = (offsetof (struct sockaddr_un, sun_path) + strlen (local.addr.sun_path)); - if (bind (local.sockfd, (struct sockaddr *) &local.addr, local.addr.sun_len) < 0){ + if (bind (local.sockfd, (struct sockaddr *) &local.addr, un_len) < 0){ close(local.sockfd); local.sockfd = -1; perror ("bind(AF_LOCAL)"); @@ -1193,7 +1206,9 @@ static void local_accept() struct connection_st * con = connection_new(sockfd, &addr, socklen); - write(sockfd, MSG_VERSIONWELCOME "\n", sizeof(MSG_VERSIONWELCOME)); + if (write(sockfd, MSG_VERSIONWELCOME "\n", sizeof(MSG_VERSIONWELCOME)) == -1){ + syslog(LOG_ERR, "local_accept(): %s", strerror(errno)); + } syslog(LOG_INFO, "client connected: uid %d gid %d (count = %d)", con->euid, con->egid, local.nconnections); @@ -1322,12 +1337,16 @@ static void write_error(struct connection_st * con, const u32_t code, const char return; } - write(con->sockfd, buf, len); + if (write(con->sockfd, buf, len) == -1){ + syslog(LOG_ERR, "write_error(): %s", strerror(errno)); + } } static void write_ok(struct connection_st * con) { - write(con->sockfd, AES67_SAPD_MSG_OK "\n", sizeof(AES67_SAPD_MSG_OK)); + if (write(con->sockfd, AES67_SAPD_MSG_OK "\n", sizeof(AES67_SAPD_MSG_OK)) == -1){ + syslog(LOG_ERR, "write_ok(): %s", strerror(errno)); + } } static void write_toall_except(u8_t * msg, u16_t len, struct connection_st * except) @@ -1337,7 +1356,10 @@ static void write_toall_except(u8_t * msg, u16_t len, struct connection_st * exc while(current != NULL){ if (current != except){ - write(current->sockfd, msg, len); + if (write(current->sockfd, msg, len) == -1){ + syslog(LOG_ERR, "write_toall_except(): %s", strerror(errno)); + } + } current = current->next; @@ -1511,7 +1533,9 @@ static void write_list_entry(struct connection_st * con, aes67_sapsrv_session_t blen += payloadlen; } - write(con->sockfd, buf, blen); + if (write(con->sockfd, buf, blen) == -1){ + syslog(LOG_ERR, "write_list_entry: %s", strerror(errno)); + } } static void cmd_list(struct connection_st * con, u8_t * cmdline, size_t len) @@ -1582,7 +1606,9 @@ static void cmd_set(struct connection_st * con, u8_t * cmdline, size_t len) // consume sdp data u8_t t; while(len--){ - read(con->sockfd, &t, 1); + if (read(con->sockfd, &t, 1) == -1){ + syslog(LOG_ERR, "cmd_set(): %s", strerror(errno)); + } } return; @@ -1857,12 +1883,16 @@ static void write_rav_list_entry(struct connection_st * con, struct rav_session_ session->name ); - write(con->sockfd, buf, blen); + if (write(con->sockfd, buf, blen) == -1){ + syslog(LOG_ERR,"write_rav_list_entry() %s", strerror(errno)); + } if (return_payload && session->sdplen > 0){ assert(session->sdp != NULL); - write(con->sockfd, session->sdp, session->sdplen); + if (write(con->sockfd, session->sdp, session->sdplen) == -1){ + syslog(LOG_ERR,"write_rav_list_entry() %s", strerror(errno)); + } } } diff --git a/src/utils/sapsrv.c b/src/utils/sapsrv.c index efe0a8b47ef18071b9fb8afba9784cdb54c67006..43b838de732b9641232bcc5dd8915d8a3867d6cd 100644 --- a/src/utils/sapsrv.c +++ b/src/utils/sapsrv.c @@ -21,10 +21,13 @@ #include "aes67/sap.h" #include "aes67/sdp.h" -#include "assert.h" +#include <unistd.h> +#include <assert.h> #include <sys/socket.h> +#include <netinet/in.h> #include <netdb.h> -#include <libproc.h> +#include <fcntl.h> +//#include <libproc.h> #include <ifaddrs.h> #include <syslog.h> #include <errno.h> @@ -306,7 +309,7 @@ int aes67_sapsrv_leave_mcast_group(int sockfd, u32_t scope, unsigned int ipv6_if return EXIT_FAILURE; } - if (setsockopt(sockfd, IPPROTO_IP, optname, &mreq, optlen) < 0){ + if (setsockopt(sockfd, proto, optname, &mreq, optlen) < 0){ syslog(LOG_ERR, "setsockopt(IP_DROP_MEMBERSHIP/IPV6_LEAVE_GROUP): %s", strerror(errno)); return EXIT_FAILURE; } @@ -408,11 +411,9 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) struct sockaddr_in addr_in; struct sockaddr_in6 addr_in6; - addr_in.sin_len = sizeof(struct sockaddr_in); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(server->port); - addr_in6.sin6_len = sizeof(struct sockaddr_in6); addr_in6.sin6_family = AF_INET6; addr_in6.sin6_port = htons(server->port); @@ -420,7 +421,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv4_GLOBAL)){ memcpy(&addr_in.sin_addr, (u8_t[])AES67_SAP_IPv4_GLOBAL, 4); - if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, addr_in.sin_len)) != saplen){ + if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, sizeof(struct sockaddr_in))) != saplen){ syslog(LOG_ERR, "ipv4-g tx (%zd)", s); } else { syslog(LOG_DEBUG, "ipv4-g tx %zd", s); @@ -428,7 +429,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) } if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv4_ADMINISTERED)){ memcpy(&addr_in.sin_addr, (u8_t[])AES67_SAP_IPv4_ADMIN, 4); - if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, addr_in.sin_len)) != saplen){ + if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, sizeof(struct sockaddr_in))) != saplen){ syslog(LOG_ERR, "ipv4-a tx (%zd)", s); } else { syslog(LOG_DEBUG, "ipv4-a tx %zd", s); @@ -436,7 +437,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) } if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_LINKLOCAL)){ memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_LL, 16); - if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){ + if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){ syslog(LOG_ERR, "ipv6-ll tx (%zd)", s); } else { syslog(LOG_DEBUG, "ipv6-ll tx %zd", s); @@ -444,7 +445,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) } if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_ADMINLOCAL)){ memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_AL, 16); - if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){ + if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){ syslog(LOG_ERR, "ipv6-al tx (%zd)", s); } else { syslog(LOG_DEBUG, "ipv6-al tx %zd", s); @@ -452,7 +453,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) } if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_IPv4)){ memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_IP4, 16); - if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){ + if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){ syslog(LOG_ERR, "ipv6-v4 tx (%zd)", s); } else { syslog(LOG_DEBUG, "ipv6-v4 tx %zd", s); @@ -460,7 +461,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt) } if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_SITELOCAL)){ memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_SL, 16); - if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){ + if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){ syslog(LOG_ERR, "ipv6-sl tx (%zd)", s); } else { syslog(LOG_DEBUG, "ipv6-sl tx %zd", s); @@ -667,7 +668,6 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned server->first_session = NULL; if ((listen_scopes | send_scopes) & AES67_SAPSRV_SCOPE_IPv4){ - server->addr4.sin_len = sizeof(struct sockaddr_in); server->addr4.sin_family = AF_INET; server->addr4.sin_port = htons(port); @@ -684,7 +684,7 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned return NULL; } - if (bind(server->sockfd4, (struct sockaddr*)&server->addr4, server->addr4.sin_len) == -1){ + if (bind(server->sockfd4, (struct sockaddr*)&server->addr4, sizeof(struct sockaddr_in)) == -1){ syslog(LOG_ERR, "sapsrv ipv4 bind(): %s", strerror(errno)); if (server->sockfd4 != -1){ close(server->sockfd4); @@ -707,7 +707,6 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned } if ((listen_scopes | send_scopes) & AES67_SAPSRV_SCOPE_IPv6){ - server->addr6.sin6_len = sizeof(struct sockaddr_in6); server->addr6.sin6_family = AF_INET6; server->addr6.sin6_port = htons(port); @@ -729,7 +728,7 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned free(server); } - if (bind(server->sockfd6, (struct sockaddr*)&server->addr6, server->addr6.sin6_len) == -1){ + if (bind(server->sockfd6, (struct sockaddr*)&server->addr6, sizeof(struct sockaddr_in6)) == -1){ syslog(LOG_ERR, "sapsrv ipv6 bind(): %s", strerror(errno)); if (server->sockfd4 != -1){ close(server->sockfd4); @@ -805,17 +804,22 @@ void aes67_sapsrv_process(aes67_sapsrv_t sapserver) if (server->blocking){ int nfds = (server->sockfd4 > server->sockfd6 ? server->sockfd4 : server->sockfd6) + 1; - struct fd_set fds; + fd_set rfds; + fd_set xfds; + + FD_ZERO(&rfds); + FD_ZERO(&xfds); - FD_ZERO(&fds); if (server->sockfd4 != -1){ - FD_SET(server->sockfd4, &fds); + FD_SET(server->sockfd4, &rfds); + FD_SET(server->sockfd4, &xfds); } if (server->sockfd6 != -1){ - FD_SET(server->sockfd6, &fds); + FD_SET(server->sockfd6, &rfds); + FD_SET(server->sockfd6, &xfds); } - int s = select(nfds, &fds, NULL, &fds, NULL); + int s = select(nfds, &rfds, NULL, &xfds, NULL); if (s > 0){ if ( (rlen = recv(s, buf, sizeof(buf), 0)) > 0){ syslog(LOG_DEBUG, "sapsrv %s rx %zd", s == server->sockfd4 ? "ipv4" : "ipv6", rlen); diff --git a/src/utils/sdp-gen/sdp-gen.c b/src/utils/sdp-gen/sdp-gen.c index f8ac506e578c2e086787b56e7a83ea2af96983ca..16d8a713cf51e619961ed45983bbe0b6ef55ca88 100644 --- a/src/utils/sdp-gen/sdp-gen.c +++ b/src/utils/sdp-gen/sdp-gen.c @@ -404,7 +404,9 @@ int main(int argc, char * argv[]) return EXIT_FAILURE; } - write(STDOUT_FILENO, str, len); + if (write(STDOUT_FILENO, str, len) == -1){ + fprintf(stderr, "error writing to stdout\n"); + } return EXIT_SUCCESS; } \ No newline at end of file