aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xaesopt.h22
-rwxr-xr-xchannels/chan_alsa.c2
-rwxr-xr-xchannels/chan_oss.c18
-rwxr-xr-xchannels/iax2-parser.c71
-rwxr-xr-xdns.c5
-rwxr-xr-xformats/format_g726.c10
-rwxr-xr-xformats/format_g729.c10
-rwxr-xr-xformats/format_gsm.c10
-rwxr-xr-xformats/format_h263.c10
-rwxr-xr-xformats/format_ilbc.c10
-rwxr-xr-xformats/format_jpeg.c10
-rwxr-xr-xformats/format_pcm.c10
-rwxr-xr-xformats/format_pcm_alaw.c10
-rwxr-xr-xformats/format_sln.c10
-rwxr-xr-xformats/format_vox.c10
-rwxr-xr-xformats/format_wav.c10
-rwxr-xr-xformats/format_wav_gsm.c10
-rwxr-xr-xinclude/asterisk/endian.h50
-rwxr-xr-xinclude/asterisk/frame.h40
-rwxr-xr-xinclude/asterisk/unaligned.h95
-rwxr-xr-xmd5.c21
-rwxr-xr-xrtp.c19
22 files changed, 200 insertions, 263 deletions
diff --git a/aesopt.h b/aesopt.h
index f476de09e..85ad46688 100755
--- a/aesopt.h
+++ b/aesopt.h
@@ -136,6 +136,7 @@
#define _AESOPT_H
#include <asterisk/aes.h>
+#include <asterisk/endian.h>
/* CONFIGURATION - USE OF DEFINES
@@ -146,27 +147,6 @@
#if clauses.
*/
-/* PLATFORM SPECIFIC INCLUDES */
-
-#if defined( __OpenBSD__ )
-# include <machine/types.h>
-# include <sys/endian.h>
-#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/types.h>
-# include <sys/endian.h>
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
-# include <machine/endian.h>
-#elif defined ( SOLARIS )
-# include <solaris-compat/compat.h>
-#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
-# include <endian.h>
-#if !defined(__APPLE__)
-# include <byteswap.h>
-#endif
-#elif defined( linux )
-# include <endian.h>
-#endif
-
/* BYTE ORDER IN 32-BIT WORDS
To obtain the highest speed on processors with 32-bit words, this code
diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c
index 9811cb8d2..fb2b93b30 100755
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -19,6 +19,7 @@
#include <asterisk/cli.h>
#include <asterisk/utils.h>
#include <asterisk/causes.h>
+#include <asterisk/endian.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -27,7 +28,6 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
-#include <endian.h>
#define ALSA_PCM_NEW_HW_PARAMS_API
#define ALSA_PCM_NEW_SW_PARAMS_API
diff --git a/channels/chan_oss.c b/channels/chan_oss.c
index 480408eb7..6a580d48c 100755
--- a/channels/chan_oss.c
+++ b/channels/chan_oss.c
@@ -26,6 +26,7 @@
#include <asterisk/cli.h>
#include <asterisk/utils.h>
#include <asterisk/causes.h>
+#include <asterisk/endian.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -35,23 +36,6 @@
#include <stdlib.h>
#include <stdio.h>
-#if defined( __OpenBSD__ )
-# include <sys/endian.h>
-#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/endian.h>
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
-# include <machine/endian.h>
-#elif defined ( SOLARIS )
-# include <solaris-compat/compat.h>
-#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
-# include <endian.h>
-#if !defined(__APPLE__)
-# include <byteswap.h>
-#endif
-#elif defined( linux )
-# include <endian.h>
-#endif
-
#ifdef __linux
#include <linux/soundcard.h>
#elif defined(__FreeBSD__)
diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c
index 66a69b447..3472b5008 100755
--- a/channels/iax2-parser.c
+++ b/channels/iax2-parser.c
@@ -17,6 +17,7 @@
#include <netinet/in.h>
#include <asterisk/frame.h>
#include <asterisk/utils.h>
+#include <asterisk/unaligned.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
@@ -30,22 +31,6 @@ static int frames = 0;
static int iframes = 0;
static int oframes = 0;
-#if defined(SOLARIS) && defined(__sparc__)
-static unsigned int get_uint32(unsigned char *p)
-{
- return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
-}
-
-static unsigned short get_uint16(unsigned char *p)
-{
- return (p[0] << 8) | p[1] ;
-}
-
-#else
-#define get_uint32(p) (*((unsigned int *)(p)))
-#define get_uint16(p) (*((unsigned short *)(p)))
-#endif
-
static void internaloutput(const char *str)
{
fputs(str, stdout);
@@ -102,7 +87,7 @@ static void dump_prefs(char *output, int maxlen, void *value, int len)
static void dump_int(char *output, int maxlen, void *value, int len)
{
if (len == (int)sizeof(unsigned int))
- snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_uint32(value)));
+ snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_unaligned_uint32(value)));
else
snprintf(output, maxlen, "Invalid INT");
}
@@ -110,7 +95,7 @@ static void dump_int(char *output, int maxlen, void *value, int len)
static void dump_short(char *output, int maxlen, void *value, int len)
{
if (len == (int)sizeof(unsigned short))
- snprintf(output, maxlen, "%d", ntohs(get_uint16(value)));
+ snprintf(output, maxlen, "%d", ntohs(get_unaligned_uint16(value)));
else
snprintf(output, maxlen, "Invalid SHORT");
}
@@ -140,8 +125,8 @@ static void dump_prov_flags(char *output, int maxlen, void *value, int len)
{
char buf[256] = "";
if (len == (int)sizeof(unsigned int))
- snprintf(output, maxlen, "%lu (%s)", (unsigned long)ntohl(get_uint32(value)),
- iax_provflags2str(buf, sizeof(buf), ntohl(get_uint32(value))));
+ snprintf(output, maxlen, "%lu (%s)", (unsigned long)ntohl(get_unaligned_uint32(value)),
+ iax_provflags2str(buf, sizeof(buf), ntohl(get_unaligned_uint32(value))));
else
snprintf(output, maxlen, "Invalid INT");
}
@@ -600,14 +585,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting capability to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->capability = ntohl(get_uint32(data + 2));
+ ies->capability = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_FORMAT:
if (len != (int)sizeof(unsigned int)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting format to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->format = ntohl(get_uint32(data + 2));
+ ies->format = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_LANGUAGE:
ies->language = data + 2;
@@ -617,21 +602,21 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->version = ntohs(get_uint16(data + 2));
+ ies->version = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_ADSICPE:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting adsicpe to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->adsicpe = ntohs(get_uint16(data + 2));
+ ies->adsicpe = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_SAMPLINGRATE:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting samplingrate to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->samprate = ntohs(get_uint16(data + 2));
+ ies->samprate = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DNID:
ies->dnid = data + 2;
@@ -644,14 +629,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting authmethods to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->authmethods = ntohs(get_uint16(data + 2));
+ ies->authmethods = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_ENCRYPTION:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting encryption to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->encmethods = ntohs(get_uint16(data + 2));
+ ies->encmethods = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_CHALLENGE:
ies->challenge = data + 2;
@@ -670,21 +655,21 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting refresh to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->refresh = ntohs(get_uint16(data + 2));
+ ies->refresh = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DPSTATUS:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting dpstatus to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->dpstatus = ntohs(get_uint16(data + 2));
+ ies->dpstatus = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_CALLNO:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting callno to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->callno = ntohs(get_uint16(data + 2));
+ ies->callno = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_CAUSE:
ies->cause = data + 2;
@@ -710,7 +695,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->msgcount = ntohs(get_uint16(data + 2));
+ ies->msgcount = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_AUTOANSWER:
ies->autoanswer = 1;
@@ -723,21 +708,21 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting transferid to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->transferid = ntohl(get_uint32(data + 2));
+ ies->transferid = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_DATETIME:
if (len != (int)sizeof(unsigned int)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->datetime = ntohl(get_uint32(data + 2));
+ ies->datetime = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_FIRMWAREVER:
if (len != (int)sizeof(unsigned short)) {
snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->firmwarever = ntohs(get_uint16(data + 2));
+ ies->firmwarever = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DEVICETYPE:
ies->devicetype = data + 2;
@@ -750,7 +735,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expected block desc to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else
- ies->fwdesc = ntohl(get_uint32(data + 2));
+ ies->fwdesc = ntohl(get_unaligned_uint32(data + 2));
break;
case IAX_IE_FWBLOCKDATA:
ies->fwdata = data + 2;
@@ -766,7 +751,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
errorf(tmp);
} else {
ies->provverpres = 1;
- ies->provver = ntohl(get_uint32(data + 2));
+ ies->provver = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_CALLINGPRES:
@@ -790,14 +775,14 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->calling_tns = ntohs(get_uint16(data + 2));
+ ies->calling_tns = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_RR_JITTER:
if (len != (int)sizeof(unsigned int)) {
snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_jitter = ntohl(get_uint32(data + 2));
+ ies->rr_jitter = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_LOSS:
@@ -805,7 +790,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_loss = ntohl(get_uint32(data + 2));
+ ies->rr_loss = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_PKTS:
@@ -813,7 +798,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_pkts = ntohl(get_uint32(data + 2));
+ ies->rr_pkts = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_DELAY:
@@ -821,7 +806,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else {
- ies->rr_delay = ntohs(get_uint16(data + 2));
+ ies->rr_delay = ntohs(get_unaligned_uint16(data + 2));
}
break;
case IAX_IE_RR_DROPPED:
@@ -829,7 +814,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_dropped = ntohl(get_uint32(data + 2));
+ ies->rr_dropped = ntohl(get_unaligned_uint32(data + 2));
}
break;
case IAX_IE_RR_OOO:
@@ -837,7 +822,7 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
errorf(tmp);
} else {
- ies->rr_ooo = ntohl(get_uint32(data + 2));
+ ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2));
}
break;
default:
diff --git a/dns.c b/dns.c
index 359fd9e8e..807d2c279 100755
--- a/dns.c
+++ b/dns.c
@@ -19,12 +19,13 @@
#include <asterisk/logger.h>
#include <asterisk/channel.h>
#include <asterisk/dns.h>
+#include <asterisk/endian.h>
#define MAX_SIZE 4096
typedef struct {
unsigned id :16; /* query identification number */
-#if BYTE_ORDER == BIG_ENDIAN
+#if __BYTE_ORDER == __BIG_ENDIAN
/* fields in third byte */
unsigned qr: 1; /* response flag */
unsigned opcode: 4; /* purpose of message */
@@ -38,7 +39,7 @@ typedef struct {
unsigned cd: 1; /* checking disabled by resolver */
unsigned rcode :4; /* response code */
#endif
-#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
+#if __BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __PDP_ENDIAN
/* fields in third byte */
unsigned rd :1; /* recursion desired */
unsigned tc :1; /* truncated message */
diff --git a/formats/format_g726.c b/formats/format_g726.c
index d549823c8..0371a7558 100755
--- a/formats/format_g726.c
+++ b/formats/format_g726.c
@@ -16,6 +16,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -24,15 +25,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define RATE_40 0
#define RATE_32 1
diff --git a/formats/format_g729.c b/formats/format_g729.c
index 5e79c00e1..46fd0953f 100755
--- a/formats/format_g729.c
+++ b/formats/format_g729.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makeg729e.c by Jeffrey Chilton */
diff --git a/formats/format_gsm.c b/formats/format_gsm.c
index 8c3f2d517..c4a63aa68 100755
--- a/formats/format_gsm.c
+++ b/formats/format_gsm.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#include "msgsm.h"
/* Some Ideas for this code came from makegsme.c by Jeffrey Chilton */
diff --git a/formats/format_h263.c b/formats/format_h263.c
index 17805b231..a676cf8fb 100755
--- a/formats/format_h263.c
+++ b/formats/format_h263.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makeh263e.c by Jeffrey Chilton */
diff --git a/formats/format_ilbc.c b/formats/format_ilbc.c
index 571e74d67..c34099461 100755
--- a/formats/format_ilbc.c
+++ b/formats/format_ilbc.c
@@ -19,6 +19,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -27,15 +28,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makeg729e.c by Jeffrey Chilton */
diff --git a/formats/format_jpeg.c b/formats/format_jpeg.c
index b08403009..d750e567e 100755
--- a/formats/format_jpeg.c
+++ b/formats/format_jpeg.c
@@ -19,6 +19,7 @@
#include <asterisk/module.h>
#include <asterisk/image.h>
#include <asterisk/lock.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -27,15 +28,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
static char *desc = "JPEG (Joint Picture Experts Group) Image Format";
diff --git a/formats/format_pcm.c b/formats/format_pcm.c
index 14edd0bb6..79f5f226a 100755
--- a/formats/format_pcm.c
+++ b/formats/format_pcm.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 160 /* 160 samples */
diff --git a/formats/format_pcm_alaw.c b/formats/format_pcm_alaw.c
index b677bb6fe..b5f27be39 100755
--- a/formats/format_pcm_alaw.c
+++ b/formats/format_pcm_alaw.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -27,15 +28,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 160 /* 160 samples */
diff --git a/formats/format_sln.c b/formats/format_sln.c
index d1826a366..4c0b1bc52 100755
--- a/formats/format_sln.c
+++ b/formats/format_sln.c
@@ -15,6 +15,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -23,15 +24,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 320 /* 320 samples */
diff --git a/formats/format_vox.c b/formats/format_vox.c
index 7601994fd..3413a4aa2 100755
--- a/formats/format_vox.c
+++ b/formats/format_vox.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#define BUF_SIZE 80 /* 160 samples */
diff --git a/formats/format_wav.c b/formats/format_wav.c
index c0781f6f0..66b82d468 100755
--- a/formats/format_wav.c
+++ b/formats/format_wav.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
/* Some Ideas for this code came from makewave.c by Jeffrey Chilton */
diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c
index b1a0c1c1e..fcd4c2ac2 100755
--- a/formats/format_wav_gsm.c
+++ b/formats/format_wav_gsm.c
@@ -17,6 +17,7 @@
#include <asterisk/logger.h>
#include <asterisk/sched.h>
#include <asterisk/module.h>
+#include <asterisk/endian.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
@@ -25,15 +26,6 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
-#ifdef __linux__
-#include <endian.h>
-#else
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#else
-#include <machine/endian.h>
-#endif
-#endif
#include "msgsm.h"
/* Some Ideas for this code came from makewave.c by Jeffrey Chilton */
diff --git a/include/asterisk/endian.h b/include/asterisk/endian.h
new file mode 100755
index 000000000..66f796250
--- /dev/null
+++ b/include/asterisk/endian.h
@@ -0,0 +1,50 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Asterisk internal frame definitions.
+ *
+ * Copyright (C) 1999 - 2005, Digium, Inc.
+ *
+ * Mark Spencer <markster@digium.com>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU Lesser General Public License. Other components of
+ * Asterisk are distributed under The GNU General Public License
+ * only.
+ */
+
+#ifndef _ASTERISK_ENDIAN_H
+#define _ASTERISK_ENDIAN_H
+
+/*
+ * Autodetect system endianess
+ */
+
+#if defined( __OpenBSD__ )
+# include <machine/types.h>
+# include <sys/endian.h>
+#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
+# include <sys/types.h>
+# include <sys/endian.h>
+#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
+# include <machine/endian.h>
+#elif defined ( SOLARIS )
+# include <solaris-compat/compat.h>
+#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
+# include <endian.h>
+#if !defined(__APPLE__)
+# include <byteswap.h>
+#endif
+#elif defined( linux )
+# include <endian.h>
+#endif
+
+#ifndef BYTE_ORDER
+#define BYTE_ORDER __BYTE_ORDER
+#endif
+
+#ifndef __BYTE_ORDER
+#error Endianess needs to be defined
+#endif
+#endif /* _ASTERISK_ENDIAN_H */
+
diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h
index 4e7ef0343..2edf248a3 100755
--- a/include/asterisk/frame.h
+++ b/include/asterisk/frame.h
@@ -22,45 +22,7 @@ extern "C" {
#include <sys/types.h>
#include <sys/time.h>
-
-#ifdef SOLARIS
-#include "solaris-compat/compat.h"
-#endif
-
-/*
- * Autodetect system endianess
- */
-#ifndef __BYTE_ORDER
-#ifdef __linux__
-#include <endian.h>
-#elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__APPLE__)
-#if defined(__OpenBSD__)
-#include <machine/types.h>
-#endif /* __OpenBSD__ */
-#include <machine/endian.h>
-#define __BYTE_ORDER BYTE_ORDER
-#define __LITTLE_ENDIAN LITTLE_ENDIAN
-#define __BIG_ENDIAN BIG_ENDIAN
-#else
-#ifdef __LITTLE_ENDIAN__
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#endif /* __LITTLE_ENDIAN */
-
-#if defined(i386) || defined(__i386__)
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#endif /* defined i386 */
-
-#if defined(sun) && defined(unix) && defined(sparc)
-#define __BYTE_ORDER __BIG_ENDIAN
-#endif /* sun unix sparc */
-
-#endif /* linux */
-
-#endif /* __BYTE_ORDER */
-
-#ifndef __BYTE_ORDER
-#error Need to know endianess
-#endif /* __BYTE_ORDER */
+#include <asterisk/endian.h>
struct ast_codec_pref {
char order[32];
diff --git a/include/asterisk/unaligned.h b/include/asterisk/unaligned.h
new file mode 100755
index 000000000..fc012049f
--- /dev/null
+++ b/include/asterisk/unaligned.h
@@ -0,0 +1,95 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Asterisk internal frame definitions.
+ *
+ * Copyright (C) 1999 - 2005, Digium, Inc.
+ *
+ * Mark Spencer <markster@digium.com>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU Lesser General Public License. Other components of
+ * Asterisk are distributed under The GNU General Public License
+ * only.
+ */
+
+#ifndef _ASTERISK_UNALIGNED_H
+#define _ASTERISK_UNALIGNED_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#ifdef __GNUC__
+/* If we just tell GCC what's going on, we can trust it to behave optimally */
+static inline unsigned int get_unaligned_uint32(void *p)
+{
+ struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p;
+
+ return pp->d;
+}
+static inline unsigned short get_unaligned_uint16(void *p)
+{
+ struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p;
+
+ return pp->d;
+}
+
+static inline void put_unaligned_uint32(void *p, unsigned int datum)
+{
+ struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p;
+
+ pp->d = datum;
+}
+
+static inline void put_unaligned_uint16(void *p, unsigned short datum)
+{
+ struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p;
+
+ pp->d = datum;
+}
+#elif defined(SOLARIS) && defined(__sparc__)
+static inline unsigned int get_unaligned_uint32(void *p)
+{
+ unsigned char *cp = p;
+
+ return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
+}
+
+static inline unsigned short get_unaligned_uint16(void *p)
+{
+ unsigned char *cp = p;
+
+ return (cp[0] << 8) | cp[1] ;
+}
+
+static inline void put_unaligned_uint32(void *p, unsigned int datum)
+{
+ unsigned char *cp = p;
+
+ cp[0] = datum >> 24;
+ cp[1] = datum >> 16;
+ cp[2] = datum >> 8;
+ cp[3] = datum;
+}
+
+static inline void put_unaligned_uint16(void *p, unsigned int datum)
+{
+ unsigned char *cp = p;
+
+ cp[0] = datum >> 8;
+ cp[1] = datum;
+}
+#else /* Not GCC, not Solaris/SPARC. Assume we can handle direct load/store. */
+#define get_unaligned_uint32(p) (*((unsigned int *)(p)))
+#define get_unaligned_uint16(p) (*((unsigned short *)(p)))
+#define put_unaligned_uint32(p,d) do { unsigned int *__P = (p); *__P = d; } while(0)
+#define put_unaligned_uint16(p,d) do { unsigned short *__P = (p); *__P = d; } while(0)
+#endif
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+
+#endif /* _ASTERISK_UNALIGNED_H */
diff --git a/md5.c b/md5.c
index d39e0fe1a..c60652c00 100755
--- a/md5.c
+++ b/md5.c
@@ -1,22 +1,5 @@
/* MD5 checksum routines used for authentication. Not covered by GPL, but
in the public domain as per the copyright below */
-#if defined( __OpenBSD__ )
-# include <machine/types.h>
-# include <sys/endian.h>
-#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
-# include <sys/types.h>
-# include <sys/endian.h>
-#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
-# include <machine/endian.h>
-#elif defined( __sparc__ ) && defined( SOLARIS )
-# define BIG_ENDIAN 4321
-# define BYTE_ORDER BIG_ENDIAN
-#else
-# include <endian.h>
-#endif
-# if __BYTE_ORDER == __BIG_ENDIAN || BYTE_ORDER == BIG_ENDIAN
-# define HIGHFIRST 1
-# endif
/*
* This code implements the MD5 message-digest algorithm.
@@ -35,8 +18,12 @@
* will fill a supplied 16-byte array with the digest.
*/
#include <string.h> /* for memcpy() */
+#include <asterisk/endian.h>
#include <asterisk/md5.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define HIGHFIRST 1
+# endif
#ifndef HIGHFIRST
#define byteReverse(buf, len) /* Nothing */
#else
diff --git a/rtp.c b/rtp.c
index 80484fc41..d5c6b99bc 100755
--- a/rtp.c
+++ b/rtp.c
@@ -37,6 +37,7 @@
#include <asterisk/lock.h>
#include <asterisk/utils.h>
#include <asterisk/cli.h>
+#include <asterisk/unaligned.h>
#define MAX_TIMESTAMP_SKEW 640
@@ -1173,18 +1174,6 @@ int ast_rtp_sendcng(struct ast_rtp *rtp, int level)
return 0;
}
-#if defined(SOLARIS) && defined(__sparc__)
-static void put_uint32(unsigned char *buf, int i)
-{
- buf[0] = (i>>24) & 0xff;
- buf[1] = (i>>16) & 0xff;
- buf[2] = (i>>8) & 0xff;
- buf[3] = i & 0xff;
-}
-#else
-#define put_uint32(p,v) ((*((unsigned int *)(p))) = (v))
-#endif
-
static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec)
{
unsigned char *rtpheader;
@@ -1270,9 +1259,9 @@ static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec
/* Get a pointer to the header */
rtpheader = (unsigned char *)(f->data - hdrlen);
- put_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
- put_uint32(rtpheader + 4, htonl(rtp->lastts));
- put_uint32(rtpheader + 8, htonl(rtp->ssrc));
+ put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
+ put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
+ put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) {
res = sendto(rtp->s, (void *)rtpheader, f->datalen + hdrlen, 0, (struct sockaddr *)&rtp->them, sizeof(rtp->them));