svn commit: r296109 - head/libexec/rlogind

Ronald Klop ronald-lists at klop.ws
Sat Feb 27 13:24:48 UTC 2016


Hi,

I'm not a FreeBSD commiter, but read these commits to stay informed about  
what is happening.
This commit (and the one for talk) mentions _what_ is changed, but not  
_why_ it is changed. I'm curious why this is better. Mind to share any  
comments on this?

Regards,
Ronald.


On Fri, 26 Feb 2016 21:02:02 +0100, Pedro F. Giffuni <pfg at freebsd.org>  
wrote:

> Author: pfg
> Date: Fri Feb 26 20:02:01 2016
> New Revision: 296109
> URL: https://svnweb.freebsd.org/changeset/base/296109
>
> Log:
>   rlogin(1): Replace select(2) with poll(2).
>  Obtanied from:	NetBSD (CVS Rev. 1.27 - 1.28)
>
> Modified:
>   head/libexec/rlogind/rlogind.c
>
> Modified: head/libexec/rlogind/rlogind.c
> ==============================================================================
> --- head/libexec/rlogind/rlogind.c	Fri Feb 26 19:49:04 2016	(r296108)
> +++ head/libexec/rlogind/rlogind.c	Fri Feb 26 20:02:01 2016	(r296109)
> @@ -76,6 +76,7 @@ __FBSDID("$FreeBSD$");
>  #include <errno.h>
>  #include <libutil.h>
>  #include <paths.h>
> +#include <poll.h>
>  #include <pwd.h>
>  #include <syslog.h>
>  #include <stdio.h>
> @@ -350,34 +351,27 @@ protocol(int f, int p)
>  		nfd = f + 1;
>  	else
>  		nfd = p + 1;
> -	if (nfd > FD_SETSIZE) {
> -		syslog(LOG_ERR, "select mask too small, increase FD_SETSIZE");
> -		fatal(f, "internal error (select mask too small)", 0);
> -	}
>  	for (;;) {
> -		fd_set ibits, obits, ebits, *omask;
> +		struct pollfd set[2];
> -		FD_ZERO(&ebits);
> -		FD_ZERO(&ibits);
> -		FD_ZERO(&obits);
> -		omask = (fd_set *)NULL;
> -		if (fcc) {
> -			FD_SET(p, &obits);
> -			omask = &obits;
> -		} else
> -			FD_SET(f, &ibits);
> +		set[0].fd = p;
> +		set[0].events = POLLPRI;
> +		set[1].fd = f;
> +		set[1].events = 0;
> +		if (fcc)
> +			set[0].events |= POLLOUT;
> +		else
> +			set[1].events |= POLLIN;
>  		if (pcc >= 0) {
> -			if (pcc) {
> -				FD_SET(f, &obits);
> -				omask = &obits;
> -			} else
> -				FD_SET(p, &ibits);
> +			if (pcc)
> +				set[1].events |= POLLOUT;
> +			else
> +				set[0].events |= POLLIN;
>  		}
> -		FD_SET(p, &ebits);
> -		if ((n = select(nfd, &ibits, omask, &ebits, 0)) < 0) {
> +		if ((n = poll(set, 2, INFTIM)) < 0) {
>  			if (errno == EINTR)
>  				continue;
> -			fatal(f, "select", 1);
> +			fatal(f, "poll", 1);
>  		}
>  		if (n == 0) {
>  			/* shouldn't happen... */
> @@ -385,18 +379,16 @@ protocol(int f, int p)
>  			continue;
>  		}
>  #define	pkcontrol(c)	((c)&(TIOCPKT_FLUSHWRITE|TIOCPKT_NOSTOP|TIOCPKT_DOSTOP))
> -		if (FD_ISSET(p, &ebits)) {
> +		if (set[0].revents & POLLPRI) {
>  			cc = read(p, &cntl, 1);
>  			if (cc == 1 && pkcontrol(cntl)) {
>  				cntl |= oobdata[0];
>  				send(f, &cntl, 1, MSG_OOB);
> -				if (cntl & TIOCPKT_FLUSHWRITE) {
> +				if (cntl & TIOCPKT_FLUSHWRITE)
>  					pcc = 0;
> -					FD_CLR(p, &ibits);
> -				}
>  			}
>  		}
> -		if (FD_ISSET(f, &ibits)) {
> +		if (set[1].revents & POLLIN) {
>  			fcc = read(f, fibuf, sizeof(fibuf));
>  			if (fcc < 0 && errno == EWOULDBLOCK)
>  				fcc = 0;
> @@ -422,11 +414,10 @@ protocol(int f, int p)
>  							goto top; /* n^2 */
>  						}
>  					}
> -				FD_SET(p, &obits);		/* try write */
>  			}
>  		}
> -		if (FD_ISSET(p, &obits) && fcc > 0) {
> +		if (set[0].revents & POLLOUT && fcc > 0) {
>  			cc = write(p, fbp, fcc);
>  			if (cc > 0) {
>  				fcc -= cc;
> @@ -434,7 +425,7 @@ protocol(int f, int p)
>  			}
>  		}
> -		if (FD_ISSET(p, &ibits)) {
> +		if (set[0].revents & POLLIN) {
>  			pcc = read(p, pibuf, sizeof (pibuf));
>  			pbp = pibuf;
>  			if (pcc < 0 && errno == EWOULDBLOCK)
> @@ -443,7 +434,6 @@ protocol(int f, int p)
>  				break;
>  			else if (pibuf[0] == 0) {
>  				pbp++, pcc--;
> -				FD_SET(f, &obits);	/* try write */
>  			} else {
>  				if (pkcontrol(pibuf[0])) {
>  					pibuf[0] |= oobdata[0];
> @@ -452,18 +442,8 @@ protocol(int f, int p)
>  				pcc = 0;
>  			}
>  		}
> -		if ((FD_ISSET(f, &obits)) && pcc > 0) {
> +		if (set[1].revents & POLLOUT && pcc > 0) {
>  			cc = write(f, pbp, pcc);
> -			if (cc < 0 && errno == EWOULDBLOCK) {
> -				/*
> -				 * This happens when we try write after read
> -				 * from p, but some old kernels balk at large
> -				 * writes even when select returns true.
> -				 */
> -				if (!FD_ISSET(p, &ibits))
> -					sleep(5);
> -				continue;
> -			}
>  			if (cc > 0) {
>  				pcc -= cc;
>  				pbp += cc;
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"


More information about the svn-src-all mailing list