Initial import
[samba] / source / smbwrapper / wrapped.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB wrapper functions
4    Copyright (C) Andrew Tridgell 1998
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 /* NOTE: This file WILL produce compiler warnings. They are unavoidable 
22
23    Do not try and get rid of them by including other include files or
24    by including includes.h or proto.h or you will break portability. 
25   */
26
27 #include "config.h"
28 #include <sys/types.h>
29 #include <errno.h>
30 #include "realcalls.h"
31
32 #ifndef NULL
33 # define NULL ((void *)0)
34 #endif
35
36  int open(char *name, int flags, mode_t mode)
37 {
38         if (smbw_path(name)) {
39                 return smbw_open(name, flags, mode);
40         }
41
42         return real_open(name, flags, mode);
43 }
44
45 #ifdef HAVE__OPEN
46  int _open(char *name, int flags, mode_t mode) 
47 {
48         return open(name, flags, mode);
49 }
50 #elif HAVE___OPEN
51  int __open(char *name, int flags, mode_t mode) 
52 {
53         return open(name, flags, mode);
54 }
55 #endif
56
57
58 #ifdef HAVE_OPEN64
59  int open64(char *name, int flags, mode_t mode)
60 {
61         if (smbw_path(name)) {
62                 return smbw_open(name, flags, mode);
63         }
64
65         return real_open64(name, flags, mode);
66 }
67 #endif
68
69 #ifndef NO_OPEN64_ALIAS
70 #ifdef HAVE__OPEN64
71  int _open64(char *name, int flags, mode_t mode) 
72 {
73         return open64(name, flags, mode);
74 }
75 #elif HAVE___OPEN64
76  int __open64(char *name, int flags, mode_t mode) 
77 {
78         return open64(name, flags, mode);
79 }
80 #endif
81 #endif
82
83 #ifdef HAVE_PREAD
84  ssize_t pread(int fd, void *buf, size_t size, off_t ofs)
85 {
86         if (smbw_fd(fd)) {
87                 return smbw_pread(fd, buf, size, ofs);
88         }
89
90         return real_pread(fd, buf, size, ofs);
91 }
92 #endif
93
94 #if defined(HAVE_PREAD64) && defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT)
95  ssize_t pread64(int fd, void *buf, size_t size, off64_t ofs)
96 {
97         if (smbw_fd(fd)) {
98                 return smbw_pread(fd, buf, size, ofs);
99         }
100
101         return real_pread64(fd, buf, size, ofs);
102 }
103 #endif
104
105 #ifdef HAVE_PWRITE
106  ssize_t pwrite(int fd, void *buf, size_t size, off_t ofs)
107 {
108         if (smbw_fd(fd)) {
109                 return smbw_pwrite(fd, buf, size, ofs);
110         }
111
112         return real_pwrite(fd, buf, size, ofs);
113 }
114 #endif
115
116 #if defined(HAVE_PWRITE64) && defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT)
117  ssize_t pwrite64(int fd, void *buf, size_t size, off64_t ofs)
118 {
119         if (smbw_fd(fd)) {
120                 return smbw_pwrite(fd, buf, size, ofs);
121         }
122
123         return real_pwrite64(fd, buf, size, ofs);
124 }
125 #endif
126
127
128  int chdir(char *name)
129 {
130         return smbw_chdir(name);
131 }
132
133 #ifdef HAVE___CHDIR
134  int __chdir(char *name)
135 {
136         return chdir(name);
137 }
138 #elif HAVE__CHDIR
139  int _chdir(char *name)
140 {
141         return chdir(name);
142 }
143 #endif
144
145
146  int close(int fd)
147 {
148         if (smbw_fd(fd)) {
149                 return smbw_close(fd);
150         }
151         if (smbw_local_fd(fd)) {
152                 errno = EBADF;
153                 return -1;
154         }
155
156         return real_close(fd);
157 }
158
159 #ifdef HAVE___CLOSE
160  int __close(int fd)
161 {
162         return close(fd);
163 }
164 #elif HAVE__CLOSE
165  int _close(int fd)
166 {
167         return close(fd);
168 }
169 #endif
170
171
172  int fchdir(int fd)
173 {
174         return smbw_fchdir(fd);
175 }
176
177 #ifdef HAVE___FCHDIR
178  int __fchdir(int fd)
179 {
180         return fchdir(fd);
181 }
182 #elif HAVE__FCHDIR
183  int _fchdir(int fd)
184 {
185         return fchdir(fd);
186 }
187 #endif
188
189
190  int fcntl(int fd, int cmd, long arg)
191 {
192         if (smbw_fd(fd)) {
193                 return smbw_fcntl(fd, cmd, arg);
194         }
195
196         return real_fcntl(fd, cmd, arg);
197 }
198
199
200 #ifdef HAVE___FCNTL
201  int __fcntl(int fd, int cmd, long arg)
202 {
203         return fcntl(fd, cmd, arg);
204 }
205 #elif HAVE__FCNTL
206  int _fcntl(int fd, int cmd, long arg)
207 {
208         return fcntl(fd, cmd, arg);
209 }
210 #endif
211
212
213
214 #ifdef real_getdents
215  int getdents(int fd, void *dirp, unsigned int count)
216 {
217         if (smbw_fd(fd)) {
218                 return smbw_getdents(fd, dirp, count);
219         }
220
221         return real_getdents(fd, dirp, count);
222 }
223 #endif
224
225 #ifdef HAVE___GETDENTS
226  int __getdents(int fd, void *dirp, unsigned int count)
227 {
228         return getdents(fd, dirp, count);
229 }
230 #elif HAVE__GETDENTS
231  int _getdents(int fd, void *dirp, unsigned int count)
232 {
233         return getdents(fd, dirp, count);
234 }
235 #endif
236
237
238  off_t lseek(int fd, off_t offset, int whence)
239 {
240         if (smbw_fd(fd)) {
241                 return smbw_lseek(fd, offset, whence);
242         }
243
244         return real_lseek(fd, offset, whence);
245 }
246
247 #ifdef HAVE___LSEEK
248  off_t __lseek(int fd, off_t offset, int whence)
249 {
250         return lseek(fd, offset, whence);
251 }
252 #elif HAVE__LSEEK
253  off_t _lseek(int fd, off_t offset, int whence)
254 {
255         return lseek(fd, offset, whence);
256 }
257 #endif
258
259
260  ssize_t read(int fd, void *buf, size_t count)
261 {
262         if (smbw_fd(fd)) {
263                 return smbw_read(fd, buf, count);
264         }
265
266         return real_read(fd, buf, count);
267 }
268
269 #ifdef HAVE___READ
270  ssize_t __read(int fd, void *buf, size_t count)
271 {
272         return read(fd, buf, count);
273 }
274 #elif HAVE__READ
275  ssize_t _read(int fd, void *buf, size_t count)
276 {
277         return read(fd, buf, count);
278 }
279 #endif
280
281
282  ssize_t write(int fd, void *buf, size_t count)
283 {
284         if (smbw_fd(fd)) {
285                 return smbw_write(fd, buf, count);
286         }
287
288         return real_write(fd, buf, count);
289 }
290
291 #ifdef HAVE___WRITE
292  ssize_t __write(int fd, void *buf, size_t count)
293 {
294         return write(fd, buf, count);
295 }
296 #elif HAVE__WRITE
297  ssize_t _write(int fd, void *buf, size_t count)
298 {
299         return write(fd, buf, count);
300 }
301 #endif
302
303
304
305  int access(char *name, int mode)
306 {
307         if (smbw_path(name)) {
308                 return smbw_access(name, mode);
309         }
310
311         return real_access(name, mode);
312 }
313
314
315
316  int chmod(char *name,mode_t mode)
317 {
318         if (smbw_path(name)) {
319                 return smbw_chmod(name, mode);
320         }
321
322         return real_chmod(name, mode);
323 }
324
325
326
327  int chown(char *name,uid_t owner, gid_t group)
328 {
329         if (smbw_path(name)) {
330                 return smbw_chown(name, owner, group);
331         }
332
333         return real_chown(name, owner, group);
334 }
335
336
337  char *getcwd(char *buf, size_t size)
338 {
339         return (char *)smbw_getcwd(buf, size);
340 }
341
342
343
344
345  int mkdir(char *name, mode_t mode)
346 {
347         if (smbw_path(name)) {
348                 return smbw_mkdir(name, mode);
349         }
350
351         return real_mkdir(name, mode);
352 }
353
354
355 #if HAVE___FXSTAT
356  int __fxstat(int vers, int fd, void *st)
357 {
358         double xx[32];
359         int ret;
360
361         if (smbw_fd(fd)) {
362                 return smbw_fstat(fd, st);
363         }
364
365         ret = real_fstat(fd, xx);
366         xstat_convert(vers, st, xx);
367         return ret;
368 }
369 #endif
370
371 #if HAVE___XSTAT
372  int __xstat(int vers, char *name, void *st)
373 {
374         double xx[32];
375         int ret;
376
377         if (smbw_path(name)) {
378                 return smbw_stat(name, st);
379         }
380
381         ret = real_stat(name, xx);
382         xstat_convert(vers, st, xx);
383         return ret;
384 }
385 #endif
386
387
388 #if HAVE___LXSTAT
389  int __lxstat(int vers, char *name, void *st)
390 {
391         double xx[32];
392         int ret;
393
394         if (smbw_path(name)) {
395                 return smbw_stat(name, st);
396         }
397
398         ret = real_lstat(name, xx);
399         xstat_convert(vers, st, xx);
400         return ret;
401 }
402 #endif
403
404
405  int stat(char *name, void *st)
406 {
407 #if HAVE___XSTAT
408         return __xstat(0, name, st);
409 #else
410         if (smbw_path(name)) {
411                 return smbw_stat(name, st);
412         }
413         return real_stat(name, st);
414 #endif
415 }
416
417  int lstat(char *name, void *st)
418 {
419 #if HAVE___LXSTAT
420         return __lxstat(0, name, st);
421 #else
422         if (smbw_path(name)) {
423                 return smbw_stat(name, st);
424         }
425         return real_lstat(name, st);
426 #endif
427 }
428
429  int fstat(int fd, void *st)
430 {
431 #if HAVE___LXSTAT
432         return __fxstat(0, fd, st);
433 #else
434         if (smbw_fd(fd)) {
435                 return smbw_fstat(fd, st);
436         }
437         return real_fstat(fd, st);
438 #endif
439 }
440
441
442  int unlink(char *name)
443 {
444         if (smbw_path(name)) {
445                 return smbw_unlink(name);
446         }
447
448         return real_unlink(name);
449 }
450
451
452 #ifdef HAVE_UTIME
453  int utime(char *name,void *tvp)
454 {
455         if (smbw_path(name)) {
456                 return smbw_utime(name, tvp);
457         }
458
459         return real_utime(name, tvp);
460 }
461 #endif
462
463 #ifdef HAVE_UTIMES
464  int utimes(const char *name, const struct timeval *tvp)
465 {
466         if (smbw_path(name)) {
467                 return smbw_utimes(name, tvp);
468         }
469
470         return real_utimes(name, tvp);
471 }
472 #endif
473
474  int readlink(char *path, char *buf, size_t bufsize)
475 {
476         if (smbw_path(path)) {
477                 return smbw_readlink(path, buf, bufsize);
478         }
479
480         return real_readlink(path, buf, bufsize);
481 }
482
483
484  int rename(char *oldname,char *newname)
485 {
486         int p1, p2;
487         p1 = smbw_path(oldname); 
488         p2 = smbw_path(newname); 
489         if (p1 ^ p2) {
490                 /* can't cross filesystem boundaries */
491                 errno = EXDEV;
492                 return -1;
493         }
494         if (p1 && p2) {
495                 return smbw_rename(oldname, newname);
496         }
497
498         return real_rename(oldname, newname);
499 }
500
501  int rmdir(char *name)
502 {
503         if (smbw_path(name)) {
504                 return smbw_rmdir(name);
505         }
506
507         return real_rmdir(name);
508 }
509
510
511  int symlink(char *topath,char *frompath)
512 {
513         int p1, p2;
514         p1 = smbw_path(topath); 
515         p2 = smbw_path(frompath); 
516         if (p1 || p2) {
517                 /* can't handle symlinks */
518                 errno = EPERM;
519                 return -1;
520         }
521
522         return real_symlink(topath, frompath);
523 }
524
525  int dup(int fd)
526 {
527         if (smbw_fd(fd)) {
528                 return smbw_dup(fd);
529         }
530
531         return real_dup(fd);
532 }
533
534  int dup2(int oldfd, int newfd)
535 {
536         if (smbw_fd(newfd)) {
537                 close(newfd);
538         }
539
540         if (smbw_fd(oldfd)) {
541                 return smbw_dup2(oldfd, newfd);
542         }
543
544         return real_dup2(oldfd, newfd);
545 }
546
547 #ifdef real_opendir
548  void *opendir(char *name)
549 {
550         if (smbw_path(name)) {
551                 return (void *)smbw_opendir(name);
552         }
553
554         return (void *)real_opendir(name);
555 }
556 #endif
557
558 #ifdef real_readdir
559  void *readdir(void *dir)
560 {
561         if (smbw_dirp(dir)) {
562                 return (void *)smbw_readdir(dir);
563         }
564
565         return (void *)real_readdir(dir);
566 }
567 #endif
568
569 #ifdef real_closedir
570  int closedir(void *dir)
571 {
572         if (smbw_dirp(dir)) {
573                 return smbw_closedir(dir);
574         }
575
576         return real_closedir(dir);
577 }
578 #endif
579
580 #ifdef real_telldir
581  off_t telldir(void *dir)
582 {
583         if (smbw_dirp(dir)) {
584                 return smbw_telldir(dir);
585         }
586
587         return real_telldir(dir);
588 }
589 #endif
590
591 #ifdef real_seekdir
592  int seekdir(void *dir, off_t offset)
593 {
594         if (smbw_dirp(dir)) {
595                 smbw_seekdir(dir, offset);
596                 return 0;
597         }
598
599         real_seekdir(dir, offset);
600         return 0;
601 }
602 #endif
603
604
605 #ifndef NO_ACL_WRAPPER
606  int  acl(char  *pathp,  int  cmd,  int  nentries, void *aclbufp)
607 {
608         if (smbw_path(pathp)) {
609                 return smbw_acl(pathp, cmd, nentries, aclbufp);
610         }
611
612         return real_acl(pathp, cmd, nentries, aclbufp);
613 }
614 #endif
615
616 #ifndef NO_FACL_WRAPPER
617  int  facl(int fd,  int  cmd,  int  nentries, void *aclbufp)
618 {
619         if (smbw_fd(fd)) {
620                 return smbw_facl(fd, cmd, nentries, aclbufp);
621         }
622
623         return real_facl(fd, cmd, nentries, aclbufp);
624 }
625 #endif
626
627  int creat(char *path, mode_t mode)
628 {
629         extern int creat_bits;
630         return open(path, creat_bits, mode);
631 }
632
633 #ifdef HAVE_CREAT64
634  int creat64(char *path, mode_t mode)
635 {
636         extern int creat_bits;
637         return open64(path, creat_bits, mode);
638 }
639 #endif
640
641 #ifdef HAVE_STAT64
642   int stat64(char *name, void *st64)
643 {
644         if (smbw_path(name)) {
645                 double xx[32];
646                 int ret = stat(name, xx);
647                 stat64_convert(xx, st64);
648                 return ret;
649         }
650         return real_stat64(name, st64);
651 }
652
653   int fstat64(int fd, void *st64)
654 {
655         if (smbw_fd(fd)) {
656                 double xx[32];
657                 int ret = fstat(fd, xx);
658                 stat64_convert(xx, st64);
659                 return ret;
660         }
661         return real_fstat64(fd, st64);
662 }
663
664   int lstat64(char *name, void *st64)
665 {
666         if (smbw_path(name)) {
667                 double xx[32];
668                 int ret = lstat(name, xx);
669                 stat64_convert(xx, st64);
670                 return ret;
671         }
672         return real_lstat64(name, st64);
673 }
674 #endif
675
676 #ifdef HAVE_LLSEEK
677   offset_t llseek(int fd, offset_t ofs, int whence)
678 {
679         if (smbw_fd(fd)) {
680                 return lseek(fd, ofs, whence);
681         }
682         return real_llseek(fd, ofs, whence);
683 }
684 #endif
685
686 #ifdef HAVE_READDIR64
687  void *readdir64(void *dir)
688 {
689         if (smbw_dirp(dir)) {
690                 static double xx[70];
691                 void *d;
692                 d = (void *)readdir(dir);
693                 if (!d) return NULL;
694                 dirent64_convert(d, xx);
695                 return xx;
696         }
697         return (void *)real_readdir64(dir);
698 }
699 #endif
700
701  int fork(void)
702 {
703         return smbw_fork();
704 }
705