diff --git a/lib/http_response.c b/lib/http_response.c index 2a18a77..50f1d89 100644 --- a/lib/http_response.c +++ b/lib/http_response.c @@ -51,10 +51,29 @@ http_response_add_data(http_response_t *response, const char *data, int datalen) response->data_length += datalen; } + http_response_t * -http_response_init(const char *protocol, int code, const char *message) +http_response_create() { - http_response_t *response; + http_response_t *response = (http_response_t *) calloc(1, sizeof(http_response_t)); + if (!response) { + return NULL; + } + /* Allocate response data */ + response->data_size = 1024; + response->data = (char *) malloc(response->data_size); + if (!response->data) { + free(response); + return NULL; + } + return response; +} + +void +http_response_init(http_response_t *response, const char *protocol, int code, const char *message) +{ + assert(response); + response->data_length = 0; /* can be used to reinitialize a previously-initialized response */ char codestr[4]; assert(code >= 100 && code < 1000); @@ -63,19 +82,6 @@ http_response_init(const char *protocol, int code, const char *message) memset(codestr, 0, sizeof(codestr)); snprintf(codestr, sizeof(codestr), "%u", code); - response = calloc(1, sizeof(http_response_t)); - if (!response) { - return NULL; - } - - /* Allocate response data */ - response->data_size = 1024; - response->data = malloc(response->data_size); - if (!response->data) { - free(response); - return NULL; - } - /* Add first line of response to the data array */ http_response_add_data(response, protocol, strlen(protocol)); http_response_add_data(response, " ", 1); @@ -83,8 +89,6 @@ http_response_init(const char *protocol, int code, const char *message) http_response_add_data(response, " ", 1); http_response_add_data(response, message, strlen(message)); http_response_add_data(response, "\r\n", 2); - - return response; } void diff --git a/lib/http_response.h b/lib/http_response.h index 43e1128..fcc7899 100644 --- a/lib/http_response.h +++ b/lib/http_response.h @@ -10,6 +10,9 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. + * + *============================================================== + * modified fduncanh 2024 */ #ifndef HTTP_RESPONSE_H @@ -17,7 +20,8 @@ typedef struct http_response_s http_response_t; -http_response_t *http_response_init(const char *protocol, int code, const char *message); +http_response_t *http_response_create(); +void http_response_init(http_response_t *response, const char *protocol, int code, const char *message); void http_response_add_header(http_response_t *response, const char *name, const char *value); void http_response_finish(http_response_t *response, const char *data, int datalen); diff --git a/lib/raop.c b/lib/raop.c index b388be8..b3c7921 100644 --- a/lib/raop.c +++ b/lib/raop.c @@ -174,8 +174,9 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { if (httpd_count_connection_type(conn->raop->httpd, CONNECTION_TYPE_RAOP)) { char ipaddr[40]; utils_ipaddress_to_string(conn->remotelen, conn->remote, conn->zone_id, ipaddr, (int) (sizeof(ipaddr))); - logger_log(conn->raop->logger, LOGGER_WARNING, "rejecting new connection request from %s", ipaddr); - *response = http_response_init(protocol, 409, "Conflict: Server is connected to another client"); + logger_log(conn->raop->logger, LOGGER_WARNING, "rejecting new connection request from %s", ipaddr); + *response = http_response_create(); + http_response_init(*response, protocol, 409, "Conflict: Server is connected to another client"); goto finish; } httpd_set_connection_type(conn->raop->httpd, ptr, CONNECTION_TYPE_RAOP); @@ -236,8 +237,8 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { } } - *response = http_response_init(protocol, 200, "OK"); - + *response = http_response_create(); + http_response_init(*response, protocol, 200, "OK"); //http_response_add_header(*response, "Apple-Jack-Status", "connected; type=analog"); diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index 9942970..6493c33 100644 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -354,8 +354,7 @@ raop_handler_pairsetup_pin(raop_conn_t *conn, return; } authentication_failed:; - http_response_destroy(response); - response = http_response_init("RTSP/1.0", 470, "Client Authentication Failure"); + http_response_init(response, "RTSP/1.0", 470, "Client Authentication Failure"); } static void @@ -748,12 +747,13 @@ raop_handler_setup(raop_conn_t *conn, conn->raop_rtp_mirror = raop_rtp_mirror_init(conn->raop->logger, &conn->raop->callbacks, conn->raop_ntp, remote, conn->remotelen, aeskey); - plist_t res_event_port_node = plist_new_uint(conn->raop->port); + // plist_t res_event_port_node = plist_new_uint(conn->raop->port); + plist_t res_event_port_node = plist_new_uint(0); plist_t res_timing_port_node = plist_new_uint(timing_lport); plist_dict_set_item(res_root_node, "timingPort", res_timing_port_node); plist_dict_set_item(res_root_node, "eventPort", res_event_port_node); - logger_log(conn->raop->logger, LOGGER_DEBUG, "eport = %d, tport = %d", conn->raop->port, timing_lport); + logger_log(conn->raop->logger, LOGGER_DEBUG, "eport = %d, tport = %d", 0, timing_lport); } // Process stream setup requests