2 Unix SMB/Netbios implementation.
5 Copyright (C) Andrew Tridgell 1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 int open(const char *name, int flags, ...)
31 mode = va_arg(ap, mode_t);
34 if (smbw_path(name)) {
35 return smbw_open(name, flags, mode);
38 return real_open(name, flags, mode);
42 int _open(const char *name, int flags, ...)
48 mode = va_arg(ap, mode_t);
51 return open(name, flags, mode);
54 int __open(const char *name, int flags, ...)
60 mode = va_arg(ap, mode_t);
63 return open(name, flags, mode);
69 int open64(const char *name, int flags, mode_t mode)
71 if (smbw_path(name)) {
72 return smbw_open(name, flags, mode);
75 return real_open64(name, flags, mode);
80 int _open64(const char *name, int flags, mode_t mode)
82 return open64(name, flags, mode);
85 int __open64(const char *name, int flags, mode_t mode)
87 return open64(name, flags, mode);
92 ssize_t pread(int fd, void *buf, size_t size, off_t ofs)
95 return smbw_pread(fd, buf, size, ofs);
98 return real_pread(fd, buf, size, ofs);
103 ssize_t pread64(int fd, void *buf, size_t size, off64_t ofs)
106 return smbw_pread(fd, buf, size, ofs);
109 return real_pread64(fd, buf, size, ofs);
114 ssize_t pwrite(int fd, void *buf, size_t size, off_t ofs)
117 return smbw_pwrite(fd, buf, size, ofs);
120 return real_pwrite(fd, buf, size, ofs);
125 ssize_t pwrite64(int fd, void *buf, size_t size, off64_t ofs)
128 return smbw_pwrite(fd, buf, size, ofs);
131 return real_pwrite64(fd, buf, size, ofs);
136 int chdir(const char *name)
138 return smbw_chdir(name);
142 int __chdir(const char *name)
147 int _chdir(const char *name)
157 return smbw_close(fd);
160 return real_close(fd);
179 return smbw_fchdir(fd);
182 return real_fchdir(fd);
198 int fcntl(int fd, int cmd, ...)
203 arg = va_arg(ap, long);
207 return smbw_fcntl(fd, cmd, arg);
210 return real_fcntl(fd, cmd, arg);
215 int __fcntl(int fd, int cmd, ...)
220 arg = va_arg(ap, long);
223 return fcntl(fd, cmd, arg);
226 int _fcntl(int fd, int cmd, ...)
231 arg = va_arg(ap, long);
234 return fcntl(fd, cmd, arg);
240 int getdents(int fd, struct dirent *dirp, unsigned int count)
243 return smbw_getdents(fd, dirp, count);
246 return real_getdents(fd, dirp, count);
249 #ifdef HAVE___GETDENTS
250 int __getdents(int fd, struct dirent *dirp, unsigned int count)
252 return getdents(fd, dirp, count);
255 int _getdents(int fd, struct dirent *dirp, unsigned int count)
257 return getdents(fd, dirp, count);
262 off_t lseek(int fd, off_t offset, int whence)
265 return smbw_lseek(fd, offset, whence);
268 return real_lseek(fd, offset, whence);
272 off_t __lseek(int fd, off_t offset, int whence)
274 return lseek(fd, offset, whence);
277 off_t _lseek(int fd, off_t offset, int whence)
279 return lseek(fd, offset, whence);
284 ssize_t read(int fd, void *buf, size_t count)
287 return smbw_read(fd, buf, count);
290 return real_read(fd, buf, count);
294 ssize_t __read(int fd, void *buf, size_t count)
296 return read(fd, buf, count);
299 ssize_t _read(int fd, void *buf, size_t count)
301 return read(fd, buf, count);
306 ssize_t write(int fd, void *buf, size_t count)
309 return smbw_write(fd, buf, count);
312 return real_write(fd, buf, count);
316 ssize_t __write(int fd, void *buf, size_t count)
318 return write(fd, buf, count);
321 ssize_t _write(int fd, void *buf, size_t count)
323 return write(fd, buf, count);
329 int access(const char *name, int mode)
331 if (smbw_path(name)) {
332 return smbw_access(name, mode);
335 return real_access(name, mode);
340 int chmod(const char *name,mode_t mode)
342 if (smbw_path(name)) {
343 return smbw_chmod(name, mode);
346 return real_chmod(name, mode);
351 int chown(const char *name,uid_t owner, gid_t group)
353 if (smbw_path(name)) {
354 return smbw_chown(name, owner, group);
357 return real_chown(name, owner, group);
361 int __fxstat(int vers, int fd, struct stat *st)
363 struct kernel_stat kbuf;
367 return smbw_fstat(fd, st);
371 case _STAT_VER_LINUX_OLD:
372 /* Nothing to do. The struct is in the form the kernel expects
374 return real_fstat(fd, (struct kernel_stat *)st);
377 case _STAT_VER_LINUX:
378 /* Do the system call. */
379 ret = real_fstat(fd, &kbuf);
381 st->st_dev = kbuf.st_dev;
385 st->st_ino = kbuf.st_ino;
386 st->st_mode = kbuf.st_mode;
387 st->st_nlink = kbuf.st_nlink;
388 st->st_uid = kbuf.st_uid;
389 st->st_gid = kbuf.st_gid;
390 st->st_rdev = kbuf.st_rdev;
394 st->st_size = kbuf.st_size;
395 st->st_blksize = kbuf.st_blksize;
396 st->st_blocks = kbuf.st_blocks;
397 st->st_atime = kbuf.st_atime;
398 #ifdef _HAVE___UNUSED1
401 st->st_mtime = kbuf.st_mtime;
402 #ifdef _HAVE___UNUSED2
405 st->st_ctime = kbuf.st_ctime;
406 #ifdef _HAVE___UNUSED3
409 #ifdef _HAVE___UNUSED4
412 #ifdef _HAVE___UNUSED5
425 char *getcwd(char *buf, size_t size)
427 return smbw_getcwd(buf, size);
432 int __lxstat(int vers, const char *name, struct stat *st)
434 struct kernel_stat kbuf;
437 if (smbw_path(name)) {
438 return smbw_stat(name, st);
442 case _STAT_VER_LINUX_OLD:
443 /* Nothing to do. The struct is in the form the kernel expects
445 return real_lstat(name, (struct kernel_stat *)st);
448 case _STAT_VER_LINUX:
449 /* Do the system call. */
450 ret = real_lstat(name, &kbuf);
452 st->st_dev = kbuf.st_dev;
456 st->st_ino = kbuf.st_ino;
457 st->st_mode = kbuf.st_mode;
458 st->st_nlink = kbuf.st_nlink;
459 st->st_uid = kbuf.st_uid;
460 st->st_gid = kbuf.st_gid;
461 st->st_rdev = kbuf.st_rdev;
465 st->st_size = kbuf.st_size;
466 st->st_blksize = kbuf.st_blksize;
467 st->st_blocks = kbuf.st_blocks;
468 st->st_atime = kbuf.st_atime;
469 #ifdef _HAVE___UNUSED1
472 st->st_mtime = kbuf.st_mtime;
473 #ifdef _HAVE___UNUSED2
476 st->st_ctime = kbuf.st_ctime;
477 #ifdef _HAVE___UNUSED3
480 #ifdef _HAVE___UNUSED4
483 #ifdef _HAVE___UNUSED5
496 int mkdir(const char *name, mode_t mode)
498 if (smbw_path(name)) {
499 return smbw_mkdir(name, mode);
502 return real_mkdir(name, mode);
507 int __xstat(int vers, const char *name, struct stat *st)
509 struct kernel_stat kbuf;
512 if (smbw_path(name)) {
513 return smbw_stat(name, st);
517 case _STAT_VER_LINUX_OLD:
518 /* Nothing to do. The struct is in the form the kernel expects
520 return real_stat(name, (struct kernel_stat *)st);
523 case _STAT_VER_LINUX:
524 /* Do the system call. */
525 ret = real_stat(name, &kbuf);
527 st->st_dev = kbuf.st_dev;
531 st->st_ino = kbuf.st_ino;
532 st->st_mode = kbuf.st_mode;
533 st->st_nlink = kbuf.st_nlink;
534 st->st_uid = kbuf.st_uid;
535 st->st_gid = kbuf.st_gid;
536 st->st_rdev = kbuf.st_rdev;
540 st->st_size = kbuf.st_size;
541 st->st_blksize = kbuf.st_blksize;
542 st->st_blocks = kbuf.st_blocks;
543 st->st_atime = kbuf.st_atime;
544 #ifdef _HAVE___UNUSED1
547 st->st_mtime = kbuf.st_mtime;
548 #ifdef _HAVE___UNUSED2
551 st->st_ctime = kbuf.st_ctime;
552 #ifdef _HAVE___UNUSED3
555 #ifdef _HAVE___UNUSED4
558 #ifdef _HAVE___UNUSED5
570 int stat(const char *name, struct stat *st)
573 return __xstat(_STAT_VER, name, st);
575 if (smbw_path(name)) {
576 return smbw_stat(name, st);
578 return real_stat(name, st);
582 int lstat(const char *name, struct stat *st)
585 return __lxstat(_STAT_VER, name, st);
587 if (smbw_path(name)) {
588 return smbw_stat(name, st);
590 return real_lstat(name, st);
594 int fstat(int fd, struct stat *st)
597 return __fxstat(_STAT_VER, fd, st);
600 return smbw_fstat(fd, st);
602 return real_fstat(fd, st);
607 int unlink(const char *name)
609 if (smbw_path(name)) {
610 return smbw_unlink(name);
613 return real_unlink(name);
618 int utime(const char *name,void *tvp)
620 if (smbw_path(name)) {
621 return smbw_utime(name, tvp);
624 return real_utime(name, tvp);
629 int utimes(const char *name,struct timeval tvp[2])
631 if (smbw_path(name)) {
632 return smbw_utimes(name, tvp);
635 return real_utimes(name, tvp);
639 int readlink(char *path, char *buf, size_t bufsize)
641 if (smbw_path(path)) {
642 return smbw_readlink(path, buf, bufsize);
645 return real_readlink(path, buf, bufsize);
649 int rename(const char *oldname,const char *newname)
652 p1 = smbw_path(oldname);
653 p2 = smbw_path(newname);
655 /* can't cross filesystem boundaries */
660 return smbw_rename(oldname, newname);
663 return real_rename(oldname, newname);
666 int rmdir(const char *name)
668 if (smbw_path(name)) {
669 return smbw_rmdir(name);
672 return real_rmdir(name);
676 int symlink(const char *topath,const char *frompath)
679 p1 = smbw_path(topath);
680 p2 = smbw_path(frompath);
682 /* can't handle symlinks */
687 return real_symlink(topath, frompath);
699 int dup2(int oldfd, int newfd)
701 if (smbw_fd(newfd)) {
705 if (smbw_fd(oldfd)) {
706 return smbw_dup2(oldfd, newfd);
709 return real_dup2(oldfd, newfd);
713 DIR *opendir(const char *name)
716 if (smbw_path(name)) {
717 return smbw_opendir(name);
720 return real_opendir(name);
725 struct dirent *readdir(DIR *dir)
727 if (smbw_dirp(dir)) {
728 return smbw_readdir(dir);
731 return real_readdir(dir);
736 int closedir(DIR *dir)
738 if (smbw_dirp(dir)) {
739 return smbw_closedir(dir);
742 return real_closedir(dir);
747 off_t telldir(DIR *dir)
749 if (smbw_dirp(dir)) {
750 return smbw_telldir(dir);
753 return real_telldir(dir);
758 void seekdir(DIR *dir, off_t offset)
760 if (smbw_dirp(dir)) {
761 smbw_seekdir(dir, offset);
765 real_seekdir(dir, offset);
770 #ifndef NO_ACL_WRAPPER
771 int acl(const char *pathp, int cmd, int nentries, aclent_t *aclbufp)
773 if (smbw_path(pathp)) {
784 real_acl(pathp, cmd, nentries, aclbufp);
788 #ifndef NO_FACL_WRAPPER
789 int facl(int fd, int cmd, int nentries, aclent_t *aclbufp)
802 real_facl(fd, cmd, nentries, aclbufp);
806 int creat(const char *path, mode_t mode)
808 return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode);
812 int creat64(const char *path, mode_t mode)
814 return open64(path, O_WRONLY|O_CREAT|O_TRUNC, mode);
819 static void stat64_convert(struct stat *st, struct stat64 *st64)
821 st64->st_size = st->st_size;
822 st64->st_mode = st->st_mode;
823 st64->st_ino = st->st_ino;
824 st64->st_dev = st->st_dev;
825 st64->st_rdev = st->st_rdev;
826 st64->st_nlink = st->st_nlink;
827 st64->st_uid = st->st_uid;
828 st64->st_gid = st->st_gid;
829 st64->st_atime = st->st_atime;
830 st64->st_mtime = st->st_mtime;
831 st64->st_ctime = st->st_ctime;
832 st64->st_blksize = st->st_blksize;
833 st64->st_blocks = st->st_blocks;
836 int stat64(const char *name, struct stat64 *st64)
838 if (smbw_path(name)) {
840 int ret = stat(name, &st);
841 stat64_convert(&st, st64);
844 return real_stat64(name, st64);
847 int fstat64(int fd, struct stat64 *st64)
851 int ret = fstat(fd, &st);
852 stat64_convert(&st, st64);
855 return real_fstat64(fd, st64);
858 int lstat64(const char *name, struct stat64 *st64)
860 if (smbw_path(name)) {
862 int ret = lstat(name, &st);
863 stat64_convert(&st, st64);
866 return real_lstat64(name, st64);
871 offset_t llseek(int fd, offset_t ofs, int whence)
874 return lseek(fd, ofs, whence);
876 return real_llseek(fd, ofs, whence);
880 #ifdef HAVE_READDIR64
881 static void dirent64_convert(struct dirent *d, struct dirent64 *d64)
883 d64->d_ino = d->d_ino;
884 d64->d_off = d->d_off;
885 d64->d_reclen = d->d_reclen;
886 strcpy(d64->d_name, d->d_name);
889 struct dirent64 *readdir64(DIR *dir)
891 if (smbw_dirp(dir)) {
899 dirent64_convert(d, &dbuf.d64);
902 return real_readdir64(dir);