1996-05-04 11:50:46 +04:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
Samba system utilities
1998-01-22 16:27:43 +03:00
Copyright ( C ) Andrew Tridgell 1992 - 1998
1996-05-04 11:50:46 +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
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
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 .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
extern int DEBUGLEVEL ;
/*
The idea is that this file will eventually have wrappers around all
1996-06-19 17:23:46 +04:00
important system calls in samba . The aims are :
1996-05-04 11:50:46 +04:00
- to enable easier porting by putting OS dependent stuff in here
- to allow for hooks into other " pseudo-filesystems "
- to allow easier integration of things like the japanese extensions
1996-06-19 17:23:46 +04:00
- to support the philosophy of Samba to expose the features of
the OS within the SMB model . In general whatever file / printer / variable
expansions / etc make sense to the OS should be acceptable to Samba .
1996-05-04 11:50:46 +04:00
*/
/*******************************************************************
this replaces the normal select ( ) system call
return if some data has arrived on one of the file descriptors
return - 1 means error
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-07-29 07:08:05 +04:00
# ifndef HAVE_SELECT
1996-05-04 11:50:46 +04:00
static int pollfd ( int fd )
{
int r = 0 ;
# ifdef HAS_RDCHK
r = rdchk ( fd ) ;
# elif defined(TCRDCHK)
( void ) ioctl ( fd , TCRDCHK , & r ) ;
# else
( void ) ioctl ( fd , FIONREAD , & r ) ;
# endif
return ( r ) ;
}
1998-08-29 01:46:29 +04:00
int sys_select ( int maxfd , fd_set * fds , struct timeval * tval )
1996-05-04 11:50:46 +04:00
{
fd_set fds2 ;
int counter = 0 ;
int found = 0 ;
FD_ZERO ( & fds2 ) ;
while ( 1 )
1998-08-29 01:46:29 +04:00
{
int i ;
for ( i = 0 ; i < maxfd ; i + + ) {
if ( FD_ISSET ( i , fds ) & & pollfd ( i ) > 0 ) {
found + + ;
FD_SET ( i , & fds2 ) ;
1996-05-04 11:50:46 +04:00
}
1998-08-29 01:46:29 +04:00
}
1996-05-04 11:50:46 +04:00
1998-08-29 01:46:29 +04:00
if ( found ) {
memcpy ( ( void * ) fds , ( void * ) & fds2 , sizeof ( fds2 ) ) ;
return ( found ) ;
}
1996-05-04 11:50:46 +04:00
1998-08-29 01:46:29 +04:00
if ( tval & & tval - > tv_sec < counter ) return ( 0 ) ;
1996-05-04 11:50:46 +04:00
sleep ( 1 ) ;
counter + + ;
1998-08-29 01:46:29 +04:00
}
1996-05-04 11:50:46 +04:00
}
1998-08-29 01:46:29 +04:00
# else /* !NO_SELECT */
int sys_select ( int maxfd , fd_set * fds , struct timeval * tval )
1996-05-04 11:50:46 +04:00
{
1998-08-29 01:46:29 +04:00
# ifdef USE_POLL
struct pollfd pfd [ 256 ] ;
int i ;
int maxpoll ;
int timeout ;
int pollrtn ;
maxpoll = 0 ;
for ( i = 0 ; i < maxfd ; i + + ) {
if ( FD_ISSET ( i , fds ) ) {
struct pollfd * pfdp = & pfd [ maxpoll + + ] ;
pfdp - > fd = i ;
pfdp - > events = POLLIN ;
pfdp - > revents = 0 ;
}
}
timeout = ( tval ! = NULL ) ? ( tval - > tv_sec * 1000 ) + ( tval - > tv_usec / 1000 ) :
- 1 ;
errno = 0 ;
do {
pollrtn = poll ( & pfd [ 0 ] , maxpoll , timeout ) ;
} while ( pollrtn < 0 & & errno = = EINTR ) ;
FD_ZERO ( fds ) ;
for ( i = 0 ; i < maxpoll ; i + + )
if ( pfd [ i ] . revents & POLLIN )
FD_SET ( pfd [ i ] . fd , fds ) ;
return pollrtn ;
# else /* USE_POLL */
1996-05-04 11:50:46 +04:00
struct timeval t2 ;
int selrtn ;
do {
if ( tval ) memcpy ( ( void * ) & t2 , ( void * ) tval , sizeof ( t2 ) ) ;
errno = 0 ;
1998-08-29 01:46:29 +04:00
selrtn = select ( maxfd , SELECT_CAST fds , NULL , NULL , tval ? & t2 : NULL ) ;
1996-05-04 11:50:46 +04:00
} while ( selrtn < 0 & & errno = = EINTR ) ;
return ( selrtn ) ;
}
1998-08-29 01:46:29 +04:00
# endif /* USE_POLL */
# endif /* NO_SELECT */
1996-05-04 11:50:46 +04:00
1998-09-03 22:40:31 +04:00
/*******************************************************************
A stat ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_stat ( char * fname , SMB_STRUCT_STAT * sbuf )
{
# if defined(HAVE_OFF64_T) && defined(HAVE_STAT64)
return stat64 ( fname , sbuf ) ;
# else
return stat ( fname , sbuf ) ;
# endif
}
/*******************************************************************
An fstat ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_fstat ( int fd , SMB_STRUCT_STAT * sbuf )
{
# if defined(HAVE_OFF64_T) && defined(HAVE_FSTAT64)
return fstat64 ( fd , sbuf ) ;
# else
return fstat ( fd , sbuf ) ;
# endif
}
/*******************************************************************
An lstat ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_lstat ( char * fname , SMB_STRUCT_STAT * sbuf )
{
# if defined(HAVE_OFF64_T) && defined(HAVE_LSTAT64)
return lstat64 ( fname , sbuf ) ;
# else
return lstat ( fname , sbuf ) ;
# endif
}
/*******************************************************************
An ftruncate ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_ftruncate ( int fd , SMB_OFF_T offset )
{
# if defined(HAVE_OFF64_T) && defined(HAVE_FTRUNCATE64)
return ftruncate64 ( fd , offset ) ;
# else
return ftruncate ( fd , offset ) ;
# endif
}
/*******************************************************************
An lseek ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-12 01:42:18 +04:00
SMB_OFF_T sys_lseek ( int fd , SMB_OFF_T offset , int whence )
1998-09-03 22:40:31 +04:00
{
# if defined(HAVE_OFF64_T) && defined(HAVE_LSEEK64)
return lseek64 ( fd , offset , whence ) ;
# else
return lseek ( fd , offset , whence ) ;
# endif
}
1996-05-04 11:50:46 +04:00
1998-09-17 23:16:12 +04:00
/*******************************************************************
An fseek ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_fseek ( FILE * fp , SMB_OFF_T offset , int whence )
{
# if defined(LARGE_SMB_OFF_T) && defined(HAVE_FSEEK64)
return fseek64 ( fp , offset , whence ) ;
# else
return fseek ( fp , offset , whence ) ;
# endif
}
/*******************************************************************
An ftell ( ) wrapper that will deal with 64 bit filesizes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
SMB_OFF_T sys_ftell ( FILE * fp )
{
# if defined(LARGE_SMB_OFF_T) && defined(HAVE_FTELL64)
return ( SMB_OFF_T ) ftell64 ( fp ) ;
# else
return ( SMB_OFF_T ) ftell ( fp ) ;
# endif
}
1996-05-04 11:50:46 +04:00
/*******************************************************************
1998-09-02 00:11:54 +04:00
just a unlink wrapper that calls dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
int dos_unlink ( char * fname )
1996-05-04 11:50:46 +04:00
{
return ( unlink ( dos_to_unix ( fname , False ) ) ) ;
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
a simple open ( ) wrapper that calls dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-17 23:16:12 +04:00
int dos_open ( char * fname , int flags , mode_t mode )
1996-05-04 11:50:46 +04:00
{
return ( open ( dos_to_unix ( fname , False ) , flags , mode ) ) ;
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
a simple opendir ( ) wrapper that calls dos_to_unix
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
DIR * dos_opendir ( char * dname )
1996-05-04 11:50:46 +04:00
{
1998-08-14 21:38:29 +04:00
return ( opendir ( dos_to_unix ( dname , False ) ) ) ;
1996-05-04 11:50:46 +04:00
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
and a stat ( ) wrapper that calls dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
int dos_stat ( char * fname , SMB_STRUCT_STAT * sbuf )
1996-05-04 11:50:46 +04:00
{
1998-09-03 22:40:31 +04:00
return ( sys_stat ( dos_to_unix ( fname , False ) , sbuf ) ) ;
1996-05-04 11:50:46 +04:00
}
1996-10-05 06:54:37 +04:00
/*******************************************************************
The wait ( ) calls vary between systems
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_waitpid ( pid_t pid , int * status , int options )
{
1998-07-29 07:08:05 +04:00
# ifdef HAVE_WAITPID
1996-10-05 06:54:37 +04:00
return waitpid ( pid , status , options ) ;
1998-07-29 07:08:05 +04:00
# else /* HAVE_WAITPID */
1997-02-23 08:18:09 +03:00
return wait4 ( pid , status , options , NULL ) ;
1998-07-29 07:08:05 +04:00
# endif /* HAVE_WAITPID */
1996-10-05 06:54:37 +04:00
}
1996-05-04 11:50:46 +04:00
/*******************************************************************
1998-09-02 00:11:54 +04:00
don ' t forget lstat ( ) that calls dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:17:16 +04:00
int dos_lstat ( char * fname , SMB_STRUCT_STAT * sbuf )
1996-05-04 11:50:46 +04:00
{
1998-09-03 22:40:31 +04:00
return ( sys_lstat ( dos_to_unix ( fname , False ) , sbuf ) ) ;
1996-05-04 11:50:46 +04:00
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
mkdir ( ) gets a wrapper that calls dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-17 23:16:12 +04:00
int dos_mkdir ( char * dname , mode_t mode )
1996-05-04 11:50:46 +04:00
{
return ( mkdir ( dos_to_unix ( dname , False ) , mode ) ) ;
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
do does rmdir ( ) - call dos_to_unix
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
int dos_rmdir ( char * dname )
1996-05-04 11:50:46 +04:00
{
return ( rmdir ( dos_to_unix ( dname , False ) ) ) ;
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
I almost forgot chdir ( ) - call dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
int dos_chdir ( char * dname )
1996-05-04 11:50:46 +04:00
{
return ( chdir ( dos_to_unix ( dname , False ) ) ) ;
}
/*******************************************************************
1998-09-02 00:11:54 +04:00
now for utime ( ) - call dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
int dos_utime ( char * fname , struct utimbuf * times )
1996-05-04 11:50:46 +04:00
{
1997-10-20 22:52:04 +04:00
/* if the modtime is 0 or -1 then ignore the call and
return success */
if ( times - > modtime = = ( time_t ) 0 | | times - > modtime = = ( time_t ) - 1 )
return 0 ;
/* if the access time is 0 or -1 then set it to the modtime */
if ( times - > actime = = ( time_t ) 0 | | times - > actime = = ( time_t ) - 1 )
times - > actime = times - > modtime ;
1996-05-04 11:50:46 +04:00
return ( utime ( dos_to_unix ( fname , False ) , times ) ) ;
}
1997-07-01 05:19:13 +04:00
/*********************************************************
for rename across filesystems Patch from Warren Birnbaum
< warrenb @ hpcvscdp . cv . hp . com >
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1997-09-14 20:37:18 +04:00
static int copy_reg ( char * source , const char * dest )
1997-07-01 05:19:13 +04:00
{
1998-09-02 00:17:16 +04:00
SMB_STRUCT_STAT source_stats ;
1997-07-01 05:19:13 +04:00
int ifd ;
int ofd ;
char * buf ;
int len ; /* Number of bytes read into `buf'. */
1998-09-03 22:40:31 +04:00
sys_lstat ( source , & source_stats ) ;
1997-07-01 05:19:13 +04:00
if ( ! S_ISREG ( source_stats . st_mode ) )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
if ( unlink ( dest ) & & errno ! = ENOENT )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
if ( ( ifd = open ( source , O_RDONLY , 0 ) ) < 0 )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
if ( ( ofd = open ( dest , O_WRONLY | O_CREAT | O_TRUNC , 0600 ) ) < 0 )
1998-09-03 22:40:31 +04:00
{
close ( ifd ) ;
return 1 ;
}
1997-07-01 05:19:13 +04:00
if ( ( buf = malloc ( COPYBUF_SIZE ) ) = = NULL )
1998-09-03 22:40:31 +04:00
{
close ( ifd ) ;
close ( ofd ) ;
unlink ( dest ) ;
return 1 ;
}
1997-07-01 05:19:13 +04:00
while ( ( len = read ( ifd , buf , COPYBUF_SIZE ) ) > 0 )
1998-09-03 22:40:31 +04:00
{
if ( write_data ( ofd , buf , len ) < 0 )
1997-07-01 05:19:13 +04:00
{
close ( ifd ) ;
close ( ofd ) ;
unlink ( dest ) ;
1998-09-03 22:40:31 +04:00
free ( buf ) ;
1997-07-01 05:19:13 +04:00
return 1 ;
}
1998-09-03 22:40:31 +04:00
}
free ( buf ) ;
if ( len < 0 )
{
close ( ifd ) ;
close ( ofd ) ;
unlink ( dest ) ;
return 1 ;
}
1997-07-01 05:19:13 +04:00
if ( close ( ifd ) < 0 )
1998-09-03 22:40:31 +04:00
{
close ( ofd ) ;
return 1 ;
}
1997-07-01 05:19:13 +04:00
if ( close ( ofd ) < 0 )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
/* chown turns off set[ug]id bits for non-root,
so do the chmod last . */
/* Try to copy the old file's modtime and access time. */
{
struct utimbuf tv ;
tv . actime = source_stats . st_atime ;
tv . modtime = source_stats . st_mtime ;
if ( utime ( dest , & tv ) )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
}
/* Try to preserve ownership. For non-root it might fail, but that's ok.
But root probably wants to know , e . g . if NFS disallows it . */
if ( chown ( dest , source_stats . st_uid , source_stats . st_gid )
& & ( errno ! = EPERM ) )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
if ( chmod ( dest , source_stats . st_mode & 07777 ) )
1998-09-03 22:40:31 +04:00
return 1 ;
1997-07-01 05:19:13 +04:00
unlink ( source ) ;
return 0 ;
}
1996-05-04 11:50:46 +04:00
/*******************************************************************
1998-09-02 00:11:54 +04:00
for rename ( ) - call dos_to_unix .
1996-05-04 11:50:46 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-02 00:11:54 +04:00
int dos_rename ( char * from , char * to )
1996-05-04 11:50:46 +04:00
{
1997-07-01 05:19:13 +04:00
int rcode ;
1996-05-04 11:50:46 +04:00
pstring zfrom , zto ;
1997-07-01 05:19:13 +04:00
1997-09-26 22:55:29 +04:00
pstrcpy ( zfrom , dos_to_unix ( from , False ) ) ;
pstrcpy ( zto , dos_to_unix ( to , False ) ) ;
1997-07-01 05:19:13 +04:00
rcode = rename ( zfrom , zto ) ;
if ( errno = = EXDEV )
1998-09-03 22:40:31 +04:00
{
/* Rename across filesystems needed. */
rcode = copy_reg ( zfrom , zto ) ;
}
1997-07-01 05:19:13 +04:00
return rcode ;
1996-05-04 11:50:46 +04:00
}
1996-08-13 12:57:55 +04:00
/*******************************************************************
1998-09-02 00:11:54 +04:00
for chmod - call dos_to_unix .
1996-08-13 12:57:55 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-17 23:16:12 +04:00
int dos_chmod ( char * fname , mode_t mode )
1996-08-13 12:57:55 +04:00
{
return ( chmod ( dos_to_unix ( fname , False ) , mode ) ) ;
}
1996-05-04 11:50:46 +04:00
1997-08-22 00:03:45 +04:00
/*******************************************************************
1998-10-02 16:35:28 +04:00
system wrapper for getwd
1997-08-22 00:03:45 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-02 16:35:28 +04:00
char * sys_getwd ( char * s )
1997-08-22 00:03:45 +04:00
{
1998-08-14 21:38:29 +04:00
char * wd ;
1998-07-29 07:08:05 +04:00
# ifdef HAVE_GETCWD
1998-08-14 21:38:29 +04:00
wd = ( char * ) getcwd ( s , sizeof ( pstring ) ) ;
1997-08-22 00:03:45 +04:00
# else
1998-08-14 21:38:29 +04:00
wd = ( char * ) getwd ( s ) ;
1997-08-22 00:03:45 +04:00
# endif
1998-10-02 16:35:28 +04:00
return wd ;
}
/*******************************************************************
for getwd - takes a UNIX directory name and returns the name
in dos format .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char * dos_getwd ( char * s )
{
char * wd ;
wd = sys_getwd ( s ) ;
1998-08-14 21:38:29 +04:00
if ( wd )
unix_to_dos ( wd , True ) ;
return wd ;
1997-08-22 00:03:45 +04:00
}
1996-05-04 11:50:46 +04:00
/*******************************************************************
chown isn ' t used much but OS / 2 doesn ' t have it
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-30 00:24:17 +04:00
int sys_chown ( char * fname , uid_t uid , gid_t gid )
1996-05-04 11:50:46 +04:00
{
1998-07-29 07:08:05 +04:00
# ifndef HAVE_CHOWN
static int done ;
if ( ! done ) {
DEBUG ( 1 , ( " WARNING: no chown! \n " ) ) ;
done = 1 ;
}
1996-05-04 11:50:46 +04:00
# else
1998-07-29 07:08:05 +04:00
return ( chown ( fname , uid , gid ) ) ;
1996-05-04 11:50:46 +04:00
# endif
}
/*******************************************************************
os / 2 also doesn ' t have chroot
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_chroot ( char * dname )
{
1998-07-29 07:08:05 +04:00
# ifndef HAVE_CHROOT
static int done ;
if ( ! done ) {
DEBUG ( 1 , ( " WARNING: no chroot! \n " ) ) ;
done = 1 ;
}
1996-05-04 11:50:46 +04:00
# else
1998-07-29 07:08:05 +04:00
return ( chroot ( dname ) ) ;
1996-05-04 11:50:46 +04:00
# endif
}
1997-02-23 08:18:09 +03:00
/**************************************************************************
A wrapper for gethostbyname ( ) that tries avoids looking up hostnames
in the root domain , which can cause dial - on - demand links to come up for no
apparent reason .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct hostent * sys_gethostbyname ( char * name )
{
1997-08-26 02:18:31 +04:00
# ifdef REDUCE_ROOT_DNS_LOOKUPS
1997-02-23 08:18:09 +03:00
char query [ 256 ] , hostname [ 256 ] ;
char * domain ;
/* Does this name have any dots in it? If so, make no change */
if ( strchr ( name , ' . ' ) )
return ( gethostbyname ( name ) ) ;
/* Get my hostname, which should have domain name
attached . If not , just do the gethostname on the
original string .
*/
gethostname ( hostname , sizeof ( hostname ) - 1 ) ;
hostname [ sizeof ( hostname ) - 1 ] = 0 ;
if ( ( domain = strchr ( hostname , ' . ' ) ) = = NULL )
return ( gethostbyname ( name ) ) ;
/* Attach domain name to query and do modified query.
If names too large , just do gethostname on the
original string .
*/
if ( ( strlen ( name ) + strlen ( domain ) ) > = sizeof ( query ) )
return ( gethostbyname ( name ) ) ;
1998-05-11 10:38:36 +04:00
slprintf ( query , sizeof ( query ) - 1 , " %s%s " , name , domain ) ;
1997-02-23 08:18:09 +03:00
return ( gethostbyname ( query ) ) ;
1997-08-26 02:18:31 +04:00
# else /* REDUCE_ROOT_DNS_LOOKUPS */
return ( gethostbyname ( name ) ) ;
# endif /* REDUCE_ROOT_DNS_LOOKUPS */
1997-02-23 08:18:09 +03:00
}
1998-09-26 03:40:49 +04:00
/**************************************************************************
Try and abstract process capabilities ( for systems that have them ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL set_process_capability ( uint32 cap_flag , BOOL enable )
{
# if defined(HAVE_IRIX_SPECIFIC_CAPABILITIES)
if ( cap_flag = = KERNEL_OPLOCK_CAPABILITY )
{
cap_t cap = cap_get_proc ( ) ;
if ( cap = = NULL ) {
DEBUG ( 0 , ( " set_process_capability: cap_get_proc failed. Error was %s \n " ,
strerror ( errno ) ) ) ;
return False ;
}
if ( enable )
cap - > cap_effective | = CAP_NETWORK_MGT ;
else
cap - > cap_effective & = ~ CAP_NETWORK_MGT ;
if ( cap_set_proc ( cap ) = = - 1 ) {
DEBUG ( 0 , ( " set_process_capability: cap_set_proc failed. Error was %s \n " ,
strerror ( errno ) ) ) ;
return False ;
}
DEBUG ( 10 , ( " set_process_capability: Set KERNEL_OPLOCK_CAPABILITY. \n " ) ) ;
}
# endif
return True ;
}
/**************************************************************************
Try and abstract inherited process capabilities ( for systems that have them ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL set_inherited_process_capability ( uint32 cap_flag , BOOL enable )
{
# if defined(HAVE_IRIX_SPECIFIC_CAPABILITIES)
if ( cap_flag = = KERNEL_OPLOCK_CAPABILITY )
{
cap_t cap = cap_get_proc ( ) ;
if ( cap = = NULL ) {
DEBUG ( 0 , ( " set_inherited_process_capability: cap_get_proc failed. Error was %s \n " ,
strerror ( errno ) ) ) ;
return False ;
}
if ( enable )
cap - > cap_inheritable | = CAP_NETWORK_MGT ;
else
cap - > cap_inheritable & = ~ CAP_NETWORK_MGT ;
if ( cap_set_proc ( cap ) = = - 1 ) {
DEBUG ( 0 , ( " set_inherited_process_capability: cap_set_proc failed. Error was %s \n " ,
strerror ( errno ) ) ) ;
return False ;
}
DEBUG ( 10 , ( " set_inherited_process_capability: Set KERNEL_OPLOCK_CAPABILITY. \n " ) ) ;
}
# endif
return True ;
}
/**************************************************************************
Wrapper for random ( ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
long sys_random ( void )
{
# if defined(HAVE_RANDOM)
return ( long ) random ( ) ;
# elif defined(HAVE_RAND)
return ( long ) rand ( ) ;
# else
DEBUG ( 0 , ( " Error - no random function available ! \n " ) ) ;
exit ( 1 ) ;
# endif
}
/**************************************************************************
Wrapper for srandom ( ) .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void sys_srandom ( unsigned int seed )
{
# if defined(HAVE_SRANDOM)
srandom ( seed ) ;
# elif defined(HAVE_SRAND)
srand ( seed ) ;
# else
DEBUG ( 0 , ( " Error - no srandom function available ! \n " ) ) ;
exit ( 1 ) ;
# endif
}
1998-09-30 00:24:17 +04:00
/**************************************************************************
Wrapper for getgroups . Deals with broken ( int ) case .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int sys_getgroups ( int setlen , gid_t * gidset )
{
# if !defined(HAVE_BROKEN_GETGROUPS)
return getgroups ( setlen , gidset ) ;
# else
GID_T gid ;
GID_T * group_list ;
int i , ngroups ;
if ( setlen = = 0 ) {
return getgroups ( setlen , & gid ) ;
}
/*
* Broken case . We need to allocate a
* GID_T array of size setlen .
*/
if ( setlen < 0 ) {
errno = EINVAL ;
return - 1 ;
}
if ( ( group_list = ( GID_T * ) malloc ( setlen * sizoef ( GID_T ) ) ) = = NULL ) {
DEBUG ( 0 , ( " sys_getgroups: Malloc fail. \n " ) ) ;
return - 1 ;
}
if ( ( ngroups = getgroups ( setlen , group_list ) ) < 0 ) {
int saved_errno = errno ;
free ( ( char * ) group_list ) ;
errno = saved_errno ;
return - 1 ;
}
for ( i = 0 ; i < ngroups ; i + + )
gidset [ i ] = ( gid_t ) group_list [ i ] ;
free ( ( char * ) group_list ) ;
return ngroups ;
# endif /* HAVE_BROKEN_GETGROUPS */
}