Simplify endianness and fix for unaligned reads (bug #3867)
authorMark Spencer <markster@digium.com>
Tue, 29 Mar 2005 04:49:24 +0000 (04:49 +0000)
committerMark Spencer <markster@digium.com>
Tue, 29 Mar 2005 04:49:24 +0000 (04:49 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5295 65c4cc65-6c06-0410-ace0-fbb531ad65f3

22 files changed:
aesopt.h
channels/chan_alsa.c
channels/chan_oss.c
channels/iax2-parser.c
dns.c
formats/format_g726.c
formats/format_g729.c
formats/format_gsm.c
formats/format_h263.c
formats/format_ilbc.c
formats/format_jpeg.c
formats/format_pcm.c
formats/format_pcm_alaw.c
formats/format_sln.c
formats/format_vox.c
formats/format_wav.c
formats/format_wav_gsm.c
include/asterisk/endian.h [new file with mode: 0755]
include/asterisk/frame.h
include/asterisk/unaligned.h [new file with mode: 0755]
md5.c
rtp.c

index f476de0..85ad466 100755 (executable)
--- a/aesopt.h
+++ b/aesopt.h
 #define _AESOPT_H
 
 #include <asterisk/aes.h>
+#include <asterisk/endian.h>
 
 /*  CONFIGURATION - USE OF DEFINES
 
     #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
index 9811cb8..fb2b93b 100755 (executable)
@@ -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
index 480408e..6a580d4 100755 (executable)
@@ -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>
 #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__)
index 66a69b4..3472b50 100755 (executable)
@@ -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 359fd9e..807d2c2 100755 (executable)
--- a/dns.c
+++ b/dns.c
 #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 */
index d549823..0371a75 100755 (executable)
@@ -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>
 #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
index 5e79c00..46fd095 100755 (executable)
@@ -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>
 #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 */
 
index 8c3f2d5..c4a63aa 100755 (executable)
@@ -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>
 #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 */
index 17805b2..a676cf8 100755 (executable)
@@ -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>
 #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 */
 
index 571e74d..c340994 100755 (executable)
@@ -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>
 #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 */
 
index b084030..d750e56 100755 (executable)
@@ -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>
 #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";
index 14edd0b..79f5f22 100755 (executable)
@@ -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>
 #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 */
 
index b677bb6..b5f27be 100755 (executable)
@@ -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>
 #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 */
 
index d1826a3..4c0b1bc 100755 (executable)
@@ -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>
 #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 */
 
index 7601994..3413a4a 100755 (executable)
@@ -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>
 #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 */
 
index c0781f6..66b82d4 100755 (executable)
@@ -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>
 #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 */
 
index b1a0c1c..fcd4c2a 100755 (executable)
@@ -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>
 #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 (executable)
index 0000000..66f7962
--- /dev/null
@@ -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 */
+
index 4e7ef03..2edf248 100755 (executable)
@@ -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 (executable)
index 0000000..fc01204
--- /dev/null
@@ -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 d39e0fe..c60652c 100755 (executable)
--- 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.
  * 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 80484fc..d5c6b99 100755 (executable)
--- 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));