From f6764f4722191ac669ca8c867679727179a7b32f Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Sun, 27 Apr 2003 21:34:27 +0000
Subject: [PATCH] More contributed BSD enhancements

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@919 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_agi.c                 |  6 +++---
 apps/app_disa.c                |  4 ++--
 apps/app_qcall.c               |  2 +-
 apps/app_voicemail.c           | 10 +++++-----
 channels/alaw.h                |  4 ++--
 channels/chan_iax.c            | 12 ++++++------
 channels/chan_iax2.c           | 10 +++++-----
 channels/chan_mgcp.c           |  6 +++---
 channels/chan_modem.c          |  2 +-
 channels/chan_modem_aopen.c    |  4 ++--
 channels/chan_modem_bestdata.c |  4 ++--
 channels/chan_modem_i4l.c      |  4 ++--
 channels/chan_oss.c            |  4 ++--
 channels/chan_sip.c            | 12 ++++++------
 include/asterisk/channel.h     | 11 +++++++++++
 include/asterisk/lock.h        | 15 +++++++++++++--
 indications.c                  |  2 +-
 res/res_indications.c          |  4 ++--
 res/res_parking.c              |  2 +-
 19 files changed, 70 insertions(+), 48 deletions(-)

diff --git a/apps/app_agi.c b/apps/app_agi.c
index 7c28daa44d..aa526d5592 100755
--- a/apps/app_agi.c
+++ b/apps/app_agi.c
@@ -914,7 +914,7 @@ static char usage_noop[] =
 " Usage: NOOP\n"
 "    Does nothing.\n";
 
-agi_command commands[] = {
+static agi_command commands[] = {
 	{ { "answer", NULL }, handle_answer, "Asserts answer", usage_answer },
 	{ { "wait", "for", "digit", NULL }, handle_waitfordigit, "Waits for a digit to be pressed", usage_waitfordigit },
 	{ { "send", "text", NULL }, handle_sendtext, "Sends text to channels supporting it", usage_sendtext },
@@ -1343,10 +1343,10 @@ static char dumpagihtml_help[] =
 "Usage: dump agihtml <filename>\n"
 "	Dumps the agi command list in html format to given filename\n";
 
-struct ast_cli_entry showagi = 
+static struct ast_cli_entry showagi = 
 { { "show", "agi", NULL }, handle_showagi, "Show AGI commands or specific help", showagi_help };
 
-struct ast_cli_entry dumpagihtml = 
+static struct ast_cli_entry dumpagihtml = 
 { { "dump", "agihtml", NULL }, handle_dumpagihtml, "Dumps a list of agi command in html format", dumpagihtml_help };
 
 int unload_module(void)
diff --git a/apps/app_disa.c b/apps/app_disa.c
index 9783369367..1377adc736 100755
--- a/apps/app_disa.c
+++ b/apps/app_disa.c
@@ -83,8 +83,8 @@ LOCAL_USER_DECL;
 
 static float loudness=4096.0;
 
-int firstdigittimeout = 20000; /* 20 seconds first digit timeout */
-int digittimeout = 10000; /* 10 seconds subsequent digit timeout */
+static int firstdigittimeout = 20000; /* 20 seconds first digit timeout */
+static int digittimeout = 10000; /* 10 seconds subsequent digit timeout */
 
 static void make_tone_block(unsigned char *data, float f1, float f2, int len, int *x)
 {
diff --git a/apps/app_qcall.c b/apps/app_qcall.c
index a68239abc0..6d89f0d2ba 100755
--- a/apps/app_qcall.c
+++ b/apps/app_qcall.c
@@ -73,7 +73,7 @@
 #include <sys/file.h>
 #include "../astconf.h"
 
-char qdir[255];
+static char qdir[255];
 static  char *tdesc = "Call from Queue";
 static  pthread_t qcall_thread;
 static int debug = 0;
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 52a570cb98..b70ce0ffdf 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -64,11 +64,11 @@
 #define BASELINELEN 72
 #define eol "\r\n"
 
-int iocp;
-int iolen;
-int linelength;
-int ateof;
-unsigned char iobuf[BASEMAXINLINE];
+static int iocp;
+static int iolen;
+static int linelength;
+static int ateof;
+static unsigned char iobuf[BASEMAXINLINE];
 
 static char *tdesc = "Comedian Mail (Voicemail System)";
 
diff --git a/channels/alaw.h b/channels/alaw.h
index 3148a9d67b..1423e495c7 100755
--- a/channels/alaw.h
+++ b/channels/alaw.h
@@ -23,7 +23,7 @@
 
 // table to convert unsigned a-law bytes to signed linear integers
 
-const int alaw2int[256] = {
+static const int alaw2int[256] = {
   -5504,5504,-344,344,-22016,22016,-1376,1376,-2752,2752,-88,88,-11008,11008,
   -688,688,-7552,7552,-472,472,-30208,30208,-1888,1888,-3776,3776,-216,216,
   -15104,15104,-944,944,-4480,4480,-280,280,-17920,17920,-1120,1120,-2240,2240,
@@ -50,7 +50,7 @@ const int alaw2int[256] = {
 // shift the integer to be 12+1 bit first, then add 4096 to get 
 // the right index 
 
-const unsigned char int2alaw[8192] = {
+static const unsigned char int2alaw[8192] = {
   84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
   84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
   84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,
diff --git a/channels/chan_iax.c b/channels/chan_iax.c
index fda8698796..fe580353de 100755
--- a/channels/chan_iax.c
+++ b/channels/chan_iax.c
@@ -93,7 +93,7 @@ static int expirey = AST_DEFAULT_REG_EXPIRE;
 static int usecnt;
 static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
 
-int (*regfunk)(char *username, int onoff) = NULL;
+int (*iax_regfunk)(char *username, int onoff) = NULL;
 
 /* Ethernet, etc */
 #define IAX_CAPABILITY_FULLBANDWIDTH 	0xFFFF
@@ -218,7 +218,7 @@ struct iax_registry {
 	struct iax_registry *next;
 };
 
-struct iax_registry *registrations;
+static struct iax_registry *registrations;
 
 /* Don't retry more frequently than every 10 ms, or less frequently than every 5 seconds */
 #define MIN_RETRY_TIME	10
@@ -426,10 +426,10 @@ static struct iax_dpcache {
 	struct iax_dpcache *peer;	/* For linking in peers */
 } *dpcache;
 
-pthread_mutex_t dpcache_lock;
+static pthread_mutex_t dpcache_lock;
 
 #ifdef DEBUG_SUPPORT
-void showframe(struct ast_iax_frame *f, struct ast_iax_full_hdr *fhi, int rx, struct sockaddr_in *sin)
+static void showframe(struct ast_iax_frame *f, struct ast_iax_full_hdr *fhi, int rx, struct sockaddr_in *sin)
 {
 	char *frames[] = {
 		"(0?)",
@@ -4501,7 +4501,7 @@ static struct iax_user *build_user(char *name, struct ast_variable *v)
 }
 
 
-void delete_users(void){
+static void delete_users(void){
 	struct iax_user *user, *userlast;
 	struct iax_peer *peer;
 	struct iax_registry *reg, *regl;
@@ -4535,7 +4535,7 @@ void delete_users(void){
 	ast_pthread_mutex_unlock(&peerl.lock);
 }
 
-void prune_peers(void){
+static void prune_peers(void){
 	/* Prune peers who still are supposed to be deleted */
 	struct iax_peer *peer, *peerlast, *peernext;
 	int x;
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 2a547926f5..2446c9ab66 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -109,7 +109,7 @@ static int timingfd = -1;				/* Timing file descriptor */
 static int usecnt;
 static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
 
-int (*regfunk)(char *username, int onoff) = NULL;
+int (*iax2_regfunk)(char *username, int onoff) = NULL;
 
 /* Ethernet, etc */
 #define IAX_CAPABILITY_FULLBANDWIDTH 	0xFFFF
@@ -244,7 +244,7 @@ struct iax2_registry {
 	struct iax2_registry *next;
 };
 
-struct iax2_registry *registrations;
+static struct iax2_registry *registrations;
 
 /* Don't retry more frequently than every 10 ms, or less frequently than every 5 seconds */
 #define MIN_RETRY_TIME	10
@@ -429,7 +429,7 @@ static struct iax2_dpcache {
 	struct iax2_dpcache *peer;	/* For linking in peers */
 } *dpcache;
 
-pthread_mutex_t dpcache_lock;
+static pthread_mutex_t dpcache_lock;
 
 static void iax_debug_output(const char *data)
 {
@@ -4808,7 +4808,7 @@ static struct iax2_user *build_user(char *name, struct ast_variable *v)
 }
 
 
-void delete_users(void){
+static void delete_users(void){
 	struct iax2_user *user, *userlast;
 	struct iax2_peer *peer;
 	struct iax2_registry *reg, *regl;
@@ -4842,7 +4842,7 @@ void delete_users(void){
 	ast_pthread_mutex_unlock(&peerl.lock);
 }
 
-void prune_peers(void){
+static void prune_peers(void){
 	/* Prune peers who still are supposed to be deleted */
 	struct iax2_peer *peer, *peerlast, *peernext;
 	int x;
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index 0975072b5c..43afb52401 100755
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -155,7 +155,7 @@ struct mgcp_endpoint {
 	struct mgcp_gateway *parent;
 };
 
-struct mgcp_gateway {
+static struct mgcp_gateway {
 	/* A gateway containing one or more endpoints */
 	char name[80];
 	struct sockaddr_in addr;
@@ -293,7 +293,7 @@ struct my_ifreq {
       } ifr_ifru;
 };
 
-struct in_addr *lookup_iface(char *iface) {
+static struct in_addr *lookup_iface(char *iface) {
 	int mysock;
 	int res;
 	static struct  my_ifreq ifreq;
@@ -1694,7 +1694,7 @@ static struct ast_channel *mgcp_request(char *type, int format, void *data)
 	return tmpc;
 }
 
-struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
+static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v)
 {
 	struct mgcp_gateway *gw;
 	struct mgcp_endpoint *e;
diff --git a/channels/chan_modem.c b/channels/chan_modem.c
index 90ac7c3ae1..900eb0ad58 100755
--- a/channels/chan_modem.c
+++ b/channels/chan_modem.c
@@ -808,7 +808,7 @@ static unsigned int get_group(char *s)
 	char *piece;
 	int start, finish,x;
 	unsigned int group = 0;
-	char *copy = strdupa(s);
+	char *copy = ast_strdupa(s);
 	char *stringp=NULL;
 	if (!copy) {
 		ast_log(LOG_ERROR, "Out of memory\n");
diff --git a/channels/chan_modem_aopen.c b/channels/chan_modem_aopen.c
index a8f6adb06a..3aa1978afc 100755
--- a/channels/chan_modem_aopen.c
+++ b/channels/chan_modem_aopen.c
@@ -33,8 +33,8 @@ static char *breakcmd = "\0x10\0x03";
 
 static char *desc = "A/Open (Rockwell Chipset) ITU-2 VoiceModem Driver";
 
-int usecnt;
-pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+static int usecnt;
+static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
 
 static char *aopen_idents[] = {
 	/* Identify A/Open Modem */
diff --git a/channels/chan_modem_bestdata.c b/channels/chan_modem_bestdata.c
index 3faad53e8e..90cc87828c 100755
--- a/channels/chan_modem_bestdata.c
+++ b/channels/chan_modem_bestdata.c
@@ -38,8 +38,8 @@ static char *breakcmd = "\020!";
 
 static char *desc = "BestData (Conexant V.90 Chipset) VoiceModem Driver";
 
-int usecnt;
-pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+static int usecnt;
+static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
 
 static char *bestdata_idents[] = {
 	/* Identify BestData Modem */
diff --git a/channels/chan_modem_i4l.c b/channels/chan_modem_i4l.c
index 277c16b860..8571882772 100755
--- a/channels/chan_modem_i4l.c
+++ b/channels/chan_modem_i4l.c
@@ -33,8 +33,8 @@ static char *breakcmd = "\0x10\0x14\0x10\0x3";
 
 static char *desc = "ISDN4Linux Emulated Modem Driver";
 
-int usecnt;
-pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
+static int usecnt;
+static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
 
 static char *i4l_idents[] = {
 	/* Identify ISDN4Linux Driver */
diff --git a/channels/chan_oss.c b/channels/chan_oss.c
index 7199d33b93..376f5e0594 100755
--- a/channels/chan_oss.c
+++ b/channels/chan_oss.c
@@ -75,7 +75,7 @@ static char context[AST_MAX_EXTENSION] = "default";
 static char language[MAX_LANGUAGE] = "";
 static char exten[AST_MAX_EXTENSION] = "s";
 
-int hookstate=0;
+static int hookstate=0;
 
 static short silence[FRAME_SIZE] = {0, };
 
@@ -123,7 +123,7 @@ static int time_has_passed(void)
    with 160 sample frames, and a buffer size of 3, we have a 60ms buffer, 
    usually plenty. */
 
-pthread_t sthread;
+static pthread_t sthread;
 
 #define MAX_BUFFER_SIZE 100
 static int buffersize = 3;
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 8458f3a816..2488bd543c 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -343,7 +343,7 @@ struct sip_registry {
 #define REINVITE_UPDATE		2
 
 static int sip_do_register(struct sip_registry *r);
-struct sip_registry *registrations;
+static struct sip_registry *registrations;
 
 static int sipsock  = -1;
 static int globalnat = 0;
@@ -361,7 +361,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp);
 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
 static int transmit_message_with_text(struct sip_pvt *p, char *text);
 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req);
-char *getsipuri(char *header);
+static char *getsipuri(char *header);
 static void free_old_route(struct sip_route *route);
 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
 
@@ -848,7 +848,7 @@ struct my_ifreq {
 	struct sockaddr_in ifru_addr;
 };
 
-struct in_addr *lookup_iface(char *iface) {
+static struct in_addr *lookup_iface(char *iface) {
 	int mysock;
 	int res;
 	static struct  my_ifreq ifreq;
@@ -5350,7 +5350,7 @@ int load_module()
 	return res;
 }
 
-void delete_users(void)
+static void delete_users(void)
 {
 	struct sip_user *user, *userlast;
 	struct sip_peer *peer;
@@ -5384,7 +5384,7 @@ void delete_users(void)
 	ast_pthread_mutex_unlock(&peerl.lock);
 }
 
-void prune_peers(void)
+static void prune_peers(void)
 {
 	/* Prune peers who still are supposed to be deleted */
 	struct sip_peer *peer, *peerlast, *peernext;
@@ -5502,7 +5502,7 @@ char *description()
 	return desc;
 }
 
-char *getsipuri(char *header)
+static char *getsipuri(char *header)
 {
 	char *c, *d, *retval;
 	int n;
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index befc13bc5b..c67dd58c4c 100755
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -708,6 +708,17 @@ static inline int ast_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds,
 #endif
 }
 
+#if !defined(ast_strdupa) && defined(__GNUC__)
+# define ast_strdupa(s)									\
+  (__extension__										\
+    ({													\
+      __const char *__old = (s);						\
+      size_t __len = strlen (__old) + 1;				\
+      char *__new = (char *) __builtin_alloca (__len);	\
+      (char *) memcpy (__new, __old, __len);			\
+    }))
+#endif
+
 #ifdef DO_CRASH
 #define CRASH do { fprintf(stderr, "!! Forcing immediate crash a-la abort !!\n"); *((int *)0) = 0; } while(0)
 #else
diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h
index bde1e6adaa..d27e295b49 100755
--- a/include/asterisk/lock.h
+++ b/include/asterisk/lock.h
@@ -29,10 +29,17 @@
 // #define AST_MUTEX_KIND             PTHREAD_MUTEX_RECURSIVE_NP
 #ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
 #define AST_MUTEX_INITIALIZER         PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+#else
+#ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#define AST_MUTEX_INITIALIZER         PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#else
+#define AST_MUTEX_INITIALIZER         PTHREAD_MUTEX_INITIALIZER
+#endif
+#endif
+#ifdef PTHREAD_MUTEX_ERRORCHECK_NP
 #define AST_MUTEX_KIND                PTHREAD_MUTEX_ERRORCHECK_NP
 #else
-#define AST_MUTEX_INITIALIZER      PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
-#define AST_MUTEX_KIND             PTHREAD_MUTEX_RECURSIVE_NP
+#define AST_MUTEX_KIND                PTHREAD_MUTEX_ERRORCHECK
 #endif
 
 struct mutex_info {
@@ -96,7 +103,11 @@ static inline int __ast_pthread_mutex_unlock(char *filename, int lineno, char *f
 #else
 
 #define AST_MUTEX_INITIALIZER      PTHREAD_MUTEX_INITIALIZER
+#ifdef PTHREAD_MUTEX_FAST_NP
 #define AST_MUTEX_KIND             PTHREAD_MUTEX_FAST_NP
+#else
+#define AST_MUTEX_KIND             PTHREAD_NORMAL
+#endif
 
 #define ast_pthread_mutex_init(mutex) pthread_mutex_init(mutex, NULL)
 #define ast_pthread_mutex_lock pthread_mutex_lock
diff --git a/indications.c b/indications.c
index 1ef2357adc..ccfd04e82b 100755
--- a/indications.c
+++ b/indications.c
@@ -140,7 +140,7 @@ static struct ast_generator playtones = {
 
 int ast_playtones_start(struct ast_channel *chan, int vol, const char *playlst, int interruptible)
 {
-	char *s, *data = strdupa(playlst); /* cute */
+	char *s, *data = ast_strdupa(playlst); /* cute */
 	struct playtones_def d = { vol, -1, 0, 1, NULL};
 	char *stringp=NULL;
 	if (!data)
diff --git a/res/res_indications.c b/res/res_indications.c
index 3ed4c088d6..5f039f6c7a 100755
--- a/res/res_indications.c
+++ b/res/res_indications.c
@@ -248,7 +248,7 @@ static int ind_load_module(void)
 			if (!strcasecmp(v->name, "description")) {
 				strncpy(tones->description, v->value, sizeof(tones->description)-1);
 			} else if (!strcasecmp(v->name,"ringcadance")) {
-				char *ring,*rings = strdupa(v->value);
+				char *ring,*rings = ast_strdupa(v->value);
 				c = rings;
 				ring = strsep(&c,",");
 				while (ring) {
@@ -270,7 +270,7 @@ static int ind_load_module(void)
 					ring = strsep(&c,",");
 				}
 			} else if (!strcasecmp(v->name,"alias")) {
-				char *countries = strdupa(v->value);
+				char *countries = ast_strdupa(v->value);
 				c = countries;
 				country = strsep(&c,",");
 				while (country) {
diff --git a/res/res_parking.c b/res/res_parking.c
index 4ffbc5166b..63dc192309 100755
--- a/res/res_parking.c
+++ b/res/res_parking.c
@@ -611,7 +611,7 @@ unsigned int ast_get_group(char *s)
 	char *c=NULL;
 	int start=0, finish=0,x;
 	unsigned int group = 0;
-	copy = strdupa(s);
+	copy = ast_strdupa(s);
 	if (!copy) {
 		ast_log(LOG_ERROR, "Out of memory\n");
 		return 0;
-- 
GitLab