2010-10-01 12:08:15 +04:00
/*
2002-07-15 14:35:28 +04:00
Unix SMB / Netbios implementation .
Version 3.0
2000-06-13 07:29:36 +04:00
Samba select / poll implementation
Copyright ( C ) Andrew Tridgell 1992 - 1998
2010-10-01 12:08:15 +04:00
2000-06-13 07:29:36 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2000-06-13 07:29:36 +04:00
( at your option ) any later version .
2010-10-01 12:08:15 +04:00
2000-06-13 07:29:36 +04:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2010-10-01 12:08:15 +04:00
2000-06-13 07:29:36 +04:00
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2000-06-13 07:29:36 +04:00
*/
2017-01-08 22:52:47 +03:00
# include "replace.h"
2010-10-01 12:08:15 +04:00
# include "system/filesys.h"
# include "system/select.h"
# include "lib/util/select.h"
2017-01-08 22:52:47 +03:00
# include "lib/util/time.h"
2000-06-13 07:29:36 +04:00
2011-02-08 19:28:27 +03:00
int sys_poll_intr ( struct pollfd * fds , int num_fds , int timeout )
{
int orig_timeout = timeout ;
struct timespec start ;
int ret ;
clock_gettime_mono ( & start ) ;
while ( true ) {
struct timespec now ;
int64_t elapsed ;
ret = poll ( fds , num_fds , timeout ) ;
if ( ret ! = - 1 ) {
break ;
}
if ( errno ! = EINTR ) {
break ;
}
2014-07-21 12:47:53 +04:00
/* Infinite timeout, no need to adjust. */
if ( timeout < 0 ) {
continue ;
}
2011-02-08 19:28:27 +03:00
clock_gettime_mono ( & now ) ;
2014-07-21 12:47:53 +04:00
elapsed = nsec_time_diff ( & now , & start ) / 1000000 ;
timeout = orig_timeout - elapsed ;
/* Unlikely, but might happen eg. when getting traced.
* Make sure we ' re not hanging in this case .
*/
if ( timeout < 0 ) {
timeout = 0 ;
}
2011-02-08 19:28:27 +03:00
} ;
return ret ;
}