diff options
Diffstat (limited to 'source/lib/system.c')
-rw-r--r-- | source/lib/system.c | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/source/lib/system.c b/source/lib/system.c new file mode 100644 index 00000000000..938746e9c9d --- /dev/null +++ b/source/lib/system.c @@ -0,0 +1,222 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + Samba system utilities + Copyright (C) Andrew Tridgell 1992-1995 + + 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 02139, USA. +*/ + +#include "includes.h" + +extern int DEBUGLEVEL; + +/* + The idea is that this file will eventually have wrappers around all + important system calls in samba. The aim is twofold: + + - 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 +*/ + + +/******************************************************************* +this replaces the normal select() system call +return if some data has arrived on one of the file descriptors +return -1 means error +********************************************************************/ +#ifdef NO_SELECT +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); +} + +int sys_select(fd_set *fds,struct timeval *tval) +{ + fd_set fds2; + int counter=0; + int found=0; + + FD_ZERO(&fds2); + + while (1) + { + int i; + for (i=0;i<255;i++) { + if (FD_ISSET(i,fds) && pollfd(i)>0) { + found++; + FD_SET(i,&fds2); + } + } + + if (found) { + memcpy((void *)fds,(void *)&fds2,sizeof(fds2)); + return(found); + } + + if (tval && tval.tv_sec < counter) return(0); + sleep(1); + counter++; + } +} + +#else +int sys_select(fd_set *fds,struct timeval *tval) +{ + struct timeval t2; + int selrtn; + + do { + if (tval) memcpy((void *)&t2,(void *)tval,sizeof(t2)); + errno = 0; + selrtn = select(16,SELECT_CAST fds,NULL,NULL,tval?&t2:NULL); + } while (selrtn<0 && errno == EINTR); + + return(selrtn); +} +#endif + + +/******************************************************************* +just a unlink wrapper +********************************************************************/ +int sys_unlink(char *fname) +{ + return(unlink(dos_to_unix(fname,False))); +} + + +/******************************************************************* +a simple open() wrapper +********************************************************************/ +int sys_open(char *fname,int flags,int mode) +{ + return(open(dos_to_unix(fname,False),flags,mode)); +} + + +/******************************************************************* +a simple opendir() wrapper +********************************************************************/ +DIR *sys_opendir(char *dname) +{ + return(opendir(dos_to_unix(dname,False))); +} + + +/******************************************************************* +and a stat() wrapper +********************************************************************/ +int sys_stat(char *fname,struct stat *sbuf) +{ + return(stat(dos_to_unix(fname,False),sbuf)); +} + +/******************************************************************* +don't forget lstat() +********************************************************************/ +int sys_lstat(char *fname,struct stat *sbuf) +{ + return(lstat(dos_to_unix(fname,False),sbuf)); +} + + +/******************************************************************* +mkdir() gets a wrapper +********************************************************************/ +int sys_mkdir(char *dname,int mode) +{ + return(mkdir(dos_to_unix(dname,False),mode)); +} + + +/******************************************************************* +do does rmdir() +********************************************************************/ +int sys_rmdir(char *dname) +{ + return(rmdir(dos_to_unix(dname,False))); +} + + +/******************************************************************* +I almost forgot chdir() +********************************************************************/ +int sys_chdir(char *dname) +{ + return(chdir(dos_to_unix(dname,False))); +} + + +/******************************************************************* +now for utime() +********************************************************************/ +int sys_utime(char *fname,struct utimbuf *times) +{ + return(utime(dos_to_unix(fname,False),times)); +} + +/******************************************************************* +for rename() +********************************************************************/ +int sys_rename(char *from, char *to) +{ +#ifdef KANJI + pstring zfrom, zto; + strcpy (zfrom, dos_to_unix (from, False)); + strcpy (zto, dos_to_unix (to, False)); + return rename (zfrom, zto); +#else + return rename (from, to); +#endif /* KANJI */ +} + + +/******************************************************************* +chown isn't used much but OS/2 doesn't have it +********************************************************************/ +int sys_chown(char *fname,int uid,int gid) +{ +#ifdef NO_CHOWN + DEBUG(1,("Warning - chown(%s,%d,%d) not done\n",fname,uid,gid)); +#else + return(chown(fname,uid,gid)); +#endif +} + +/******************************************************************* +os/2 also doesn't have chroot +********************************************************************/ +int sys_chroot(char *dname) +{ +#ifdef NO_CHROOT + DEBUG(1,("Warning - chroot(%s) not done\n",dname)); +#else + return(chroot(dname)); +#endif +} |