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.
26 __asm__(".globl __open; __open = open");
29 int open(const char *name, int flags, mode_t mode)
31 if (smbw_path(name)) {
32 return smbw_open(name, flags, mode);
35 return real_open(name, flags, mode);
40 __asm__(".globl __chdir; __chdir = chdir");
43 int chdir(const char *name)
45 return smbw_chdir(name);
51 __asm__(".globl __close; __close = close");
57 return smbw_close(fd);
60 return real_close(fd);
65 __asm__(".globl __fchdir; __fchdir = fchdir");
71 return smbw_fchdir(fd);
74 return real_fchdir(fd);
79 __asm__(".globl __fcntl; __fcntl = fcntl");
82 int fcntl(int fd, int cmd, long arg)
85 return smbw_fcntl(fd, cmd, arg);
88 return real_fcntl(fd, cmd, arg);
94 __asm__(".globl __getdents; __getdents = getdents");
97 int getdents(int fd, struct dirent *dirp, unsigned int count)
100 return smbw_getdents(fd, dirp, count);
103 return real_getdents(fd, dirp, count);
108 __asm__(".globl __lseek; __lseek = lseek");
111 ssize_t lseek(int fd, off_t offset, int whence)
114 return smbw_lseek(fd, offset, whence);
117 return real_lseek(fd, offset, whence);
123 __asm__(".globl __read; __read = read");
126 ssize_t read(int fd, void *buf, size_t count)
129 return smbw_read(fd, buf, count);
132 return real_read(fd, buf, count);
137 __asm__(".globl __write; __write = write");
140 ssize_t write(int fd, void *buf, size_t count)
143 return smbw_write(fd, buf, count);
146 return real_write(fd, buf, count);
150 int access(const char *name, int mode)
152 if (smbw_path(name)) {
153 return smbw_access(name, mode);
156 return real_access(name, mode);
161 int chmod(const char *name,mode_t mode)
163 if (smbw_path(name)) {
164 return smbw_chmod(name, mode);
167 return real_chmod(name, mode);
172 int chown(const char *name,uid_t owner, gid_t group)
174 if (smbw_path(name)) {
175 return smbw_chown(name, owner, group);
178 return real_chown(name, owner, group);
182 int __fxstat(int vers, int fd, struct stat *st)
184 struct kernel_stat kbuf;
188 return smbw_fstat(fd, st);
192 case _STAT_VER_LINUX_OLD:
193 /* Nothing to do. The struct is in the form the kernel expects
195 return real_fstat(fd, (struct kernel_stat *)st);
198 case _STAT_VER_LINUX:
199 /* Do the system call. */
200 ret = real_fstat(fd, &kbuf);
202 st->st_dev = kbuf.st_dev;
206 st->st_ino = kbuf.st_ino;
207 st->st_mode = kbuf.st_mode;
208 st->st_nlink = kbuf.st_nlink;
209 st->st_uid = kbuf.st_uid;
210 st->st_gid = kbuf.st_gid;
211 st->st_rdev = kbuf.st_rdev;
215 st->st_size = kbuf.st_size;
216 st->st_blksize = kbuf.st_blksize;
217 st->st_blocks = kbuf.st_blocks;
218 st->st_atime = kbuf.st_atime;
219 #ifdef _HAVE___UNUSED1
222 st->st_mtime = kbuf.st_mtime;
223 #ifdef _HAVE___UNUSED2
226 st->st_ctime = kbuf.st_ctime;
227 #ifdef _HAVE___UNUSED3
230 #ifdef _HAVE___UNUSED4
233 #ifdef _HAVE___UNUSED5
246 char *getcwd(char *buf, size_t size)
248 return smbw_getcwd(buf, size);
253 int __lxstat(int vers, const char *name, struct stat *st)
255 struct kernel_stat kbuf;
258 if (smbw_path(name)) {
259 return smbw_stat(name, st);
263 case _STAT_VER_LINUX_OLD:
264 /* Nothing to do. The struct is in the form the kernel expects
266 return real_lstat(name, (struct kernel_stat *)st);
269 case _STAT_VER_LINUX:
270 /* Do the system call. */
271 ret = real_lstat(name, &kbuf);
273 st->st_dev = kbuf.st_dev;
277 st->st_ino = kbuf.st_ino;
278 st->st_mode = kbuf.st_mode;
279 st->st_nlink = kbuf.st_nlink;
280 st->st_uid = kbuf.st_uid;
281 st->st_gid = kbuf.st_gid;
282 st->st_rdev = kbuf.st_rdev;
286 st->st_size = kbuf.st_size;
287 st->st_blksize = kbuf.st_blksize;
288 st->st_blocks = kbuf.st_blocks;
289 st->st_atime = kbuf.st_atime;
290 #ifdef _HAVE___UNUSED1
293 st->st_mtime = kbuf.st_mtime;
294 #ifdef _HAVE___UNUSED2
297 st->st_ctime = kbuf.st_ctime;
298 #ifdef _HAVE___UNUSED3
301 #ifdef _HAVE___UNUSED4
304 #ifdef _HAVE___UNUSED5
317 int mkdir(const char *name, mode_t mode)
319 if (smbw_path(name)) {
320 return smbw_mkdir(name, mode);
323 return real_mkdir(name, mode);
328 int __xstat(int vers, const char *name, struct stat *st)
330 struct kernel_stat kbuf;
333 if (smbw_path(name)) {
334 return smbw_stat(name, st);
338 case _STAT_VER_LINUX_OLD:
339 /* Nothing to do. The struct is in the form the kernel expects
341 return real_stat(name, (struct kernel_stat *)st);
344 case _STAT_VER_LINUX:
345 /* Do the system call. */
346 ret = real_stat(name, &kbuf);
348 st->st_dev = kbuf.st_dev;
352 st->st_ino = kbuf.st_ino;
353 st->st_mode = kbuf.st_mode;
354 st->st_nlink = kbuf.st_nlink;
355 st->st_uid = kbuf.st_uid;
356 st->st_gid = kbuf.st_gid;
357 st->st_rdev = kbuf.st_rdev;
361 st->st_size = kbuf.st_size;
362 st->st_blksize = kbuf.st_blksize;
363 st->st_blocks = kbuf.st_blocks;
364 st->st_atime = kbuf.st_atime;
365 #ifdef _HAVE___UNUSED1
368 st->st_mtime = kbuf.st_mtime;
369 #ifdef _HAVE___UNUSED2
372 st->st_ctime = kbuf.st_ctime;
373 #ifdef _HAVE___UNUSED3
376 #ifdef _HAVE___UNUSED4
379 #ifdef _HAVE___UNUSED5
391 int stat(const char *name, struct stat *st)
394 return __xstat(_STAT_VER, name, st);
396 if (smbw_path(name)) {
397 return smbw_stat(name, st);
399 return real_stat(name, st);
403 int lstat(const char *name, struct stat *st)
406 return __lxstat(_STAT_VER, name, st);
408 if (smbw_path(name)) {
409 return smbw_stat(name, st);
411 return real_lstat(name, st);
415 int fstat(int fd, struct stat *st)
418 return __fxstat(_STAT_VER, fd, st);
421 return smbw_fstat(fd, st);
423 return real_fstat(fd, st);
428 int unlink(const char *name)
430 if (smbw_path(name)) {
431 return smbw_unlink(name);
434 return real_unlink(name);
438 int utime(const char *name,void *tvp)
440 if (smbw_path(name)) {
441 return smbw_utime(name, tvp);
444 return real_utime(name, tvp);
447 int readlink(char *path, char *buf, size_t bufsize)
449 if (smbw_path(path)) {
450 return smbw_readlink(path, buf, bufsize);
453 return real_readlink(path, buf, bufsize);
457 int rename(const char *oldname,const char *newname)
460 p1 = smbw_path(oldname);
461 p2 = smbw_path(newname);
463 /* can't cross filesystem boundaries */
468 return smbw_rename(oldname, newname);
471 return real_rename(oldname, newname);
474 int rmdir(const char *name)
476 if (smbw_path(name)) {
477 return smbw_rmdir(name);
480 return real_rmdir(name);
484 int symlink(const char *topath,const char *frompath)
487 p1 = smbw_path(topath);
488 p2 = smbw_path(frompath);
490 /* can't handle symlinks */
495 return real_symlink(topath, frompath);
507 int dup2(int oldfd, int newfd)
509 if (smbw_fd(newfd)) {
513 if (smbw_fd(oldfd)) {
514 return smbw_dup2(oldfd, newfd);
517 return real_dup2(oldfd, newfd);
520 DIR *opendir(const char *name)
522 if (smbw_path(name)) {
523 return smbw_opendir(name);
526 return real_opendir(name);
530 struct dirent *readdir(DIR *dir)
532 if (smbw_dirp(dir)) {
533 return smbw_readdir(dir);
536 return real_readdir(dir);
539 int closedir(DIR *dir)
541 if (smbw_dirp(dir)) {
542 return smbw_closedir(dir);
545 return real_closedir(dir);
549 off_t telldir(DIR *dir)
551 if (smbw_dirp(dir)) {
552 return smbw_telldir(dir);
555 return real_telldir(dir);
560 void seekdir(DIR *dir, off_t offset)
562 if (smbw_dirp(dir)) {
563 smbw_seekdir(dir, offset);
567 real_seekdir(dir, offset);