Backup deleted files when using --delete and --backup. Based on a
[rsync/rsync.git] / syscall.c
... / ...
CommitLineData
1/*
2 Copyright (C) Andrew Tridgell 1998
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17*/
18
19/*
20 syscall wrappers to ensure that nothing gets done in dry_run mode
21 */
22
23#include "rsync.h"
24
25extern int dry_run;
26extern int read_only;
27
28#define CHECK_RO if (read_only) {errno = EROFS; return -1;}
29
30int do_unlink(char *fname)
31{
32 if (dry_run) return 0;
33 CHECK_RO
34 return unlink(fname);
35}
36
37int do_symlink(char *fname1, char *fname2)
38{
39 if (dry_run) return 0;
40 CHECK_RO
41 return symlink(fname1, fname2);
42}
43
44#if HAVE_LINK
45int do_link(char *fname1, char *fname2)
46{
47 if (dry_run) return 0;
48 CHECK_RO
49 return link(fname1, fname2);
50}
51#endif
52
53int do_lchown(const char *path, uid_t owner, gid_t group)
54{
55 if (dry_run) return 0;
56 CHECK_RO
57 return lchown(path, owner, group);
58}
59
60#if HAVE_MKNOD
61int do_mknod(char *pathname, mode_t mode, dev_t dev)
62{
63 if (dry_run) return 0;
64 CHECK_RO
65 return mknod(pathname, mode, dev);
66}
67#endif
68
69int do_rmdir(char *pathname)
70{
71 if (dry_run) return 0;
72 CHECK_RO
73 return rmdir(pathname);
74}
75
76int do_open(char *pathname, int flags, mode_t mode)
77{
78 if (dry_run) return -1;
79 CHECK_RO
80 return open(pathname, flags, mode);
81}
82
83#if HAVE_CHMOD
84int do_chmod(const char *path, mode_t mode)
85{
86 if (dry_run) return 0;
87 CHECK_RO
88 return chmod(path, mode);
89}
90#endif
91
92int do_rename(char *fname1, char *fname2)
93{
94 if (dry_run) return 0;
95 CHECK_RO
96 return rename(fname1, fname2);
97}
98
99int do_mkdir(char *fname, mode_t mode)
100{
101 if (dry_run) return 0;
102 CHECK_RO
103 return mkdir(fname, mode);
104}
105
106char *do_mktemp(char *template)
107{
108 if (dry_run) return NULL;
109 if (read_only) {errno = EROFS; return NULL;}
110 return mktemp(template);
111}
112
113int do_stat(const char *fname, STRUCT_STAT *st)
114{
115#if HAVE_OFF64_T
116 return stat64(fname, st);
117#else
118 return stat(fname, st);
119#endif
120}
121
122#if SUPPORT_LINKS
123int do_lstat(const char *fname, STRUCT_STAT *st)
124{
125#if HAVE_OFF64_T
126 return lstat64(fname, st);
127#else
128 return lstat(fname, st);
129#endif
130}
131#endif
132
133int do_fstat(int fd, STRUCT_STAT *st)
134{
135#if HAVE_OFF64_T
136 return fstat64(fd, st);
137#else
138 return fstat(fd, st);
139#endif
140}
141
142OFF_T do_lseek(int fd, OFF_T offset, int whence)
143{
144#if HAVE_OFF64_T
145 off64_t lseek64();
146 return lseek64(fd, offset, whence);
147#else
148 return lseek(fd, offset, whence);
149#endif
150}
151
152#ifdef USE_MMAP
153void *do_mmap(void *start, int len, int prot, int flags, int fd, OFF_T offset)
154{
155#if HAVE_OFF64_T
156 return mmap64(start, len, prot, flags, fd, offset);
157#else
158 return mmap(start, len, prot, flags, fd, offset);
159#endif
160}
161#endif
162
163char *d_name(struct dirent *di)
164{
165#if HAVE_BROKEN_READDIR
166 return (di->d_name - 2);
167#else
168 return di->d_name;
169#endif
170}