2008-04-25 01:28:30 +04:00
/*
Unix SMB / CIFS implementation .
Copyright ( C ) Andrew Tridgell 2005
Copyright ( C ) Jelmer Vernooij 2005
2009-02-16 10:52:06 +03:00
* * NOTE ! The following LGPL license applies to the tevent
* * library . This does NOT imply that all of Samba is released
* * under the LGPL
2008-04-25 01:28:30 +04:00
2009-02-16 10:52:06 +03:00
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 3 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
2008-04-25 01:28:30 +04:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
2009-02-16 10:52:06 +03:00
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
2008-04-25 01:28:30 +04:00
2009-02-16 10:52:06 +03:00
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , see < http : //www.gnu.org/licenses/>.
2008-04-25 01:28:30 +04:00
*/
# include "replace.h"
# include "talloc.h"
2008-12-16 21:57:09 +03:00
# include "tevent.h"
# include "tevent_internal.h"
# include "tevent_util.h"
2008-06-14 19:23:31 +04:00
# include <fcntl.h>
2008-04-25 01:28:30 +04:00
/**
return the number of elements in a string list
*/
2008-12-20 21:54:13 +03:00
size_t ev_str_list_length ( const char * * list )
2008-04-25 01:28:30 +04:00
{
size_t ret ;
for ( ret = 0 ; list & & list [ ret ] ; ret + + ) /* noop */ ;
return ret ;
}
/**
add an entry to a string list
*/
2008-06-14 19:23:31 +04:00
const char * * ev_str_list_add ( const char * * list , const char * s )
2008-04-25 01:28:30 +04:00
{
2008-12-20 21:54:13 +03:00
size_t len = ev_str_list_length ( list ) ;
2008-04-25 01:28:30 +04:00
const char * * ret ;
ret = talloc_realloc ( NULL , list , const char * , len + 2 ) ;
if ( ret = = NULL ) return NULL ;
ret [ len ] = talloc_strdup ( ret , s ) ;
if ( ret [ len ] = = NULL ) return NULL ;
ret [ len + 1 ] = NULL ;
return ret ;
}
/**
2008-06-14 19:23:31 +04:00
Set a fd into blocking / nonblocking mode . Uses POSIX O_NONBLOCK if available ,
else
if SYSV use O_NDELAY
if BSD use FNDELAY
* */
2008-04-25 01:28:30 +04:00
2008-06-14 19:23:31 +04:00
int ev_set_blocking ( int fd , bool set )
2008-04-25 01:28:30 +04:00
{
2008-06-14 19:23:31 +04:00
int val ;
# ifdef O_NONBLOCK
# define FLAG_TO_SET O_NONBLOCK
# else
# ifdef SYSV
# define FLAG_TO_SET O_NDELAY
# else /* BSD */
# define FLAG_TO_SET FNDELAY
# endif
# endif
if ( ( val = fcntl ( fd , F_GETFL , 0 ) ) = = - 1 )
return - 1 ;
if ( set ) /* Turn blocking on - ie. clear nonblock flag */
val & = ~ FLAG_TO_SET ;
else
val | = FLAG_TO_SET ;
return fcntl ( fd , F_SETFL , val ) ;
# undef FLAG_TO_SET
2008-04-25 01:28:30 +04:00
}
2011-08-11 14:30:48 +04:00
bool ev_set_close_on_exec ( int fd )
{
# ifdef FD_CLOEXEC
int val ;
val = fcntl ( fd , F_GETFD , 0 ) ;
if ( val > = 0 ) {
val | = FD_CLOEXEC ;
val = fcntl ( fd , F_SETFD , val ) ;
if ( val ! = - 1 ) {
return true ;
}
}
# endif
return false ;
}