[asterisk-commits] tilghman: branch 1.6.2 r284593 - in /branches/1.6.2: ./ channels/ include/ast...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Sep 1 17:59:56 CDT 2010


Author: tilghman
Date: Wed Sep  1 17:59:50 2010
New Revision: 284593

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=284593
Log:
Merged revisions 284478 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r284478 | tilghman | 2010-09-01 13:49:11 -0500 (Wed, 01 Sep 2010) | 11 lines
  
  Ensure that all areas that previously used select(2) now use poll(2), with implementations that need poll(2) implemented with select(2) safe against 1024-bit overflows.
  
  This is a followup to the fix for the pthread timer in 1.6.2 and beyond, fixing
  a potential crash bug in all supported releases.
  
  (closes issue #17678)
   Reported by: russell
  Branch: https://origsvn.digium.com/svn/asterisk/team/tilghman/ast_select 
  
  Review: https://reviewboard.asterisk.org/r/824/
........

Added:
    branches/1.6.2/include/asterisk/select.h
      - copied unchanged from r284478, branches/1.4/include/asterisk/select.h
    branches/1.6.2/tests/test_poll.c
      - copied unchanged from r284478, branches/1.4/tests/test_poll.c
Modified:
    branches/1.6.2/   (props changed)
    branches/1.6.2/channels/chan_misdn.c
    branches/1.6.2/channels/chan_phone.c
    branches/1.6.2/channels/chan_usbradio.c
    branches/1.6.2/channels/console_video.c
    branches/1.6.2/configure.ac
    branches/1.6.2/include/asterisk/channel.h
    branches/1.6.2/include/asterisk/poll-compat.h
    branches/1.6.2/main/asterisk.c
    branches/1.6.2/main/features.c
    branches/1.6.2/main/poll.c
    branches/1.6.2/main/rtp.c
    branches/1.6.2/res/res_ais.c
    branches/1.6.2/res/res_jabber.c
    branches/1.6.2/utils/clicompat.c

Propchange: branches/1.6.2/
------------------------------------------------------------------------------
--- branch-1.4-merged (original)
+++ branch-1.4-merged Wed Sep  1 17:59:50 2010
@@ -1,1 +1,1 @@
-/branches/1.4:1-279056,279206,279945,280088,280341,280448,280811,280982,281390,281566,281762,281819,281911,282129,282430,282729,282893,283048,283123,283380,283690,283880,283960,284316,284393
+/branches/1.4:1-279056,279206,279945,280088,280341,280448,280811,280982,281390,281566,281762,281819,281911,282129,282430,282729,282893,283048,283123,283380,283690,283880,283960,284316,284393,284478

Modified: branches/1.6.2/channels/chan_misdn.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/channels/chan_misdn.c?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/channels/chan_misdn.c (original)
+++ branches/1.6.2/channels/chan_misdn.c Wed Sep  1 17:59:50 2010
@@ -3033,15 +3033,14 @@
 static struct ast_frame *misdn_read(struct ast_channel *ast)
 {
 	struct chan_list *tmp;
-	fd_set rrfs;
-	struct timeval tv = { 0, 20000 };
 	int len, t;
+	struct pollfd pfd = { .fd = -1, .events = POLLIN };
 
 	if (!ast) {
 		chan_misdn_log(1, 0, "misdn_read called without ast\n");
 		return NULL;
 	}
- 	if (!(tmp = MISDN_ASTERISK_TECH_PVT(ast))) {
+	if (!(tmp = MISDN_ASTERISK_TECH_PVT(ast))) {
 		chan_misdn_log(1, 0, "misdn_read called without ast->pvt\n");
 		return NULL;
 	}
@@ -3051,20 +3050,18 @@
 		return NULL;
 	}
 
-	FD_ZERO(&rrfs);
-	FD_SET(tmp->pipe[0], &rrfs);
-
-	if (!(t = select(FD_SETSIZE, &rrfs, NULL, NULL, &tv))) {
-		chan_misdn_log(3, tmp->bc->port, "read Select Timed out\n");
+	pfd.fd = tmp->pipe[0];
+	t = ast_poll(&pfd, 1, 20);
+
+	if (t < 0) {
+		chan_misdn_log(-1, tmp->bc->port, "poll() error (err=%s)\n", strerror(errno));
+		return NULL;
+	}
+
+	if (!t) {
+		chan_misdn_log(3, tmp->bc->port, "poll() timed out\n");
 		len = 160;
-	}
-
-	if (t < 0) {
-		chan_misdn_log(-1, tmp->bc->port, "Select Error (err=%s)\n", strerror(errno));
-		return NULL;
-	}
-
-	if (FD_ISSET(tmp->pipe[0], &rrfs)) {
+	} else if (pfd.revents & POLLIN) {
 		len = read(tmp->pipe[0], tmp->ast_rd_buf, sizeof(tmp->ast_rd_buf));
 
 		if (len <= 0) {
@@ -5172,26 +5169,22 @@
 			if (ch->ast) 
 				ast_queue_frame(ch->ast, &frame);
 		} else {
-			fd_set wrfs;
-			struct timeval tv = { 0, 0 };
+			struct pollfd pfd = { .fd = ch->pipe[1], .events = POLLOUT };
 			int t;
 
-			FD_ZERO(&wrfs);
-			FD_SET(ch->pipe[1], &wrfs);
-
-			t = select(FD_SETSIZE, NULL, &wrfs, NULL, &tv);
+			t = ast_poll(&pfd, 1, 0);
+
+			if (t < 0) {
+				chan_misdn_log(-1, bc->port, "poll() error (err=%s)\n", strerror(errno));
+				break;
+			}
 
 			if (!t) {
-				chan_misdn_log(9, bc->port, "Select Timed out\n");
+				chan_misdn_log(9, bc->port, "poll() timed out\n");
 				break;
 			}
-			
-			if (t < 0) {
-				chan_misdn_log(-1, bc->port, "Select Error (err=%s)\n", strerror(errno));
-				break;
-			}
-			
-			if (FD_ISSET(ch->pipe[1], &wrfs)) {
+
+			if (pfd.revents & POLLOUT) {
 				chan_misdn_log(9, bc->port, "writing %d bytes to asterisk\n", bc->bframe_len);
 				if (write(ch->pipe[1], bc->bframe, bc->bframe_len) <= 0) {
 					chan_misdn_log(0, bc->port, "Write returned <=0 (err=%s) --> hanging up channel\n", strerror(errno));

Modified: branches/1.6.2/channels/chan_phone.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/channels/chan_phone.c?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/channels/chan_phone.c (original)
+++ branches/1.6.2/channels/chan_phone.c Wed Sep  1 17:59:50 2010
@@ -1011,12 +1011,12 @@
 
 static void *do_monitor(void *data)
 {
-	fd_set rfds, efds;
-	int n, res;
+	struct pollfd *fds = NULL;
+	int nfds = 0, inuse_fds = 0, res;
 	struct phone_pvt *i;
 	int tonepos = 0;
 	/* The tone we're playing this round */
-	struct timeval wait = {0,0};
+	struct timeval tv = { 0, 0 };
 	int dotone;
 	/* This thread monitors all the frame relay interfaces which are not yet in use
 	   (and thus do not have a separate thread) indefinitely */
@@ -1030,33 +1030,38 @@
 		}
 		/* Build the stuff we're going to select on, that is the socket of every
 		   phone_pvt that does not have an associated owner channel */
-		n = -1;
-		FD_ZERO(&rfds);
-		FD_ZERO(&efds);
 		i = iflist;
 		dotone = 0;
-		while (i) {
-			if (FD_ISSET(i->fd, &rfds)) 
-				ast_log(LOG_WARNING, "Descriptor %d appears twice (%s)?\n", i->fd, i->dev);
+		inuse_fds = 0;
+		for (i = iflist; i; i = i->next) {
 			if (!i->owner) {
 				/* This needs to be watched, as it lacks an owner */
-				FD_SET(i->fd, &rfds);
-				FD_SET(i->fd, &efds);
-				if (i->fd > n)
-					n = i->fd;
+				if (inuse_fds == nfds) {
+					void *tmp = ast_realloc(fds, (nfds + 1) * sizeof(*fds));
+					if (!tmp) {
+						/* Avoid leaking */
+						continue;
+					}
+					fds = tmp;
+					nfds++;
+				}
+				fds[inuse_fds].fd = i->fd;
+				fds[inuse_fds].events = POLLIN | POLLERR;
+				fds[inuse_fds].revents = 0;
+				inuse_fds++;
+
 				if (i->dialtone && i->mode != MODE_SIGMA) {
 					/* Remember we're going to have to come back and play
 					   more dialtones */
-					if (ast_tvzero(wait)) {
+					if (ast_tvzero(tv)) {
 						/* If we're due for a dialtone, play one */
-						if (write(i->fd, DialTone + tonepos, 240) != 240)
+						if (write(i->fd, DialTone + tonepos, 240) != 240) {
 							ast_log(LOG_WARNING, "Dial tone write error\n");
+						}
 					}
 					dotone++;
 				}
 			}
-			
-			i = i->next;
 		}
 		/* Okay, now that we know what to do, release the interface lock */
 		ast_mutex_unlock(&iflock);
@@ -1065,26 +1070,28 @@
 		if (dotone && i && i->mode != MODE_SIGMA) {
 			/* If we're ready to recycle the time, set it to 30 ms */
 			tonepos += 240;
-			if (tonepos >= sizeof(DialTone))
-					tonepos = 0;
-			if (ast_tvzero(wait)) {
-				wait = ast_tv(30000, 0);
-			}
-			res = ast_select(n + 1, &rfds, NULL, &efds, &wait);
+			if (tonepos >= sizeof(DialTone)) {
+				tonepos = 0;
+			}
+			if (ast_tvzero(tv)) {
+				tv = ast_tv(0, 30000);
+			}
+			res = ast_poll2(fds, inuse_fds, &tv);
 		} else {
-			res = ast_select(n + 1, &rfds, NULL, &efds, NULL);
-			wait = ast_tv(0,0);
+			res = ast_poll(fds, inuse_fds, -1);
+			tv = ast_tv(0, 0);
 			tonepos = 0;
 		}
 		/* Okay, select has finished.  Let's see what happened.  */
 		if (res < 0) {
-			ast_debug(1, "select return %d: %s\n", res, strerror(errno));
+			ast_debug(1, "poll returned %d: %s\n", res, strerror(errno));
 			continue;
 		}
 		/* If there are no fd's changed, just continue, it's probably time
 		   to play some more dialtones */
-		if (!res)
+		if (!res) {
 			continue;
+		}
 		/* Alright, lock the interface list again, and let's look and see what has
 		   happened */
 		if (ast_mutex_lock(&iflock)) {
@@ -1092,15 +1099,27 @@
 			continue;
 		}
 
-		i = iflist;
-		for(; i; i=i->next) {
-			if (FD_ISSET(i->fd, &rfds)) {
+		for (i = iflist; i; i = i->next) {
+			int j;
+			/* Find the record */
+			for (j = 0; j < inuse_fds; j++) {
+				if (fds[j].fd == i->fd) {
+					break;
+				}
+			}
+
+			/* Not found? */
+			if (j == inuse_fds) {
+				continue;
+			}
+
+			if (fds[j].revents & POLLIN) {
 				if (i->owner) {
 					continue;
 				}
 				phone_mini_packet(i);
 			}
-			if (FD_ISSET(i->fd, &efds)) {
+			if (fds[j].revents & POLLERR) {
 				if (i->owner) {
 					continue;
 				}
@@ -1110,7 +1129,6 @@
 		ast_mutex_unlock(&iflock);
 	}
 	return NULL;
-	
 }
 
 static int restart_monitor()

Modified: branches/1.6.2/channels/chan_usbradio.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/channels/chan_usbradio.c?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/channels/chan_usbradio.c (original)
+++ branches/1.6.2/channels/chan_usbradio.c Wed Sep  1 17:59:50 2010
@@ -1118,8 +1118,7 @@
 	struct usb_device *usb_dev;
 	struct usb_dev_handle *usb_handle;
 	struct chan_usbradio_pvt *o = (struct chan_usbradio_pvt *) arg;
-	struct timeval to;
-	fd_set rfds;
+	struct pollfd pfd = { .events = POLLIN };
 
 	usb_dev = hid_device_init(o->devstr);
 	if (usb_dev == NULL) {
@@ -1155,63 +1154,49 @@
 	traceusb1(("hidthread: Starting normally on %s!!\n",o->name));
 	lastrx = 0;
 	// popen 
-	while(!o->stophid)
-	{
-		to.tv_sec = 0;
-		to.tv_usec = 50000;   // maw sph
-
-		FD_ZERO(&rfds);
-		FD_SET(o->pttkick[0],&rfds);
-		/* ast_select emulates linux behaviour in terms of timeout handling */
-		res = ast_select(o->pttkick[0] + 1, &rfds, NULL, NULL, &to);
+	while (!o->stophid) {
+		pfd.fd = o->pttkick;
+		pfd.revents = 0;
+
+		res = ast_poll2(&pfd, 1, 50);
 		if (res < 0) {
-			ast_log(LOG_WARNING, "select failed: %s\n", strerror(errno));
+			ast_log(LOG_WARNING, "poll() failed: %s\n", strerror(errno));
 			usleep(10000);
 			continue;
 		}
-		if (FD_ISSET(o->pttkick[0],&rfds))
-		{
+		if (pfd.revents & POLLIN) { {
 			char c;
 
-			if (read(o->pttkick[0],&c,1) < 0) {
+			if (read(o->pttkick[0], &c, 1) < 0) {
 				ast_log(LOG_ERROR, "read() failed: %s\n", strerror(errno));
 			}
 		}
-		if(o->wanteeprom)
-		{
+		if (o->wanteeprom) {
 			ast_mutex_lock(&o->eepromlock);
-			if (o->eepromctl == 1)  /* to read */
-			{
+			if (o->eepromctl == 1) { /* to read */
 				/* if CS okay */
-				if (!get_eeprom(usb_handle,o->eeprom))
-				{
-					if (o->eeprom[EEPROM_MAGIC_ADDR] != EEPROM_MAGIC)
-					{
-						ast_log(LOG_NOTICE,"UNSUCCESSFUL: EEPROM MAGIC NUMBER BAD on channel %s\n",o->name);
-					}
-					else
-					{
+				if (!get_eeprom(usb_handle, o->eeprom)) {
+					if (o->eeprom[EEPROM_MAGIC_ADDR] != EEPROM_MAGIC) {
+						ast_log(LOG_NOTICE, "UNSUCCESSFUL: EEPROM MAGIC NUMBER BAD on channel %s\n", o->name);
+					} else {
 						o->rxmixerset = o->eeprom[EEPROM_RXMIXERSET];
-						o->txmixaset = 	o->eeprom[EEPROM_TXMIXASET];
+						o->txmixaset = o->eeprom[EEPROM_TXMIXASET];
 						o->txmixbset = o->eeprom[EEPROM_TXMIXBSET];
-						memcpy(&o->rxvoiceadj,&o->eeprom[EEPROM_RXVOICEADJ],sizeof(float));
-						memcpy(&o->rxctcssadj,&o->eeprom[EEPROM_RXCTCSSADJ],sizeof(float));
+						memcpy(&o->rxvoiceadj, &o->eeprom[EEPROM_RXVOICEADJ], sizeof(float));
+						memcpy(&o->rxctcssadj, &o->eeprom[EEPROM_RXCTCSSADJ], sizeof(float));
 						o->txctcssadj = o->eeprom[EEPROM_TXCTCSSADJ];
 						o->rxsquelchadj = o->eeprom[EEPROM_RXSQUELCHADJ];
 						ast_log(LOG_NOTICE,"EEPROM Loaded on channel %s\n",o->name);
 					}
-				}
-				else
-				{
-					ast_log(LOG_NOTICE,"USB Adapter has no EEPROM installed or Checksum BAD on channel %s\n",o->name);
+				} else {
+					ast_log(LOG_NOTICE, "USB Adapter has no EEPROM installed or Checksum BAD on channel %s\n", o->name);
 				}
 				hid_set_outputs(usb_handle,bufsave);
-			} 
-			if (o->eepromctl == 2) /* to write */
-			{
+			}
+			if (o->eepromctl == 2) { /* to write */
 				put_eeprom(usb_handle,o->eeprom);
 				hid_set_outputs(usb_handle,bufsave);
-				ast_log(LOG_NOTICE,"USB Parameters written to EEPROM on %s\n",o->name);
+				ast_log(LOG_NOTICE, "USB Parameters written to EEPROM on %s\n", o->name);
 			}
 			o->eepromctl = 0;
 			ast_mutex_unlock(&o->eepromlock);
@@ -1219,38 +1204,43 @@
 		buf[o->hid_gpio_ctl_loc] = o->hid_gpio_ctl;
 		hid_get_inputs(usb_handle,buf);
 		keyed = !(buf[o->hid_io_cor_loc] & o->hid_io_cor);
-		if (keyed != o->rxhidsq)
-		{
-			if(o->debuglevel)printf("chan_usbradio() hidthread: update rxhidsq = %d\n",keyed);
+		if (keyed != o->rxhidsq) {
+			if (o->debuglevel) {
+				printf("chan_usbradio() hidthread: update rxhidsq = %d\n", keyed);
+			}
 			o->rxhidsq=keyed;
 		}
 
 		/* if change in tx state as controlled by xpmr */
-		txtmp=o->pmrChan->txPttOut;
-				
-		if (o->lasttx != txtmp)
-		{
-			o->pmrChan->txPttHid=o->lasttx = txtmp;
-			if(o->debuglevel)printf("hidthread: tx set to %d\n",txtmp);
+		txtmp = o->pmrChan->txPttOut;
+
+		if (o->lasttx != txtmp) {
+			o->pmrChan->txPttHid = o->lasttx = txtmp;
+			if (o->debuglevel) {
+				ast_debug(0, "hidthread: tx set to %d\n", txtmp);
+			}
 			buf[o->hid_gpio_loc] = 0;
-			if (!o->invertptt)
-			{
-				if (txtmp) buf[o->hid_gpio_loc] = o->hid_io_ptt;
-			}
-			else
-			{
-				if (!txtmp) buf[o->hid_gpio_loc] = o->hid_io_ptt;
+			if (!o->invertptt) {
+				if (txtmp) {
+					buf[o->hid_gpio_loc] = o->hid_io_ptt;
+				}
+			} else {
+				if (!txtmp) {
+					buf[o->hid_gpio_loc] = o->hid_io_ptt;
+				}
 			}
 			buf[o->hid_gpio_ctl_loc] = o->hid_gpio_ctl;
-			memcpy(bufsave,buf,sizeof(buf));
-			hid_set_outputs(usb_handle,buf);
+			memcpy(bufsave, buf, sizeof(buf));
+			hid_set_outputs(usb_handle, buf);
 		}
 		time(&o->lasthidtime);
 	}
 	buf[o->hid_gpio_loc] = 0;
-	if (o->invertptt) buf[o->hid_gpio_loc] = o->hid_io_ptt;
+	if (o->invertptt) {
+		buf[o->hid_gpio_loc] = o->hid_io_ptt;
+	}
 	buf[o->hid_gpio_ctl_loc] = o->hid_gpio_ctl;
-	hid_set_outputs(usb_handle,buf);
+	hid_set_outputs(usb_handle, buf);
 	pthread_exit(0);
 }
 
@@ -1451,37 +1441,29 @@
 	 */
 	read(o->sounddev, ign, sizeof(ign));
 	for (;;) {
-		fd_set rfds, wfds;
-		int maxfd, res;
-
-		FD_ZERO(&rfds);
-		FD_ZERO(&wfds);
-		FD_SET(o->sndcmd[0], &rfds);
-		maxfd = o->sndcmd[0];	/* pipe from the main process */
-		if (o->cursound > -1 && o->sounddev < 0)
+		struct pollfd pfd[2] = { { .fd = o->sndcmd[0], .events = POLLIN }, { .fd = o->sounddev } };
+		int res;
+
+		if (o->cursound > -1 && o->sounddev < 0) {
 			setformat(o, O_RDWR);	/* need the channel, try to reopen */
-		else if (o->cursound == -1 && o->owner == NULL)
-		{
+		} else if (o->cursound == -1 && o->owner == NULL) {
 			setformat(o, O_CLOSE);	/* can close */
 		}
 		if (o->sounddev > -1) {
 			if (!o->owner) {	/* no one owns the audio, so we must drain it */
-				FD_SET(o->sounddev, &rfds);
-				maxfd = MAX(o->sounddev, maxfd);
+				pfd[1].events = POLLIN;
 			}
 			if (o->cursound > -1) {
-				FD_SET(o->sounddev, &wfds);
-				maxfd = MAX(o->sounddev, maxfd);
+				pfd[1].events |= POLLOUT;
 			}
 		}
-		/* ast_select emulates linux behaviour in terms of timeout handling */
-		res = ast_select(maxfd + 1, &rfds, &wfds, NULL, NULL);
+		res = ast_poll(pfd, o->sounddev > -1 ? 2 : 1, -1);
 		if (res < 1) {
-			ast_log(LOG_WARNING, "select failed: %s\n", strerror(errno));
+			ast_log(LOG_WARNING, "poll failed: %s\n", strerror(errno));
 			sleep(1);
 			continue;
 		}
-		if (FD_ISSET(o->sndcmd[0], &rfds)) {
+		if (pfd[0].revents & POLLIN) {
 			/* read which sound to play from the pipe */
 			int i, what = -1;
 
@@ -1494,14 +1476,17 @@
 					break;
 				}
 			}
-			if (sounds[i].ind == -1)
+			if (sounds[i].ind == -1) {
 				ast_log(LOG_WARNING, "invalid sound index: %d\n", what);
+			}
 		}
 		if (o->sounddev > -1) {
-			if (FD_ISSET(o->sounddev, &rfds))	/* read and ignore errors */
+			if (pfd[1].revents & POLLIN) { /* read and ignore errors */
 				read(o->sounddev, ign, sizeof(ign)); 
-			if (FD_ISSET(o->sounddev, &wfds))
+			}
+			if (pfd[1].revents & POLLOUT) {
 				send_sound(o);
+			}
 		}
 	}
 	return NULL;				/* Never reached */

Modified: branches/1.6.2/channels/console_video.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/channels/console_video.c?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/channels/console_video.c (original)
+++ branches/1.6.2/channels/console_video.c Wed Sep  1 17:59:50 2010
@@ -234,34 +234,34 @@
  * and contain all configurtion info.
  */
 struct video_desc {
-	char			codec_name[64];	/* the codec we use */
-
-	int			stayopen;	/* set if gui starts manually */
-	pthread_t		vthread;	/* video thread */
-	ast_mutex_t		dec_lock;	/* sync decoder and video thread */
-	int			shutdown;	/* set to shutdown vthread */
-	struct ast_channel	*owner;		/* owner channel */
-
-
-	struct fbuf_t	enc_in;		/* encoder input buffer, allocated in video_out_init() */
-
-	char			keypad_file[256];	/* image for the keypad */
-	char                    keypad_font[256];       /* font for the keypad */
-
-	char			sdl_videodriver[256];
-
-	struct fbuf_t		rem_dpy;	/* display remote video, no buffer (it is in win[WIN_REMOTE].bmp) */
-	struct fbuf_t		loc_dpy;	/* display local source, no buffer (managed by SDL in bmp[1]) */
+	char codec_name[64];        /* the codec we use */
+
+	int stayopen;               /* set if gui starts manually */
+	pthread_t vthread;          /* video thread */
+	ast_mutex_t dec_lock;       /* sync decoder and video thread */
+	int shutdown;               /* set to shutdown vthread */
+	struct ast_channel	*owner; /* owner channel */
+
+
+	struct fbuf_t enc_in;       /* encoder input buffer, allocated in video_out_init() */
+
+	char keypad_file[256];      /* image for the keypad */
+	char keypad_font[256];      /* font for the keypad */
+
+	char sdl_videodriver[256];
+
+	struct fbuf_t rem_dpy;      /* display remote video, no buffer (it is in win[WIN_REMOTE].bmp) */
+	struct fbuf_t loc_dpy;      /* display local source, no buffer (managed by SDL in bmp[1]) */
 
 	/* geometry of the thumbnails for all video sources. */
-	struct fbuf_t		src_dpy[MAX_VIDEO_SOURCES]; /* no buffer allocated here */
-
-	int frame_freeze;	/* flag to freeze the incoming frame */
+	struct fbuf_t src_dpy[MAX_VIDEO_SOURCES]; /* no buffer allocated here */
+
+	int frame_freeze;           /* flag to freeze the incoming frame */
 
 	/* local information for grabbers, codecs, gui */
-	struct gui_info		*gui;
-	struct video_dec_desc	*in;		/* remote video descriptor */
-	struct video_out_desc	out;		/* local video descriptor */
+	struct gui_info *gui;
+	struct video_dec_desc *in;  /* remote video descriptor */
+	struct video_out_desc out;  /* local video descriptor */
 };
 
 static AVPicture *fill_pict(struct fbuf_t *b, AVPicture *p);
@@ -387,8 +387,9 @@
  */
 static void grabber_move(struct video_device *dev, int dx, int dy)
 {
-	if (dev->grabber && dev->grabber->move)
-                dev->grabber->move(dev->grabber_data, dx, dy);
+	if (dev->grabber && dev->grabber->move) {
+		dev->grabber->move(dev->grabber_data, dx, dy);
+	}
 }
 
 /*
@@ -508,33 +509,32 @@
 	/* now setup the parameters for the encoder.
 	 * XXX should be codec-specific
 	 */
-    {
-	AVCodecContext *enc_ctx = avcodec_alloc_context();
-	v->enc_ctx = enc_ctx;
-	enc_ctx->pix_fmt = enc_in->pix_fmt;
-	enc_ctx->width = enc_in->w;
-	enc_ctx->height = enc_in->h;
-	/* XXX rtp_callback ?
-	 * rtp_mode so ffmpeg inserts as many start codes as possible.
-	 */
-	enc_ctx->rtp_mode = 1;
-	enc_ctx->rtp_payload_size = v->mtu / 2; // mtu/2
-	enc_ctx->bit_rate = v->bitrate;
-	enc_ctx->bit_rate_tolerance = enc_ctx->bit_rate/2;
-	enc_ctx->qmin = v->qmin;	/* should be configured */
-	enc_ctx->time_base = (AVRational){1, v->fps};
-	enc_ctx->gop_size = v->fps*5; // emit I frame every 5 seconds
-
-	v->enc->enc_init(v->enc_ctx);
- 
-	if (avcodec_open(enc_ctx, v->codec) < 0) {
-		ast_log(LOG_WARNING, "Unable to initialize the encoder %d\n",
-			codec);
-		av_free(enc_ctx);
-		v->enc_ctx = NULL;
-		return video_out_uninit(env);
-	}
-    }
+	{
+		AVCodecContext *enc_ctx = avcodec_alloc_context();
+		v->enc_ctx = enc_ctx;
+		enc_ctx->pix_fmt = enc_in->pix_fmt;
+		enc_ctx->width = enc_in->w;
+		enc_ctx->height = enc_in->h;
+		/* XXX rtp_callback ?
+		 * rtp_mode so ffmpeg inserts as many start codes as possible.
+		 */
+		enc_ctx->rtp_mode = 1;
+		enc_ctx->rtp_payload_size = v->mtu / 2; // mtu/2
+		enc_ctx->bit_rate = v->bitrate;
+		enc_ctx->bit_rate_tolerance = enc_ctx->bit_rate/2;
+		enc_ctx->qmin = v->qmin;	/* should be configured */
+		enc_ctx->time_base = (AVRational){1, v->fps};
+		enc_ctx->gop_size = v->fps*5; // emit I frame every 5 seconds
+
+		v->enc->enc_init(v->enc_ctx);
+
+		if (avcodec_open(enc_ctx, v->codec) < 0) {
+			ast_log(LOG_WARNING, "Unable to initialize the encoder %d\n", codec);
+			av_free(enc_ctx);
+			v->enc_ctx = NULL;
+			return video_out_uninit(env);
+		}
+	}
 	/*
 	 * Allocate enough for the encoded bitstream. As we are compressing,
 	 * we hope that the output is never larger than the input size.
@@ -637,9 +637,9 @@
 		p_in = fill_pict(in, &my_p_in);
 	if (p_out == NULL)
 		p_out = fill_pict(out, &my_p_out);
-	
-	/*if win_w is different from zero then we must change 
-	the size of the scaled buffer (the position is already 
+
+	/*if win_w is different from zero then we must change
+	the size of the scaled buffer (the position is already
 	encoded into the out parameter)*/
 	if (out->win_w) { /* picture in picture enabled */
 		eff_w=out->win_w;
@@ -650,26 +650,26 @@
 	img_convert(p_out, out->pix_fmt,
 		p_in, in->pix_fmt, in->w, in->h);
 #else /* XXX replacement */
-    {
-	struct SwsContext *convert_ctx;
-	
-	convert_ctx = sws_getContext(in->w, in->h, in->pix_fmt,
-		eff_w, eff_h, out->pix_fmt,
-		SWS_BICUBIC, NULL, NULL, NULL);
-	if (convert_ctx == NULL) {
-		ast_log(LOG_ERROR, "FFMPEG::convert_cmodel : swscale context initialization failed");
-		return;
-	}
-	if (0)
-		ast_log(LOG_WARNING, "in %d %dx%d out %d %dx%d\n",
-			in->pix_fmt, in->w, in->h, out->pix_fmt, eff_w, eff_h);
-	sws_scale(convert_ctx,
-		p_in->data, p_in->linesize,
-		in->w, in->h, /* src slice */
-		p_out->data, p_out->linesize);
-
-	sws_freeContext(convert_ctx);
-    }
+	{
+		struct SwsContext *convert_ctx;
+
+		convert_ctx = sws_getContext(in->w, in->h, in->pix_fmt,
+			eff_w, eff_h, out->pix_fmt,
+			SWS_BICUBIC, NULL, NULL, NULL);
+		if (convert_ctx == NULL) {
+			ast_log(LOG_ERROR, "FFMPEG::convert_cmodel : swscale context initialization failed");
+			return;
+		}
+		if (0)
+			ast_log(LOG_WARNING, "in %d %dx%d out %d %dx%d\n",
+				in->pix_fmt, in->w, in->h, out->pix_fmt, eff_w, eff_h);
+		sws_scale(convert_ctx,
+			p_in->data, p_in->linesize,
+			in->w, in->h, /* src slice */
+			p_out->data, p_out->linesize);
+
+		sws_freeContext(convert_ctx);
+	}
 #endif /* XXX replacement */
 }
 
@@ -873,18 +873,20 @@
 		}
 	}
 	sdl_setup(env);
-	if (!ast_strlen_zero(save_display))
+	if (!ast_strlen_zero(save_display)) {
 		setenv("DISPLAY", save_display, 1);
+	}
 
 	ast_mutex_init(&env->dec_lock);	/* used to sync decoder and renderer */
 
 	if (grabber_open(&env->out)) {
 		ast_log(LOG_WARNING, "cannot open local video source\n");
-	} 
-
-	if (env->out.device_num)
+	}
+
+	if (env->out.device_num) {
 		env->out.devices[env->out.device_primary].status_index |= IS_PRIMARY | IS_SECONDARY;
-	
+	}
+
 	/* even if no device is connected, we must call video_out_init,
 	 * as some of the data structures it initializes are
 	 * used in get_video_frames()
@@ -893,14 +895,14 @@
 
 	/* Writes intial status of the sources. */
 	if (env->gui) {
-	    for (i = 0; i < env->out.device_num; i++) {
-		print_message(env->gui->thumb_bd_array[i].board,
-		 src_msgs[env->out.devices[i].status_index]);
-	    }
+		for (i = 0; i < env->out.device_num; i++) {
+			print_message(env->gui->thumb_bd_array[i].board,
+				src_msgs[env->out.devices[i].status_index]);
+		}
 	}
 
 	for (;;) {
-		struct timeval t = { 0, 50000 };	/* XXX 20 times/sec */
+		struct timespec t = { 0, 50000000 };	/* XXX 20 times/sec */
 		struct ast_frame *p, *f;
 		struct ast_channel *chan;
 		int fd;
@@ -908,13 +910,14 @@
 
 		/* determine if video format changed */
 		if (count++ % 10 == 0) {
-			if (env->out.sendvideo && env->out.devices)
-			    sprintf(buf, "%s %s %dx%d @@ %dfps %dkbps",
+			if (env->out.sendvideo && env->out.devices) {
+				snprintf(buf, sizeof(buf), "%s %s %dx%d @@ %dfps %dkbps",
 				env->out.devices[env->out.device_primary].name, env->codec_name,
 				env->enc_in.w, env->enc_in.h,
-				env->out.fps, env->out.bitrate/1000);
-			else
-			    sprintf(buf, "hold");
+				env->out.fps, env->out.bitrate / 1000);
+			} else {
+				sprintf(buf, "hold");
+			}
 			caption = buf;
 		}
 
@@ -923,36 +926,36 @@
 		* otherwise the drag will not work */ 
 		if (env->gui)
 			eventhandler(env, caption);
- 
+
 		/* sleep for a while */
-		ast_select(0, NULL, NULL, NULL, &t);
+		nanosleep(&t, NULL);
 
 	    if (env->in) {
-		struct video_dec_desc *v = env->in;
-		
-		/*
-		 * While there is something to display, call the decoder and free
-		 * the buffer, possibly enabling the receiver to store new data.
-		 */
-		while (v->dec_in_dpy) {
-			struct fbuf_t *tmp = v->dec_in_dpy;	/* store current pointer */
-
-			/* decode the frame, but show it only if not frozen */
-			if (v->d_callbacks->dec_run(v, tmp) && !env->frame_freeze)
-				show_frame(env, WIN_REMOTE);
-			tmp->used = 0;	/* mark buffer as free */
-			tmp->ebit = 0;
-			ast_mutex_lock(&env->dec_lock);
-			if (++v->dec_in_dpy == &v->dec_in[N_DEC_IN])	/* advance to next, circular */
-				v->dec_in_dpy = &v->dec_in[0];
-
-			if (v->dec_in_cur == NULL)	/* receiver was idle, enable it... */
-				v->dec_in_cur = tmp;	/* using the slot just freed */
-			else if (v->dec_in_dpy == v->dec_in_cur) /* this was the last slot */
-				v->dec_in_dpy = NULL;	/* nothing more to display */
-			ast_mutex_unlock(&env->dec_lock);
-		}
-	    }
+			struct video_dec_desc *v = env->in;
+
+			/*
+			 * While there is something to display, call the decoder and free
+			 * the buffer, possibly enabling the receiver to store new data.
+			 */
+			while (v->dec_in_dpy) {
+				struct fbuf_t *tmp = v->dec_in_dpy;	/* store current pointer */
+
+				/* decode the frame, but show it only if not frozen */
+				if (v->d_callbacks->dec_run(v, tmp) && !env->frame_freeze)
+					show_frame(env, WIN_REMOTE);
+				tmp->used = 0;	/* mark buffer as free */
+				tmp->ebit = 0;
+				ast_mutex_lock(&env->dec_lock);
+				if (++v->dec_in_dpy == &v->dec_in[N_DEC_IN])	/* advance to next, circular */
+					v->dec_in_dpy = &v->dec_in[0];
+
+				if (v->dec_in_cur == NULL)	/* receiver was idle, enable it... */
+					v->dec_in_cur = tmp;	/* using the slot just freed */
+				else if (v->dec_in_dpy == v->dec_in_cur) /* this was the last slot */
+					v->dec_in_dpy = NULL;	/* nothing more to display */
+				ast_mutex_unlock(&env->dec_lock);
+			}
+		}
 
 		if (env->shutdown)
 			break;
@@ -988,7 +991,7 @@
 			for (p = f; p; p = AST_LIST_NEXT(p, frame_list)) {
 				if (write(fd, &blah, l) != l)
 					ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d: %s!\n",
-					    chan->name, f->frametype, f->subclass, strerror(errno));
+						chan->name, f->frametype, f->subclass, strerror(errno));
 			}
 		}
 		ast_channel_unlock(chan);
@@ -1194,13 +1197,13 @@
 	if (env == NULL)
 		return 1;	/* unrecognised */
 
-        if (!strcasecmp(var, "videodevice")) {
+	if (!strcasecmp(var, "videodevice")) {
 		ast_cli(fd, "videodevice is [%s]\n", env->out.devices[env->out.device_primary].name);
-        } else if (!strcasecmp(var, "videocodec")) {
+	} else if (!strcasecmp(var, "videocodec")) {
 		ast_cli(fd, "videocodec is [%s]\n", env->codec_name);
-        } else if (!strcasecmp(var, "sendvideo")) {
+	} else if (!strcasecmp(var, "sendvideo")) {
 		ast_cli(fd, "sendvideo is [%s]\n", env->out.sendvideo ? "on" : "off");
-        } else if (!strcasecmp(var, "video_size")) {
+	} else if (!strcasecmp(var, "video_size")) {
 		int in_w = 0, in_h = 0;
 		if (env->in) {
 			in_w = env->in->dec_out.w;
@@ -1212,22 +1215,22 @@
 			env->loc_dpy.w, env->loc_dpy.h,
 			env->rem_dpy.w, env->rem_dpy.h,
 			in_w, in_h);
-        } else if (!strcasecmp(var, "bitrate")) {
+	} else if (!strcasecmp(var, "bitrate")) {
 		ast_cli(fd, "bitrate is [%d]\n", env->out.bitrate);
-        } else if (!strcasecmp(var, "qmin")) {
+	} else if (!strcasecmp(var, "qmin")) {
 		ast_cli(fd, "qmin is [%d]\n", env->out.qmin);
-        } else if (!strcasecmp(var, "fps")) {
+	} else if (!strcasecmp(var, "fps")) {
 		ast_cli(fd, "fps is [%d]\n", env->out.fps);
-        } else if (!strcasecmp(var, "startgui")) {
+	} else if (!strcasecmp(var, "startgui")) {
 		env->stayopen = 1;
 		console_video_start(env, NULL);
-        } else if (!strcasecmp(var, "stopgui") && env->stayopen != 0) {
+	} else if (!strcasecmp(var, "stopgui") && env->stayopen != 0) {
 		env->stayopen = 0;
 		if (env->gui && env->owner)
 			ast_cli_command(-1, "console hangup");
 		else /* not in a call */
 			console_video_uninit(env);
-        } else {
+	} else {
 		return 1;	/* unrecognised */
 	}
 	return 0;	/* recognised */

Modified: branches/1.6.2/configure.ac
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/configure.ac?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/configure.ac (original)
+++ branches/1.6.2/configure.ac Wed Sep  1 17:59:50 2010
@@ -60,6 +60,7 @@
      ;;
      darwin*)
      AC_DEFINE([AST_POLL_COMPAT], 1, [Define to 1 if internal poll should be used.])
+     AC_DEFINE([_DARWIN_UNLIMITED_SELECT], 1, [Define to 1 if running on Darwin.])
      ;;
      *)
      AC_PREFIX_DEFAULT([/usr])
@@ -417,7 +418,7 @@
 AC_FUNC_STRTOD
 AC_FUNC_UTIME_NULL
 AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([asprintf atexit closefrom dup2 eaccess endpwent euidaccess ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday glob ioperm inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtod strtol strtold strtoq unsetenv utime vasprintf getpeereid sysctl swapctl])
+AC_CHECK_FUNCS([asprintf atexit closefrom dup2 eaccess endpwent euidaccess ftruncate getcwd gethostbyname gethostname getloadavg gettimeofday glob ioperm inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap ppoll putenv re_comp regcomp select setenv socket strcasecmp strcasestr strchr strcspn strdup strerror strlcat strlcpy strncasecmp strndup strnlen strrchr strsep strspn strstr strtod strtol strtold strtoq unsetenv utime vasprintf getpeereid sysctl swapctl])
 
 # BSD might not have exp2, and/or log2
 AC_CHECK_LIB([m], [sqrt])
@@ -624,6 +625,48 @@
 	# It's unlikely an embedded system will have this.
 	AC_MSG_RESULT(unknown)
 )
+
+AC_MSG_CHECKING(if we can increase the maximum select-able file descriptor)
+AC_RUN_IFELSE(
+AC_LANG_PROGRAM([
+#include <stdio.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+], [[
+	struct rlimit rlim = { FD_SETSIZE * 2, FD_SETSIZE * 2 };
+	int fd0, fd1;
+	struct timeval tv = { 0, };
+	struct ast_fdset { long fds_bits[[1024]]; } fds = { { 0, } };
+	if (setrlimit(RLIMIT_NOFILE, &rlim)) { exit(1); }
+	if ((fd0 = open("/dev/null", O_RDONLY)) < 0) { exit(1); }
+	if (dup2(fd0, (fd1 = FD_SETSIZE + 1)) < 0) { exit(1); }
+	FD_SET(fd0, (fd_set *) &fds);
+	FD_SET(fd1, (fd_set *) &fds);
+	if (select(FD_SETSIZE + 2, (fd_set *) &fds, NULL, NULL, &tv) < 0) { exit(1); }
+	exit(0)]]),
+	AC_MSG_RESULT(yes)
+	AC_DEFINE([HAVE_VARIABLE_FDSET], 1, [Define to 1 if your system can support larger than default select bitmasks.]),
+	AC_MSG_RESULT(no),
+	AC_MSG_RESULT(cross-compile)
+)
+
+if test "${ac_cv_have_variable_fdset}x" = "0x"; then
+	AC_RUN_IFELSE(
+		AC_LANG_PROGRAM([
+#include <unistd.h>
+#include <sys/types.h>
+#include <stdlib.h>
+], [if (getuid() != 0) { exit(1); }]),
+		AC_DEFINE([CONFIGURE_RAN_AS_ROOT], 1, [Some configure tests will unexpectedly fail if configure is run by a non-root user.  These may be able to be tested at runtime.]))
+fi
 
 AST_GCC_ATTRIBUTE(pure)
 AST_GCC_ATTRIBUTE(malloc)

Modified: branches/1.6.2/include/asterisk/channel.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/include/asterisk/channel.h?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/include/asterisk/channel.h (original)
+++ branches/1.6.2/include/asterisk/channel.h Wed Sep  1 17:59:50 2010
@@ -1742,42 +1742,6 @@
 }
 #endif
 
-/*! \brief Waits for activity on a group of channels
- * \param nfds the maximum number of file descriptors in the sets
- * \param rfds file descriptors to check for read availability
- * \param wfds file descriptors to check for write availability
- * \param efds file descriptors to check for exceptions (OOB data)
- * \param tvp timeout while waiting for events
- * This is the same as a standard select(), except it guarantees the
- * behaviour where the passed struct timeval is updated with how much
- * time was not slept while waiting for the specified events
- */
-static inline int ast_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tvp)
-{
-#ifdef __linux__
-	return select(nfds, rfds, wfds, efds, tvp);
-#else
-	if (tvp) {
-		struct timeval tv, tvstart, tvend, tvlen;
-		int res;
-
-		tv = *tvp;
-		gettimeofday(&tvstart, NULL);
-		res = select(nfds, rfds, wfds, efds, tvp);
-		gettimeofday(&tvend, NULL);
-		timersub(&tvend, &tvstart, &tvlen);
-		timersub(&tv, &tvlen, tvp);
-		if (tvp->tv_sec < 0 || (tvp->tv_sec == 0 && tvp->tv_usec < 0)) {
-			tvp->tv_sec = 0;
-			tvp->tv_usec = 0;
-		}
-		return res;
-	}
-	else
-		return select(nfds, rfds, wfds, efds, NULL);
-#endif
-}
-
 /*! \brief Retrieves the current T38 state of a channel */
 static inline enum ast_t38_state ast_channel_get_t38_state(struct ast_channel *chan)
 {

Modified: branches/1.6.2/include/asterisk/poll-compat.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/include/asterisk/poll-compat.h?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/include/asterisk/poll-compat.h (original)
+++ branches/1.6.2/include/asterisk/poll-compat.h Wed Sep  1 17:59:50 2010
@@ -79,6 +79,8 @@
 #ifndef __AST_POLL_COMPAT_H
 #define __AST_POLL_COMPAT_H
 
+#include "asterisk/select.h"
+
 #ifndef AST_POLL_COMPAT
 
 #include <sys/poll.h>
@@ -114,4 +116,10 @@
 
 #endif /* AST_POLL_COMPAT */
 
+/*!
+ * \brief Same as poll(2), except the time is specified in microseconds and
+ * the tv argument is modified to indicate the time remaining.
+ */
+int ast_poll2(struct pollfd *pArray, unsigned long n_fds, struct timeval *tv);
+
 #endif /* __AST_POLL_COMPAT_H */

Modified: branches/1.6.2/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/main/asterisk.c?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/main/asterisk.c (original)
+++ branches/1.6.2/main/asterisk.c Wed Sep  1 17:59:50 2010
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 1999 - 2008, Digium, Inc.
+ * Copyright (C) 1999 - 2010, Digium, Inc.
  *
  * Mark Spencer <markster at digium.com>
  *
@@ -268,6 +268,8 @@
 static char ast_config_AST_CTL_OWNER[PATH_MAX] = "\0";
 static char ast_config_AST_CTL_GROUP[PATH_MAX] = "\0";
 static char ast_config_AST_CTL[PATH_MAX] = "asterisk.ctl";
+
+extern unsigned int ast_FD_SETSIZE;
 
 static char *_argv[256];
 static int shuttingdown;
@@ -3145,6 +3147,7 @@
 	char *buf;
 	const char *runuser = NULL, *rungroup = NULL;
 	char *remotesock = NULL;
+	struct rlimit l;
 
 	/* Remember original args for restart */
 	if (argc > ARRAY_LEN(_argv) - 1) {
@@ -3320,7 +3323,6 @@
 	}
 
 	if (ast_opt_dump_core) {
-		struct rlimit l;
 		memset(&l, 0, sizeof(l));
 		l.rlim_cur = RLIM_INFINITY;
 		l.rlim_max = RLIM_INFINITY;
@@ -3328,6 +3330,44 @@
 			ast_log(LOG_WARNING, "Unable to disable core size resource limit: %s\n", strerror(errno));
 		}
 	}
+
+	if (getrlimit(RLIMIT_NOFILE, &l)) {
+		ast_log(LOG_WARNING, "Unable to check file descriptor limit: %s\n", strerror(errno));
+	}
+
+#if !defined(CONFIGURE_RAN_AS_ROOT)
+	/* Check if select(2) will run with more file descriptors */
+	do {
+		int fd, fd2;
+		ast_fdset readers;
+		struct timeval tv = { 0, };
+
+		if (l.rlim_cur <= FD_SETSIZE) {
+			/* The limit of select()able FDs is irrelevant, because we'll never
+			 * open one that high. */
+			break;
+		}
+
+		if (!(fd = open("/dev/null", O_RDONLY))) {
+			ast_log(LOG_ERROR, "Cannot open a file descriptor at boot? %s\n", strerror(errno));
+			break; /* XXX Should we exit() here? XXX */
+		}
+
+		fd2 = (l.rlim_cur > sizeof(readers) * 8 ? sizeof(readers) * 8 : l.rlim_cur) - 1;
+		if (dup2(fd, fd2)) {
+			ast_log(LOG_WARNING, "Cannot open maximum file descriptor %d at boot? %s\n", fd2, strerror(errno));
+			break;
+		}
+
+		FD_ZERO(&readers);
+		FD_SET(fd2, &readers);
+		if (ast_select(fd2 + 1, &readers, NULL, NULL, &tv) < 0) {
+			ast_log(LOG_WARNING, "Maximum select()able file descriptor is %d\n", FD_SETSIZE);
+		}
+	} while (0);
+#elif defined(HAVE_VARIABLE_FDSET)
+	ast_FD_SETSIZE = l.rlim_cur;
+#endif /* !defined(CONFIGURE_RAN_AS_ROOT) */
 
 	if ((!rungroup) && !ast_strlen_zero(ast_config_AST_RUN_GROUP))
 		rungroup = ast_config_AST_RUN_GROUP;

Modified: branches/1.6.2/main/features.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/main/features.c?view=diff&rev=284593&r1=284592&r2=284593
==============================================================================
--- branches/1.6.2/main/features.c (original)
+++ branches/1.6.2/main/features.c Wed Sep  1 17:59:50 2010
@@ -309,7 +309,7 @@
 static struct ast_parkinglot *parkinglot_addref(struct ast_parkinglot *parkinglot);
 static void parkinglot_unref(struct ast_parkinglot *parkinglot);
 static void parkinglot_destroy(void *obj);
-int manage_parkinglot(struct ast_parkinglot *curlot, fd_set *rfds, fd_set *efds, fd_set *nrfds, fd_set *nefds, int *fs, int *max);
+int manage_parkinglot(struct ast_parkinglot *curlot, struct pollfd **pfds, int *nfds, int *fs);
 struct ast_parkinglot *find_parkinglot(const char *name);
 
 
@@ -3066,9 +3066,10 @@
 }
 
 /*! \brief Run management on parkinglots, called once per parkinglot */
-int manage_parkinglot(struct ast_parkinglot *curlot, fd_set *rfds, fd_set *efds, fd_set *nrfds, fd_set *nefds, int *ms, int *max)
-{
-
+int manage_parkinglot(struct ast_parkinglot *curlot, struct pollfd **pfds, int *nfds, int *ms)
+{
+	struct pollfd *new_fds = NULL;
+	int new_nfds = 0;
 	struct parkeduser *pu;
 	int res = 0;
 	char parkingslot[AST_MAX_EXTENSION];
@@ -3091,16 +3092,18 @@
 			/* Get chan, exten from derived kludge */
 			if (pu->peername[0]) {
 				char *peername = ast_strdupa(pu->peername);
-				char *cp = strrchr(peername, '-');

[... 594 lines stripped ...]



More information about the asterisk-commits mailing list