[airplay] Separate naming of AirPlay 1 and 2, incl log domains

This commit is contained in:
ejurgensen 2021-01-04 00:05:04 +01:00
parent f16dc204b2
commit ef0f41dc46
13 changed files with 752 additions and 680 deletions

View File

@ -89,6 +89,10 @@ AC_SEARCH_LIBS([pthread_setname_np], [pthread],
[AC_SEARCH_LIBS([pthread_set_name_np], [pthread],
[AC_CHECK_FUNCS([pthread_set_name_np])])])
AC_SEARCH_LIBS([uuid_generate_random], [uuid],
[AC_DEFINE([HAVE_UUID], 1,
[Define to 1 if you have uuid_generate_random function])])
AC_SEARCH_LIBS([log10], [m])
AC_SEARCH_LIBS([lrint], [m])
AC_SEARCH_LIBS([fabs], [m])

View File

@ -21,7 +21,8 @@ Debug domains; available domains are: \fIconfig\fP, \fIdaap\fP,
\fIrsp\fP, \fIscan\fP, \fIxcode\fP, \fIevent\fP, \fIhttp\fP, \fIremote\fP,
\fIdacp\fP, \fIffmpeg\fP, \fIartwork\fP, \fIplayer\fP, \fIraop\fP,
\fIlaudio\fP, \fIdmap\fP, \fIfdbperf\fP, \fIspotify\fP, \fIlastfm\fP,
\fIcache\fP, \fImpd\fP, \fIstream\fP, \fIcast\fP, \fIfifo\fP, \fIlib\fP.
\fIcache\fP, \fImpd\fP, \fIstream\fP, \fIcast\fP, \fIfifo\fP, \fIlib\fP,
\fIweb\fP, \fIairplay\fP.
.TP
\fB\-c, \-\-config=\fR\fIfile\fP
Use \fIfile\fP as the configuration file.

View File

@ -58,7 +58,7 @@ static uint32_t logger_repeat_counter;
static uint32_t logger_last_hash;
static char *logfilename;
static FILE *logfile;
static char *labels[] = { "config", "daap", "db", "httpd", "http", "main", "mdns", "misc", "rsp", "scan", "xcode", "event", "remote", "dacp", "ffmpeg", "artwork", "player", "raop", "laudio", "dmap", "dbperf", "spotify", "lastfm", "cache", "mpd", "stream", "cast", "fifo", "lib", "web" };
static char *labels[] = { "config", "daap", "db", "httpd", "http", "main", "mdns", "misc", "rsp", "scan", "xcode", "event", "remote", "dacp", "ffmpeg", "artwork", "player", "raop", "laudio", "dmap", "dbperf", "spotify", "lastfm", "cache", "mpd", "stream", "cast", "fifo", "lib", "web", "airplay" };
static char *severities[] = { "FATAL", "LOG", "WARN", "INFO", "DEBUG", "SPAM" };

View File

@ -36,8 +36,9 @@
#define L_FIFO 27
#define L_LIB 28
#define L_WEB 29
#define L_AIRPLAY 30
#define N_LOGDOMAINS 30
#define N_LOGDOMAINS 31
/* Severities */
#define E_FATAL 0

View File

@ -34,11 +34,15 @@
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>
#include <limits.h>
#include <sys/param.h>
#ifndef CLOCK_REALTIME
#include <sys/time.h>
#endif
#ifdef HAVE_UUID
#include <uuid/uuid.h>
#endif
#include <unistr.h>
#include <uniconv.h>
@ -1011,6 +1015,46 @@ murmur_hash64(const void *key, int len, uint32_t seed)
# error Platform not supported
#endif
#ifdef HAVE_UUID
void
uuid_make(char *str)
{
uuid_t uu;
uuid_generate_random(uu);
uuid_unparse_upper(uu, str);
}
#else
void
uuid_make(char *str)
{
uint16_t uuid[8];
time_t now;
int i;
now = time(NULL);
srand((unsigned int)now);
for (i = 0; i < ARRAY_SIZE(uuid); i++)
{
uuid[i] = (uint16_t)rand();
// time_hi_and_version, set version to 4 (=random)
if (i == 3)
uuid[i] = (uuid[i] & 0x0FFF) | 0x4000;
// clock_seq, variant 1
if (i == 4)
uuid[i] = (uuid[i] & 0x3FFF) | 0x8000;
if (i == 2 || i == 3 || i == 4 || i == 5)
str += sprintf(str, "-");
str += sprintf(str, "%04" PRIX16, uuid[i]);
}
}
#endif
int
linear_regression(double *m, double *b, double *r2, const double *x, const double *y, int n)

View File

@ -150,6 +150,9 @@ b64_encode(const uint8_t *src, int srclen);
uint64_t
murmur_hash64(const void *key, int len, uint32_t seed);
void
uuid_make(char *str);
int
linear_regression(double *m, double *b, double *r, const double *x, const double *y, int n);

File diff suppressed because it is too large Load Diff

View File

@ -81,19 +81,19 @@ struct pair_definition
void (*pair_setup_free)(struct pair_setup_context *sctx);
int (*pair_setup_result)(const uint8_t **key, size_t *key_len, struct pair_setup_context *sctx);
uint8_t *(*pair_setup_request1)(uint32_t *len, struct pair_setup_context *sctx);
uint8_t *(*pair_setup_request2)(uint32_t *len, struct pair_setup_context *sctx);
uint8_t *(*pair_setup_request3)(uint32_t *len, struct pair_setup_context *sctx);
uint8_t *(*pair_setup_request1)(size_t *len, struct pair_setup_context *sctx);
uint8_t *(*pair_setup_request2)(size_t *len, struct pair_setup_context *sctx);
uint8_t *(*pair_setup_request3)(size_t *len, struct pair_setup_context *sctx);
int (*pair_setup_response1)(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len);
int (*pair_setup_response2)(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len);
int (*pair_setup_response3)(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len);
int (*pair_setup_response1)(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len);
int (*pair_setup_response2)(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len);
int (*pair_setup_response3)(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len);
uint8_t *(*pair_verify_request1)(uint32_t *len, struct pair_verify_context *vctx);
uint8_t *(*pair_verify_request2)(uint32_t *len, struct pair_verify_context *vctx);
uint8_t *(*pair_verify_request1)(size_t *len, struct pair_verify_context *vctx);
uint8_t *(*pair_verify_request2)(size_t *len, struct pair_verify_context *vctx);
int (*pair_verify_response1)(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len);
int (*pair_verify_response2)(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len);
int (*pair_verify_response1)(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len);
int (*pair_verify_response2)(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len);
struct pair_cipher_context *(*pair_cipher_new)(struct pair_definition *type, int channel, const uint8_t *shared_secret, size_t shared_secret_len);
void (*pair_cipher_free)(struct pair_cipher_context *cctx);

View File

@ -299,7 +299,7 @@ pair_setup_errmsg(struct pair_setup_context *sctx)
}
uint8_t *
pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request1(size_t *len, struct pair_setup_context *sctx)
{
if (!sctx->type->pair_setup_request1)
return NULL;
@ -313,7 +313,7 @@ pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx)
}
uint8_t *
pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request2(size_t *len, struct pair_setup_context *sctx)
{
if (!sctx->type->pair_setup_request2)
return NULL;
@ -322,7 +322,7 @@ pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx)
}
uint8_t *
pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request3(size_t *len, struct pair_setup_context *sctx)
{
if (!sctx->type->pair_setup_request3)
return NULL;
@ -331,7 +331,7 @@ pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx)
}
int
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
if (!sctx->type->pair_setup_response1)
return -1;
@ -340,7 +340,7 @@ pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint3
}
int
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
if (!sctx->type->pair_setup_response2)
return -1;
@ -349,7 +349,7 @@ pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint3
}
int
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
if (!sctx->type->pair_setup_response3)
return -1;
@ -466,7 +466,7 @@ pair_verify_errmsg(struct pair_verify_context *vctx)
}
uint8_t *
pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx)
pair_verify_request1(size_t *len, struct pair_verify_context *vctx)
{
if (!vctx->type->pair_verify_request1)
return NULL;
@ -475,7 +475,7 @@ pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx)
}
uint8_t *
pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx)
pair_verify_request2(size_t *len, struct pair_verify_context *vctx)
{
if (!vctx->type->pair_verify_request2)
return NULL;
@ -484,7 +484,7 @@ pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx)
}
int
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len)
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len)
{
if (!vctx->type->pair_verify_response1)
return -1;
@ -493,7 +493,7 @@ pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uin
}
int
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len)
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len)
{
if (!vctx->type->pair_verify_response2)
return -1;

View File

@ -35,18 +35,18 @@ const char *
pair_setup_errmsg(struct pair_setup_context *sctx);
uint8_t *
pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx);
pair_setup_request1(size_t *len, struct pair_setup_context *sctx);
uint8_t *
pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx);
pair_setup_request2(size_t *len, struct pair_setup_context *sctx);
uint8_t *
pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx);
pair_setup_request3(size_t *len, struct pair_setup_context *sctx);
int
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len);
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len);
int
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len);
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len);
int
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len);
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len);
/* Returns a 0-terminated string that is the authorisation key, along with a
* pointer to the binary representation. The string can be used to initialize
@ -73,14 +73,14 @@ const char *
pair_verify_errmsg(struct pair_verify_context *vctx);
uint8_t *
pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx);
pair_verify_request1(size_t *len, struct pair_verify_context *vctx);
uint8_t *
pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx);
pair_verify_request2(size_t *len, struct pair_verify_context *vctx);
int
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len);
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len);
int
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len);
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len);
/* Returns a pointer to the shared secret that is the result of the pairing.
* Note that the pointers become invalid when you free vctx.

View File

@ -634,11 +634,12 @@ pair_setup_free(struct pair_setup_context *sctx)
}
static uint8_t *
pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request1(size_t *len, struct pair_setup_context *sctx)
{
plist_t dict;
plist_t method;
plist_t user;
uint32_t uint32;
char *data = NULL; // Necessary to initialize because plist_to_bin() uses value
sctx->user = srp_user_new(HASH_SHA1, SRP_NG_2048, USERNAME, (unsigned char *)sctx->pin, sizeof(sctx->pin), 0, 0);
@ -650,19 +651,21 @@ pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx)
plist_dict_set_item(dict, "method", method);
plist_dict_set_item(dict, "user", user);
plist_to_bin(dict, &data, len);
plist_to_bin(dict, &data, &uint32);
plist_free(dict);
*len = (size_t)uint32;
return (uint8_t *)data;
}
static uint8_t *
pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request2(size_t *len, struct pair_setup_context *sctx)
{
plist_t dict;
plist_t pk;
plist_t proof;
const char *auth_username = NULL;
uint32_t uint32;
char *data = NULL;
// Calculate A
@ -677,18 +680,20 @@ pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx)
dict = plist_new_dict();
plist_dict_set_item(dict, "pk", pk);
plist_dict_set_item(dict, "proof", proof);
plist_to_bin(dict, &data, len);
plist_to_bin(dict, &data, &uint32);
plist_free(dict);
*len = (size_t)uint32;
return (uint8_t *)data;
}
static uint8_t *
pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request3(size_t *len, struct pair_setup_context *sctx)
{
plist_t dict;
plist_t epk;
plist_t authtag;
uint32_t uint32;
char *data = NULL;
const unsigned char *session_key;
int session_key_len;
@ -740,14 +745,15 @@ pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx)
dict = plist_new_dict();
plist_dict_set_item(dict, "epk", epk);
plist_dict_set_item(dict, "authTag", authtag);
plist_to_bin(dict, &data, len);
plist_to_bin(dict, &data, &uint32);
plist_free(dict);
*len = (size_t)uint32;
return (uint8_t *)data;
}
static int
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
plist_t dict;
plist_t pk;
@ -773,7 +779,7 @@ pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint3
}
static int
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
plist_t dict;
plist_t proof;
@ -804,7 +810,7 @@ pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint3
}
static int
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
plist_t dict;
plist_t epk;
@ -855,7 +861,7 @@ pair_setup_result(const uint8_t **key, size_t *key_len, struct pair_setup_contex
static uint8_t *
pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx)
pair_verify_request1(size_t *len, struct pair_verify_context *vctx)
{
const uint8_t basepoint[32] = {9};
uint8_t *data;
@ -884,7 +890,7 @@ pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx)
}
static uint8_t *
pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx)
pair_verify_request2(size_t *len, struct pair_verify_context *vctx)
{
uint8_t shared_secret[crypto_scalarmult_BYTES];
uint8_t key[SHA512_DIGEST_LENGTH];
@ -952,9 +958,9 @@ pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx)
}
static int
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len)
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len)
{
uint32_t wanted;
size_t wanted;
wanted = sizeof(vctx->server_eph_public_key) + sizeof(vctx->server_public_key);
if (data_len < wanted)
@ -970,7 +976,7 @@ pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uin
}
static int
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len)
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len)
{
// TODO actually check response
return 0;

View File

@ -739,7 +739,7 @@ tlv_debug(const tlv_values_t *values)
#endif
static tlv_values_t *
response_process(const uint8_t *data, uint32_t data_len, const char **errmsg)
response_process(const uint8_t *data, size_t data_len, const char **errmsg)
{
tlv_values_t *response;
tlv_t *error;
@ -767,7 +767,7 @@ response_process(const uint8_t *data, uint32_t data_len, const char **errmsg)
if (error)
{
if (error->value[0] == TLVError_Authentication)
*errmsg = "Device returned an authtication failure";
*errmsg = "Device returned an authentication failure";
else if (error->value[0] == TLVError_Backoff)
*errmsg = "Device told us to back off pairing attempts\n";
else if (error->value[0] == TLVError_MaxPeers)
@ -1081,7 +1081,7 @@ pair_setup_free(struct pair_setup_context *sctx)
}
static uint8_t *
pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request1(size_t *len, struct pair_setup_context *sctx)
{
tlv_values_t *request;
uint8_t *data;
@ -1138,7 +1138,7 @@ pair_setup_request1(uint32_t *len, struct pair_setup_context *sctx)
}
static uint8_t *
pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request2(size_t *len, struct pair_setup_context *sctx)
{
tlv_values_t *request;
uint8_t *data;
@ -1179,7 +1179,7 @@ pair_setup_request2(uint32_t *len, struct pair_setup_context *sctx)
}
static uint8_t *
pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx)
pair_setup_request3(size_t *len, struct pair_setup_context *sctx)
{
tlv_values_t *request;
uint8_t *data;
@ -1282,7 +1282,7 @@ pair_setup_request3(uint32_t *len, struct pair_setup_context *sctx)
}
static int
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
tlv_values_t *response;
tlv_t *pk;
@ -1291,7 +1291,6 @@ pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint3
response = response_process(data, data_len, &sctx->errmsg);
if (!response)
{
sctx->errmsg = "Setup response 1: Could not parse TLV";
return -1;
}
@ -1320,7 +1319,7 @@ pair_setup_response1(struct pair_setup_context *sctx, const uint8_t *data, uint3
}
static int
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
tlv_values_t *response;
tlv_t *proof;
@ -1328,7 +1327,6 @@ pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint3
response = response_process(data, data_len, &sctx->errmsg);
if (!response)
{
sctx->errmsg = "Setup response 2: Could not parse TLV";
return -1;
}
@ -1364,7 +1362,7 @@ pair_setup_response2(struct pair_setup_context *sctx, const uint8_t *data, uint3
}
static int
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, uint32_t data_len)
pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, size_t data_len)
{
tlv_values_t *response;
tlv_t *encrypted_data;
@ -1380,7 +1378,6 @@ pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, uint3
response = response_process(data, data_len, &sctx->errmsg);
if (!response)
{
sctx->errmsg = "Setup response 3: Could not parse TLV";
return -1;
}
@ -1429,7 +1426,6 @@ pair_setup_response3(struct pair_setup_context *sctx, const uint8_t *data, uint3
response = response_process(decrypted_data, encrypted_len, &sctx->errmsg);
if (!response)
{
sctx->errmsg = "Setup response 3: Could not parse decrypted TLV";
goto error;
}
@ -1477,7 +1473,7 @@ pair_setup_result(const uint8_t **key, size_t *key_len, struct pair_setup_contex
}
static uint8_t *
pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx)
pair_verify_request1(size_t *len, struct pair_verify_context *vctx)
{
const uint8_t basepoint[32] = {9};
tlv_values_t *request;
@ -1518,7 +1514,7 @@ pair_verify_request1(uint32_t *len, struct pair_verify_context *vctx)
}
static uint8_t *
pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx)
pair_verify_request2(size_t *len, struct pair_verify_context *vctx)
{
tlv_values_t *request;
uint8_t *data;
@ -1588,7 +1584,7 @@ pair_verify_request2(uint32_t *len, struct pair_verify_context *vctx)
}
static int
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len)
pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len)
{
tlv_values_t *response;
tlv_t *encrypted_data;
@ -1603,7 +1599,6 @@ pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uin
response = response_process(data, data_len, &vctx->errmsg);
if (!response)
{
vctx->errmsg = "Verify response 1: Could not parse TLV";
return -1;
}
@ -1660,7 +1655,6 @@ pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uin
response = response_process(decrypted_data, encrypted_len, &vctx->errmsg);
if (!response)
{
vctx->errmsg = "Verify response 1: Could not parse decrypted TLV";
goto error;
}
@ -1677,7 +1671,7 @@ pair_verify_response1(struct pair_verify_context *vctx, const uint8_t *data, uin
}
static int
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, uint32_t data_len)
pair_verify_response2(struct pair_verify_context *vctx, const uint8_t *data, size_t data_len)
{
// TODO actually check response
return 0;

View File

@ -4035,7 +4035,7 @@ raop_pair_request_send(int step, struct raop_session *rs, void (*cb)(struct evrt
{
struct evrtsp_request *req;
uint8_t *body;
uint32_t len;
size_t len;
const char *errmsg;
const char *url;
const char *ctype;
@ -4952,7 +4952,7 @@ raop_deinit(void)
struct output_definition output_raop =
{
.name = "AirPlay",
.name = "AirPlay 1",
.type = OUTPUT_TYPE_RAOP,
#ifdef PREFER_AIRPLAY2
.priority = 2,