diff options
-rw-r--r-- | apps/app_mp3.c | 2 | ||||
-rw-r--r-- | apps/app_nbscat.c | 2 | ||||
-rw-r--r-- | channels/chan_alsa.c | 1 | ||||
-rw-r--r-- | channels/chan_skinny.c | 2 | ||||
-rwxr-xr-x | configure | 151 | ||||
-rw-r--r-- | configure.ac | 7 | ||||
-rw-r--r-- | include/asterisk/autoconfig.h.in | 3 | ||||
-rw-r--r-- | include/asterisk/channel.h | 5 | ||||
-rw-r--r-- | include/asterisk/io.h | 4 | ||||
-rw-r--r-- | include/asterisk/poll-compat.h | 30 | ||||
-rw-r--r-- | main/Makefile | 12 | ||||
-rw-r--r-- | main/asterisk.c | 11 | ||||
-rw-r--r-- | main/channel.c | 4 | ||||
-rw-r--r-- | main/io.c | 2 | ||||
-rw-r--r-- | main/manager.c | 4 | ||||
-rw-r--r-- | main/poll.c | 23 | ||||
-rw-r--r-- | main/utils.c | 4 | ||||
-rw-r--r-- | res/res_agi.c | 4 |
18 files changed, 208 insertions, 63 deletions
diff --git a/apps/app_mp3.c b/apps/app_mp3.c index 7cacc1e77..1f550a1dd 100644 --- a/apps/app_mp3.c +++ b/apps/app_mp3.c @@ -131,7 +131,7 @@ static int timed_read(int fd, void *data, int datalen, int timeout) struct pollfd fds[1]; fds[0].fd = fd; fds[0].events = POLLIN; - res = poll(fds, 1, timeout); + res = ast_poll(fds, 1, timeout); if (res < 1) { ast_log(LOG_NOTICE, "Poll timed out/errored out with %d\n", res); return -1; diff --git a/apps/app_nbscat.c b/apps/app_nbscat.c index d9a2dd402..841d8a375 100644 --- a/apps/app_nbscat.c +++ b/apps/app_nbscat.c @@ -123,7 +123,7 @@ static int timed_read(int fd, void *data, int datalen) struct pollfd fds[1]; fds[0].fd = fd; fds[0].events = POLLIN; - res = poll(fds, 1, 2000); + res = ast_poll(fds, 1, 2000); if (res < 1) { ast_log(LOG_NOTICE, "Selected timed out/errored out with %d\n", res); return -1; diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index 03db26b6a..3a9a47208 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -62,6 +62,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/stringfields.h" #include "asterisk/abstract_jb.h" #include "asterisk/musiconhold.h" +#include "asterisk/poll-compat.h" #include "busy_tone.h" #include "ring_tone.h" diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 657163398..983dbf847 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -4441,7 +4441,7 @@ static int get_input(struct skinnysession *s) fds[0].fd = s->fd; fds[0].events = POLLIN; fds[0].revents = 0; - res = poll(fds, 1, (keep_alive * 1100)); /* If nothing has happen, client is dead */ + res = ast_poll(fds, 1, (keep_alive * 1100)); /* If nothing has happen, client is dead */ /* we add 10% to the keep_alive to deal */ /* with network delays, etc */ if (res < 0) { @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac Revision: 180941 . +# From configure.ac Revision: 182213 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for asterisk 1.4. # @@ -3961,6 +3961,13 @@ case "${host_os}" in CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ;; + darwin*) + +cat >>confdefs.h <<\_ACEOF +#define AST_POLL_COMPAT 1 +_ACEOF + + ;; *) ac_default_prefix=/usr if test ${prefix} = '/usr' || test ${prefix} = 'NONE'; then @@ -9918,6 +9925,148 @@ fi done +if test "${ac_cv_header_sys_poll_h+set}" = set; then + { echo "$as_me:$LINENO: checking for sys/poll.h" >&5 +echo $ECHO_N "checking for sys/poll.h... $ECHO_C" >&6; } +if test "${ac_cv_header_sys_poll_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_poll_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_poll_h" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking sys/poll.h usability" >&5 +echo $ECHO_N "checking sys/poll.h usability... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <sys/poll.h> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking sys/poll.h presence" >&5 +echo $ECHO_N "checking sys/poll.h presence... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <sys/poll.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: sys/poll.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: sys/poll.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/poll.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: sys/poll.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: sys/poll.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: sys/poll.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/poll.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: sys/poll.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/poll.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: sys/poll.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/poll.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: sys/poll.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/poll.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: sys/poll.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/poll.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: sys/poll.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------- ## +## Report this to www.asterisk.org ## +## ------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for sys/poll.h" >&5 +echo $ECHO_N "checking for sys/poll.h... $ECHO_C" >&6; } +if test "${ac_cv_header_sys_poll_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_sys_poll_h=$ac_header_preproc +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_poll_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_poll_h" >&6; } + +fi +if test $ac_cv_header_sys_poll_h = yes; then + : +else + +cat >>confdefs.h <<\_ACEOF +#define AST_POLL_COMPAT 1 +_ACEOF + +fi + + + # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then enableval=$enable_largefile; diff --git a/configure.ac b/configure.ac index 8282f9f5f..f072359cc 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,9 @@ case "${host_os}" in CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ;; + darwin*) + AC_DEFINE([AST_POLL_COMPAT], 1, [Define to 1 if internal poll should be used.]) + ;; *) ac_default_prefix=/usr if test ${prefix} = '/usr' || test ${prefix} = 'NONE'; then @@ -226,6 +229,10 @@ AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h libintl.h limits.h locale.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h strings.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h termios.h unistd.h utime.h arpa/nameser.h sys/io.h]) +AC_CHECK_HEADER([sys/poll.h], + [], + AC_DEFINE([AST_POLL_COMPAT], 1, [Define to 1 if internal poll should be used.])) + AC_SYS_LARGEFILE # Checks for typedefs, structures, and compiler characteristics. diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index b05c0ff32..1c44abb3b 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -7,6 +7,9 @@ +/* Define to 1 if internal poll should be used. */ +#undef AST_POLL_COMPAT + /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index f7718684b..29713b8ca 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -90,11 +90,8 @@ #include "asterisk/abstract_jb.h" #include <unistd.h> -#ifdef POLLCOMPAT + #include "asterisk/poll-compat.h" -#else -#include <sys/poll.h> -#endif #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/include/asterisk/io.h b/include/asterisk/io.h index 66ebceea0..d0e337204 100644 --- a/include/asterisk/io.h +++ b/include/asterisk/io.h @@ -23,11 +23,7 @@ #ifndef _ASTERISK_IO_H #define _ASTERISK_IO_H -#ifdef POLLCOMPAT #include "asterisk/poll-compat.h" -#else -#include <sys/poll.h> /* For POLL* constants */ -#endif #if defined(__cplusplus) || defined(c_plusplus) extern "C" { diff --git a/include/asterisk/poll-compat.h b/include/asterisk/poll-compat.h index 5f795a894..1156e694b 100644 --- a/include/asterisk/poll-compat.h +++ b/include/asterisk/poll-compat.h @@ -76,8 +76,16 @@ original. \*---------------------------------------------------------------------------*/ -#ifndef _POLL_EMUL_H_ -#define _POLL_EMUL_H_ +#ifndef __AST_POLL_COMPAT_H +#define __AST_POLL_COMPAT_H + +#ifndef AST_POLL_COMPAT + +#include <sys/poll.h> + +#define ast_poll(a, b, c) poll(a, b, c) + +#else /* AST_POLL_COMPAT */ #define POLLIN 0x01 #define POLLPRI 0x02 @@ -86,26 +94,24 @@ #define POLLHUP 0x10 #define POLLNVAL 0x20 -struct pollfd -{ +struct pollfd { int fd; short events; short revents; }; #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -#if (__STDC__ > 0) || defined(__cplusplus) -extern int poll (struct pollfd *pArray, unsigned long n_fds, int timeout); -#else -extern int poll(); -#endif +#define ast_poll(a, b, c) ast_internal_poll(a, b, c) + +int ast_internal_poll(struct pollfd *pArray, unsigned long n_fds, int timeout); #ifdef __cplusplus } #endif -#endif /* _POLL_EMUL_H_ */ +#endif /* AST_POLL_COMPAT */ + +#endif /* __AST_POLL_COMPAT_H */ diff --git a/main/Makefile b/main/Makefile index 0b83191e0..38d49f34c 100644 --- a/main/Makefile +++ b/main/Makefile @@ -27,7 +27,7 @@ OBJS= io.o sched.o logger.o frame.o loader.o config.o channel.o \ netsock.o slinfactory.o ast_expr2.o ast_expr2f.o \ cryptostub.o sha1.o http.o fixedjitterbuf.o abstract_jb.o \ strcompat.o threadstorage.o dial.o astobj2.o global_datastores.o \ - audiohook.o + audiohook.o poll.o # we need to link in the objects statically, not as a library, because # otherwise modules will not have them available if none of the static @@ -38,16 +38,6 @@ OBJS+=stdtime/localtime.o # by a module. OBJS+=say.o -ifneq ($(findstring darwin,$(OSARCH)),) - OBJS+=poll.o - ASTCFLAGS+=-DPOLLCOMPAT -else - ifeq ($(wildcard /usr/include/sys/poll.h),) - OBJS+=poll.o - ASTCFLAGS+=-DPOLLCOMPAT - endif -endif - ifneq ($(findstring $(OSARCH), linux-gnu uclinux linux-uclibc linux-gnueabi ),) ifneq ($(findstring LOADABLE_MODULES,$(MENUSELECT_CFLAGS)),) AST_LIBS+=-ldl diff --git a/main/asterisk.c b/main/asterisk.c index 9d4c92cb0..2cabfc272 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -123,6 +123,7 @@ int daemon(int, int); /* defined in libresolv of all places */ #include "asterisk/linkedlists.h" #include "asterisk/devicestate.h" #include "asterisk/module.h" +#include "asterisk/poll-compat.h" #include "asterisk/doxyref.h" /* Doxygen documentation */ @@ -955,7 +956,7 @@ static void *netconsole(void *vconsole) fds[1].events = POLLIN; fds[1].revents = 0; - res = poll(fds, 2, -1); + res = ast_poll(fds, 2, -1); if (res < 0) { if (errno != EINTR) ast_log(LOG_WARNING, "poll returned < 0: %s\n", strerror(errno)); @@ -1006,7 +1007,7 @@ static void *listener(void *unused) return NULL; fds[0].fd = ast_socket; fds[0].events = POLLIN; - s = poll(fds, 1, -1); + s = ast_poll(fds, 1, -1); pthread_testcancel(); if (s < 0) { if (errno != EINTR) @@ -1784,7 +1785,7 @@ static int ast_el_read_char(EditLine *el, char *cp) fds[1].events = POLLIN; max++; } - res = poll(fds, max, -1); + res = ast_poll(fds, max, -1); if (res < 0) { if (sig_flags.need_quit) break; @@ -2379,7 +2380,7 @@ static void ast_remotecontrol(char *data) fds.fd = ast_consock; fds.events = POLLIN; fds.revents = 0; - while (poll(&fds, 1, 500) > 0) { + while (ast_poll(&fds, 1, 500) > 0) { char buf[512] = "", *curline = buf, *nextline; int not_written = 1; @@ -2668,7 +2669,7 @@ static void *monitor_sig_flags(void *unused) for (;;) { struct pollfd p = { sig_alert_pipe[0], POLLIN, 0 }; int a; - poll(&p, 1, -1); + ast_poll(&p, 1, -1); if (sig_flags.need_reload) { sig_flags.need_reload = 0; ast_module_reload(NULL); diff --git a/main/channel.c b/main/channel.c index 475942163..5d3eb9b35 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1754,12 +1754,12 @@ struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int kbrms = rms; if (kbrms > 600000) kbrms = 600000; - res = poll(pfds, max, kbrms); + res = ast_poll(pfds, max, kbrms); if (!res) rms -= kbrms; } while (!res && (rms > 0)); } else { - res = poll(pfds, max, rms); + res = ast_poll(pfds, max, rms); } for (x=0; x<n; x++) ast_clear_flag(c[x], AST_FLAG_BLOCKING); @@ -263,7 +263,7 @@ int ast_io_wait(struct io_context *ioc, int howlong) int x; int origcnt; DEBUG(ast_log(LOG_DEBUG, "ast_io_wait()\n")); - res = poll(ioc->fds, ioc->fdcnt, howlong); + res = ast_poll(ioc->fds, ioc->fdcnt, howlong); if (res > 0) { /* * At least one event diff --git a/main/manager.c b/main/manager.c index 8b795a86f..e88af7f98 100644 --- a/main/manager.c +++ b/main/manager.c @@ -2287,7 +2287,7 @@ static int get_input(struct mansession *s, char *output) s->waiting_thread = pthread_self(); ast_mutex_unlock(&s->__lock); - res = poll(fds, 1, -1); + res = ast_poll(fds, 1, -1); ast_mutex_lock(&s->__lock); s->waiting_thread = AST_PTHREADT_NULL; @@ -2431,7 +2431,7 @@ static void *accept_thread(void *ignore) pfds[0].events = POLLIN; /* Wait for something to happen, but timeout every few seconds so we can ditch any old manager sessions */ - if (poll(pfds, 1, 5000) < 1) + if (ast_poll(pfds, 1, 5000) < 1) continue; as = accept(asock, (struct sockaddr *)&sin, &sinlen); if (as < 0) { diff --git a/main/poll.c b/main/poll.c index c053ba015..aba6e593e 100644 --- a/main/poll.c +++ b/main/poll.c @@ -71,6 +71,8 @@ Includes \*---------------------------------------------------------------------------*/ +#include "asterisk.h" + #include <unistd.h> /* standard Unix definitions */ #include <sys/types.h> /* system types */ #include <sys/time.h> /* time definitions */ @@ -79,6 +81,8 @@ #include "asterisk/poll-compat.h" /* this package */ +#ifdef AST_POLL_COMPAT + /*---------------------------------------------------------------------------*\ Macros \*---------------------------------------------------------------------------*/ @@ -87,7 +91,6 @@ #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif - /*---------------------------------------------------------------------------*\ Private Functions \*---------------------------------------------------------------------------*/ @@ -209,7 +212,7 @@ static struct timeval *map_timeout return pResult; } - + static void map_select_results #if __STDC__ > 0 (struct pollfd *pArray, @@ -251,22 +254,12 @@ static void map_select_results return; } - + /*---------------------------------------------------------------------------*\ Public Functions \*---------------------------------------------------------------------------*/ -int poll - -#if __STDC__ > 0 - (struct pollfd *pArray, unsigned long n_fds, int timeout) -#else - (pArray, n_fds, timeout) - struct pollfd *pArray; - unsigned long n_fds; - int timeout; -#endif - +int ast_internal_poll(struct pollfd *pArray, unsigned long n_fds, int timeout) { fd_set read_descs; /* input file descs */ fd_set write_descs; /* output file descs */ @@ -304,3 +297,5 @@ int poll return ready_descriptors; } + +#endif /* AST_POLL_COMPAT */ diff --git a/main/utils.c b/main/utils.c index 0b96d8b88..6ff44dd48 100644 --- a/main/utils.c +++ b/main/utils.c @@ -916,7 +916,7 @@ int ast_wait_for_input(int fd, int ms) memset(pfd, 0, sizeof(pfd)); pfd[0].fd = fd; pfd[0].events = POLLIN|POLLPRI; - return poll(pfd, 1, ms); + return ast_poll(pfd, 1, ms); } int ast_carefulwrite(int fd, char *s, int len, int timeoutms) @@ -932,7 +932,7 @@ int ast_carefulwrite(int fd, char *s, int len, int timeoutms) }; /* poll() until the fd is writable without blocking */ - while ((res = poll(&pfd, 1, timeoutms - elapsed)) <= 0) { + while ((res = ast_poll(&pfd, 1, timeoutms - elapsed)) <= 0) { if (res == 0) { /* timed out. */ ast_log(LOG_NOTICE, "Timed out trying to write\n"); diff --git a/res/res_agi.c b/res/res_agi.c index 35b29d52f..15ecaa516 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -221,7 +221,7 @@ static enum agi_result launch_netscript(char *agiurl, char *argv[], int *fds, in pfds[0].fd = s; pfds[0].events = POLLOUT; - while ((res = poll(pfds, 1, MAX_AGI_CONNECT)) != 1) { + while ((res = ast_poll(pfds, 1, MAX_AGI_CONNECT)) != 1) { if (errno != EINTR) { if (!res) { ast_log(LOG_WARNING, "FastAGI connection to '%s' timed out after MAX_AGI_CONNECT (%d) milliseconds.\n", @@ -2269,7 +2269,7 @@ static void *shaun_of_the_dead(void *data) } pthread_testcancel(); /* Wait for 60 seconds, without engaging in a busy loop. */ - poll(NULL, 0, 60000); + ast_poll(NULL, 0, 60000); } return NULL; } |