add a --ignore-errors option
[rsync/rsync.git] / rsync.h
... / ...
CommitLineData
1/*
2 Copyright (C) Andrew Tridgell 1996
3 Copyright (C) Paul Mackerras 1996
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20#define False 0
21#define True 1
22
23#define BLOCK_SIZE 700
24#define RSYNC_RSH_ENV "RSYNC_RSH"
25
26#define RSYNC_NAME "rsync"
27#define RSYNCD_CONF "/etc/rsyncd.conf"
28
29#define DEFAULT_LOCK_FILE "/var/run/rsyncd.lock"
30#define URL_PREFIX "rsync://"
31
32#define BACKUP_SUFFIX "~"
33
34/* a non-zero CHAR_OFFSET makes the rolling sum stronger, but is
35 incompatible with older versions :-( */
36#define CHAR_OFFSET 0
37
38
39#define FLAG_DELETE (1<<0)
40#define SAME_MODE (1<<1)
41#define SAME_RDEV (1<<2)
42#define SAME_UID (1<<3)
43#define SAME_GID (1<<4)
44#define SAME_DIR (1<<5)
45#define SAME_NAME SAME_DIR
46#define LONG_NAME (1<<6)
47#define SAME_TIME (1<<7)
48
49/* update this if you make incompatible changes */
50#define PROTOCOL_VERSION 24
51#define MIN_PROTOCOL_VERSION 15
52#define MAX_PROTOCOL_VERSION 30
53
54#define RSYNC_PORT 873
55
56#define SPARSE_WRITE_SIZE (1024)
57#define WRITE_SIZE (32*1024)
58#define CHUNK_SIZE (32*1024)
59#define MAX_MAP_SIZE (256*1024)
60#define IO_BUFFER_SIZE (4092)
61
62#define MAX_ARGS 1000
63
64#define MPLEX_BASE 7
65
66enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3};
67
68#include "errcode.h"
69
70#include "config.h"
71
72#if HAVE_REMSH
73#define RSYNC_RSH "remsh"
74#else
75#define RSYNC_RSH "rsh"
76#endif
77
78#include <sys/types.h>
79
80#ifdef HAVE_GETOPT_LONG
81#include <getopt.h>
82#else
83#include "lib/getopt.h"
84#endif
85
86#ifdef HAVE_UNISTD_H
87#include <unistd.h>
88#endif
89#include <stdio.h>
90#include <stddef.h>
91
92#ifdef HAVE_SYS_PARAM_H
93#include <sys/param.h>
94#endif
95
96#ifdef HAVE_STDLIB_H
97#include <stdlib.h>
98#endif
99
100#ifdef HAVE_SYS_SOCKET_H
101#include <sys/socket.h>
102#endif
103
104#ifdef HAVE_STRING_H
105#include <string.h>
106#endif
107
108#ifdef HAVE_MALLOC_H
109#include <malloc.h>
110#endif
111
112#ifdef TIME_WITH_SYS_TIME
113#include <sys/time.h>
114#include <time.h>
115#else
116#ifdef HAVE_SYS_TIME_H
117#include <sys/time.h>
118#else
119#include <time.h>
120#endif
121#endif
122
123#ifdef HAVE_FCNTL_H
124#include <fcntl.h>
125#else
126#ifdef HAVE_SYS_FCNTL_H
127#include <sys/fcntl.h>
128#endif
129#endif
130
131#include <sys/stat.h>
132
133#ifdef HAVE_SYS_IOCTL_H
134#include <sys/ioctl.h>
135#endif
136
137#ifdef HAVE_SYS_FILIO_H
138#include <sys/filio.h>
139#endif
140
141#include <signal.h>
142#ifdef HAVE_SYS_WAIT_H
143#include <sys/wait.h>
144#endif
145#ifdef HAVE_CTYPE_H
146#include <ctype.h>
147#endif
148#ifdef HAVE_GRP_H
149#include <grp.h>
150#endif
151#include <errno.h>
152
153#ifdef HAVE_UTIME_H
154#include <utime.h>
155#endif
156
157#ifdef HAVE_SYS_SELECT_H
158#include <sys/select.h>
159#endif
160
161#ifdef HAVE_SYS_MODE_H
162/* apparently AIX needs this for S_ISLNK */
163#ifndef S_ISLNK
164#include <sys/mode.h>
165#endif
166#endif
167
168#ifdef HAVE_FNMATCH
169#include <fnmatch.h>
170#else
171#include "lib/fnmatch.h"
172#endif
173
174#ifdef HAVE_GLOB_H
175#include <glob.h>
176#endif
177
178/* these are needed for the uid/gid mapping code */
179#include <pwd.h>
180#include <grp.h>
181
182#include <stdarg.h>
183#include <netinet/in.h>
184#include <arpa/inet.h>
185#include <netdb.h>
186#include <syslog.h>
187#include <sys/file.h>
188
189#if HAVE_DIRENT_H
190# include <dirent.h>
191#else
192# define dirent direct
193# if HAVE_SYS_NDIR_H
194# include <sys/ndir.h>
195# endif
196# if HAVE_SYS_DIR_H
197# include <sys/dir.h>
198# endif
199# if HAVE_NDIR_H
200# include <ndir.h>
201# endif
202#endif
203
204#ifdef HAVE_COMPAT_H
205#include <compat.h>
206#endif
207
208
209#define BOOL int
210
211#ifndef uchar
212#define uchar unsigned char
213#endif
214
215#if HAVE_UNSIGNED_CHAR
216#define schar signed char
217#else
218#define schar char
219#endif
220
221#ifndef int32
222#if (SIZEOF_INT == 4)
223#define int32 int
224#elif (SIZEOF_LONG == 4)
225#define int32 long
226#elif (SIZEOF_SHORT == 4)
227#define int32 short
228#else
229/* I hope this works */
230#define int32 int
231#define LARGE_INT32
232#endif
233#endif
234
235#ifndef uint32
236#define uint32 unsigned int32
237#endif
238
239#if HAVE_OFF64_T
240#define OFF_T off64_t
241#define STRUCT_STAT struct stat64
242#else
243#define OFF_T off_t
244#define STRUCT_STAT struct stat
245#endif
246
247#if HAVE_OFF64_T
248#define int64 off64_t
249#elif (SIZEOF_LONG == 8)
250#define int64 long
251#elif (SIZEOF_INT == 8)
252#define int64 int
253#elif HAVE_LONGLONG
254#define int64 long long
255#else
256#define int64 off_t
257#define NO_INT64
258#endif
259
260#if HAVE_SHORT_INO_T
261#define INO_T uint32
262#else
263#define INO_T ino_t
264#endif
265
266#ifndef MIN
267#define MIN(a,b) ((a)<(b)?(a):(b))
268#endif
269
270#ifndef MAX
271#define MAX(a,b) ((a)>(b)?(a):(b))
272#endif
273
274#ifndef MAXHOSTNAMELEN
275#define MAXHOSTNAMELEN 256
276#endif
277
278/* the length of the md4 checksum */
279#define MD4_SUM_LENGTH 16
280#define SUM_LENGTH 16
281
282#ifndef MAXPATHLEN
283#define MAXPATHLEN 1024
284#endif
285
286#ifndef INADDR_NONE
287#define INADDR_NONE 0xffffffff
288#endif
289
290struct file_struct {
291 unsigned flags;
292 time_t modtime;
293 OFF_T length;
294 mode_t mode;
295 INO_T inode;
296 dev_t dev;
297 dev_t rdev;
298 uid_t uid;
299 gid_t gid;
300 char *basename;
301 char *dirname;
302 char *basedir;
303 char *link;
304 char *sum;
305};
306
307
308struct file_list {
309 int count;
310 int malloced;
311 struct file_struct **files;
312};
313
314struct sum_buf {
315 OFF_T offset; /* offset in file of this chunk */
316 int len; /* length of chunk of file */
317 int i; /* index of this chunk */
318 uint32 sum1; /* simple checksum */
319 char sum2[SUM_LENGTH]; /* checksum */
320};
321
322struct sum_struct {
323 OFF_T flength; /* total file length */
324 int count; /* how many chunks */
325 int remainder; /* flength % block_length */
326 int n; /* block_length */
327 struct sum_buf *sums; /* points to info for each chunk */
328};
329
330struct map_struct {
331 char *p;
332 int fd,p_size,p_len;
333 OFF_T file_size, p_offset, p_fd_offset;
334};
335
336struct exclude_struct {
337 char *orig;
338 char *pattern;
339 int regular_exp;
340 int fnmatch_flags;
341 int include;
342 int directory;
343 int local;
344};
345
346struct stats {
347 int64 total_size;
348 int64 total_transferred_size;
349 int64 total_written;
350 int64 total_read;
351 int64 literal_data;
352 int64 matched_data;
353 int flist_size;
354 int num_files;
355 int num_transferred_files;
356};
357
358
359/* we need this function because of the silly way in which duplicate
360 entries are handled in the file lists - we can't change this
361 without breaking existing versions */
362static inline int flist_up(struct file_list *flist, int i)
363{
364 while (!flist->files[i]->basename) i++;
365 return i;
366}
367
368#include "byteorder.h"
369#include "version.h"
370#include "proto.h"
371#include "lib/mdfour.h"
372
373#if !HAVE_STRERROR
374extern char *sys_errlist[];
375#define strerror(i) sys_errlist[i]
376#endif
377
378#ifndef HAVE_STRCHR
379# define strchr index
380# define strrchr rindex
381#endif
382
383#ifndef HAVE_ERRNO_DECL
384extern int errno;
385#endif
386
387#define SUPPORT_LINKS HAVE_READLINK
388#define SUPPORT_HARD_LINKS HAVE_LINK
389
390#ifndef HAVE_LCHOWN
391#define lchown chown
392#endif
393
394#define SIGNAL_CAST (RETSIGTYPE (*)())
395
396#ifndef EWOULDBLOCK
397#define EWOULDBLOCK EAGAIN
398#endif
399
400#ifndef STDIN_FILENO
401#define STDIN_FILENO 0
402#endif
403
404#ifndef STDOUT_FILENO
405#define STDOUT_FILENO 1
406#endif
407
408#ifndef STDERR_FILENO
409#define STDERR_FILENO 2
410#endif
411
412#ifndef S_IWUSR
413#define S_IWUSR 0200
414#endif
415
416#ifndef _S_IFMT
417#define _S_IFMT 0170000
418#endif
419
420#ifndef _S_IFLNK
421#define _S_IFLNK 0120000
422#endif
423
424#ifndef S_ISLNK
425#define S_ISLNK(mode) (((mode) & (_S_IFMT)) == (_S_IFLNK))
426#endif
427
428#ifndef S_ISBLK
429#define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK))
430#endif
431
432#ifndef S_ISCHR
433#define S_ISCHR(mode) (((mode) & (_S_IFMT)) == (_S_IFCHR))
434#endif
435
436#ifndef S_ISSOCK
437#ifdef _S_IFSOCK
438#define S_ISSOCK(mode) (((mode) & (_S_IFMT)) == (_S_IFSOCK))
439#else
440#define S_ISSOCK(mode) (0)
441#endif
442#endif
443
444#ifndef S_ISFIFO
445#ifdef _S_IFIFO
446#define S_ISFIFO(mode) (((mode) & (_S_IFMT)) == (_S_IFIFO))
447#else
448#define S_ISFIFO(mode) (0)
449#endif
450#endif
451
452#ifndef S_ISDIR
453#define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
454#endif
455
456#ifndef S_ISREG
457#define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG))
458#endif
459
460
461#define IS_DEVICE(mode) (S_ISCHR(mode) || S_ISBLK(mode) || S_ISSOCK(mode) || S_ISFIFO(mode))
462
463#ifndef ACCESSPERMS
464#define ACCESSPERMS 0777
465#endif
466/* Initial mask on permissions given to temporary files. Mask off setuid
467 bits and group access because of potential race-condition security
468 holes, and mask other access because mode 707 is bizarre */
469#define INITACCESSPERMS 0700
470
471/* handler for null strings in printf format */
472#define NS(s) ((s)?(s):"<NULL>")
473
474/* use magic gcc attributes to catch format errors */
475 void rprintf(enum logcode , const char *, ...)
476#ifdef __GNUC__
477 __attribute__ ((format (printf, 2, 3)))
478#endif
479;
480
481#ifdef REPLACE_INET_NTOA
482#define inet_ntoa rep_inet_ntoa
483#endif
484
485
486#ifndef HAVE_STRLCPY
487size_t strlcpy(char *d, const char *s, size_t bufsize);
488#endif
489
490#ifndef HAVE_STRLCAT
491size_t strlcat(char *d, const char *s, size_t bufsize);
492#endif
493
494#define exit_cleanup(code) _exit_cleanup(code, __FILE__, __LINE__)