Tweaked ITEM_MISSING_DATA.
[rsync/rsync.git] / rsync.h
1 /*
2    Copyright (C) by Andrew Tridgell 1996, 2000
3    Copyright (C) Paul Mackerras 1996
4    Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
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
22 #define False 0
23 #define True 1
24
25 #define BLOCK_SIZE 700
26 #define RSYNC_RSH_ENV "RSYNC_RSH"
27 #define RSYNC_RSH_IO_ENV "RSYNC_RSH_IO"
28
29 #define RSYNC_NAME "rsync"
30 /* RSYNCD_SYSCONF is now set in config.h */
31 #define RSYNCD_USERCONF "rsyncd.conf"
32
33 #define DEFAULT_LOCK_FILE "/var/run/rsyncd.lock"
34 #define URL_PREFIX "rsync://"
35
36 #define BACKUP_SUFFIX "~"
37
38 /* a non-zero CHAR_OFFSET makes the rolling sum stronger, but is
39    incompatible with older versions :-( */
40 #define CHAR_OFFSET 0
41
42 /* These flags are only used during the flist transfer. */
43
44 #define XMIT_TOP_DIR (1<<0)
45 #define XMIT_SAME_MODE (1<<1)
46 #define XMIT_EXTENDED_FLAGS (1<<2)
47 #define XMIT_SAME_RDEV_pre28 XMIT_EXTENDED_FLAGS /* Only in protocols < 28 */
48 #define XMIT_SAME_UID (1<<3)
49 #define XMIT_SAME_GID (1<<4)
50 #define XMIT_SAME_NAME (1<<5)
51 #define XMIT_LONG_NAME (1<<6)
52 #define XMIT_SAME_TIME (1<<7)
53 #define XMIT_SAME_RDEV_MAJOR (1<<8)
54 #define XMIT_HAS_IDEV_DATA (1<<9)
55 #define XMIT_SAME_DEV (1<<10)
56 #define XMIT_RDEV_MINOR_IS_SMALL (1<<11)
57
58 /* These flags are used in the live flist data. */
59
60 #define FLAG_TOP_DIR (1<<0)
61 #define FLAG_HLINK_EOL (1<<1)   /* generator only */
62 #define FLAG_MOUNT_POINT (1<<2) /* sender only */
63 #define FLAG_NO_FUZZY (1<<2)    /* generator only */
64 #define FLAG_DEL_HERE (1<<3)    /* receiver/generator */
65 #define FLAG_SENT (1<<3)        /* sender only */
66
67 /* update this if you make incompatible changes */
68 #define PROTOCOL_VERSION 29
69
70 /* We refuse to interoperate with versions that are not in this range.
71  * Note that we assume we'll work with later versions: the onus is on
72  * people writing them to make sure that they don't send us anything
73  * we won't understand.
74  *
75  * Interoperation with old but supported protocol versions
76  * should cause a warning to be printed.  At a future date
77  * the old protocol will become the minimum and
78  * compatibility code removed.
79  *
80  * There are two possible explanations for the limit at
81  * MAX_PROTOCOL_VERSION: either to allow new major-rev versions that
82  * do not interoperate with us, and (more likely) so that we can
83  * detect an attempt to connect rsync to a non-rsync server, which is
84  * unlikely to begin by sending a byte between MIN_PROTOCL_VERSION and
85  * MAX_PROTOCOL_VERSION. */
86
87 #define MIN_PROTOCOL_VERSION 20
88 #define OLD_PROTOCOL_VERSION 25
89 #define MAX_PROTOCOL_VERSION 40
90
91 #define RSYNC_PORT 873
92
93 #define SPARSE_WRITE_SIZE (1024)
94 #define WRITE_SIZE (32*1024)
95 #define CHUNK_SIZE (32*1024)
96 #define MAX_MAP_SIZE (256*1024)
97 #define IO_BUFFER_SIZE (4092)
98 #define MAX_BLOCK_SIZE ((int32)1 << 29)
99
100 #define IOERR_GENERAL   (1<<0) /* For backward compatibility, this must == 1 */
101 #define IOERR_VANISHED  (1<<1)
102
103 #define MAX_ARGS 1000
104
105 #define MAX_BASIS_DIRS 20
106
107 #define MPLEX_BASE 7
108
109 #define NO_FILTERS      0
110 #define SERVER_FILTERS  1
111 #define ALL_FILTERS     2
112
113 #define XFLG_FATAL_ERRORS       (1<<0)
114 #define XFLG_OLD_PREFIXES       (1<<1)
115 #define XFLG_ANCHORED2ABS       (1<<2)
116
117 #define PERMS_REPORT            (1<<0)
118 #define PERMS_SKIP_MTIME        (1<<1)
119
120 #define FULL_FLUSH      1
121 #define NORMAL_FLUSH    0
122
123 #define PDIR_CREATE     1
124 #define PDIR_DELETE     0
125
126 /* Note: 0x00 - 0x7F are used for basis_dir[] indexes! */
127 #define FNAMECMP_BASIS_DIR_LOW  0x00 /* Must remain 0! */
128 #define FNAMECMP_BASIS_DIR_HIGH 0x7F
129 #define FNAMECMP_FNAME          0x80
130 #define FNAMECMP_PARTIAL_DIR    0x81
131 #define FNAMECMP_BACKUP         0x82
132 #define FNAMECMP_FUZZY          0x83
133
134 /* For calling delete_file() */
135 #define DEL_DIR                 (1<<0)
136 #define DEL_NO_RECURSE          (1<<1)
137 #define DEL_FORCE_RECURSE       (1<<2) /* recurse even w/o --force */
138 #define DEL_TERSE               (1<<3)
139
140 /* For use by the itemize_changes code */
141 #define ITEM_UPDATING (1<<0)
142 #define ITEM_REPORT_CHECKSUM (1<<1)
143 #define ITEM_REPORT_SIZE (1<<2)
144 #define ITEM_REPORT_TIME (1<<3)
145 #define ITEM_REPORT_PERMS (1<<4)
146 #define ITEM_REPORT_OWNER (1<<5)
147 #define ITEM_REPORT_GROUP (1<<6)
148 #define ITEM_IS_NEW (1<<7)
149
150 #define ITEM_MISSING_DATA (1<<16) /* this is outside the transmitted flags */
151
152 /* Log-message categories.  FLOG is only used on the daemon side to
153  * output messages to the log file. */
154 enum logcode { FERROR=1, FINFO=2, FLOG=3 };
155
156 /* Messages types that are sent over the message channel.  The logcode
157  * values must all be present here with identical numbers. */
158 enum msgcode {
159         MSG_SUCCESS=6,  /* successfully updated indicated flist index */
160         MSG_DONE=5,     /* current phase is done */
161         MSG_REDO=4,     /* reprocess indicated flist index */
162         MSG_ERROR=FERROR, MSG_INFO=FINFO, MSG_LOG=FLOG, /* remote logging */
163         MSG_DATA=0      /* raw data on the multiplexed stream */
164 };
165
166 #include "errcode.h"
167
168 #include "config.h"
169
170 /* The default RSYNC_RSH is always set in config.h. */
171
172 #include <stdio.h>
173 #ifdef HAVE_SYS_TYPES_H
174 # include <sys/types.h>
175 #endif
176 #ifdef HAVE_SYS_STAT_H
177 # include <sys/stat.h>
178 #endif
179 #ifdef STDC_HEADERS
180 # include <stdlib.h>
181 # include <stddef.h>
182 #else
183 # ifdef HAVE_STDLIB_H
184 #  include <stdlib.h>
185 # endif
186 #endif
187 #ifdef HAVE_STRING_H
188 # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
189 #  include <memory.h>
190 # endif
191 # include <string.h>
192 #endif
193 #ifdef HAVE_STRINGS_H
194 # include <strings.h>
195 #endif
196 #ifdef HAVE_UNISTD_H
197 # include <unistd.h>
198 #endif
199
200 #ifdef HAVE_SYS_PARAM_H
201 #include <sys/param.h>
202 #endif
203
204 #if defined HAVE_MALLOC_H && (defined HAVE_MALLINFO || !defined HAVE_STDLIB_H)
205 #include <malloc.h>
206 #endif
207
208 #ifdef HAVE_SYS_SOCKET_H
209 #include <sys/socket.h>
210 #endif
211
212 #ifdef TIME_WITH_SYS_TIME
213 #include <sys/time.h>
214 #include <time.h>
215 #else
216 #ifdef HAVE_SYS_TIME_H
217 #include <sys/time.h>
218 #else
219 #include <time.h>
220 #endif
221 #endif
222
223 #ifdef HAVE_FCNTL_H
224 #include <fcntl.h>
225 #else
226 #ifdef HAVE_SYS_FCNTL_H
227 #include <sys/fcntl.h>
228 #endif
229 #endif
230
231 #ifdef HAVE_SYS_IOCTL_H
232 #include <sys/ioctl.h>
233 #endif
234
235 #ifdef HAVE_SYS_FILIO_H
236 #include <sys/filio.h>
237 #endif
238
239 #include <signal.h>
240 #ifdef HAVE_SYS_WAIT_H
241 #include <sys/wait.h>
242 #endif
243 #ifdef HAVE_CTYPE_H
244 #include <ctype.h>
245 #endif
246 #ifdef HAVE_GRP_H
247 #include <grp.h>
248 #endif
249 #include <errno.h>
250
251 #ifdef HAVE_UTIME_H
252 #include <utime.h>
253 #endif
254
255 #ifdef HAVE_SYS_SELECT_H
256 #include <sys/select.h>
257 #endif
258
259 #ifdef HAVE_SYS_MODE_H
260 /* apparently AIX needs this for S_ISLNK */
261 #ifndef S_ISLNK
262 #include <sys/mode.h>
263 #endif
264 #endif
265
266 #ifdef HAVE_GLOB_H
267 #include <glob.h>
268 #endif
269
270 /* these are needed for the uid/gid mapping code */
271 #include <pwd.h>
272 #include <grp.h>
273
274 #include <stdarg.h>
275 #include <netinet/in.h>
276 #include <arpa/inet.h>
277 #include <netdb.h>
278 #include <syslog.h>
279 #include <sys/file.h>
280
281 #ifdef HAVE_DIRENT_H
282 # include <dirent.h>
283 #else
284 # define dirent direct
285 # ifdef HAVE_SYS_NDIR_H
286 #  include <sys/ndir.h>
287 # endif
288 # ifdef HAVE_SYS_DIR_H
289 #  include <sys/dir.h>
290 # endif
291 # ifdef HAVE_NDIR_H
292 #  include <ndir.h>
293 # endif
294 #endif
295
296 #ifdef MAJOR_IN_MKDEV
297 #include <sys/mkdev.h>
298 # if !defined makedev && defined mkdev
299 #  define makedev mkdev
300 # endif
301 #elif defined MAJOR_IN_SYSMACROS
302 #include <sys/sysmacros.h>
303 #endif
304
305 #ifdef HAVE_COMPAT_H
306 #include <compat.h>
307 #endif
308
309 #include <assert.h>
310
311 #include "lib/pool_alloc.h"
312
313 #define BOOL int
314
315 #ifndef uchar
316 #define uchar unsigned char
317 #endif
318
319 #ifdef SIGNED_CHAR_OK
320 #define schar signed char
321 #else
322 #define schar char
323 #endif
324
325 /* Find a variable that is either exactly 32-bits or longer.
326  * If some code depends on 32-bit truncation, it will need to
327  * take special action in a "#if SIZEOF_INT32 > 4" section. */
328 #ifndef int32
329 #if SIZEOF_INT == 4
330 # define int32 int
331 # define SIZEOF_INT32 4
332 #elif SIZEOF_LONG == 4
333 # define int32 long
334 # define SIZEOF_INT32 4
335 #elif SIZEOF_SHORT == 4
336 # define int32 short
337 # define SIZEOF_INT32 4
338 #elif SIZEOF_INT > 4
339 # define int32 int
340 # define SIZEOF_INT32 SIZEOF_INT
341 #elif SIZEOF_LONG > 4
342 # define int32 long
343 # define SIZEOF_INT32 SIZEOF_LONG
344 #else
345 # error Could not find a 32-bit integer variable
346 #endif
347 #else
348 # define SIZEOF_INT32 4
349 #endif
350
351 #ifndef uint32
352 #define uint32 unsigned int32
353 #endif
354
355 #if SIZEOF_OFF_T == 8 || !SIZEOF_OFF64_T || !defined HAVE_STRUCT_STAT64
356 #define OFF_T off_t
357 #define STRUCT_STAT struct stat
358 #else
359 #define OFF_T off64_t
360 #define STRUCT_STAT struct stat64
361 #define USE_STAT64_FUNCS 1
362 #endif
363
364 /* CAVEAT: on some systems, int64 will really be a 32-bit integer IFF
365  * that's the maximum size the file system can handle and there is no
366  * 64-bit type available.  The rsync source must therefore take steps
367  * to ensure that any code that really requires a 64-bit integer has
368  * it (e.g. the checksum code uses two 32-bit integers for its 64-bit
369  * counter). */
370 #if SIZEOF_OFF64_T == 8
371 # define int64 off64_t
372 # define SIZEOF_INT64 8
373 #elif SIZEOF_LONG == 8
374 # define int64 long
375 # define SIZEOF_INT64 8
376 #elif SIZEOF_INT == 8
377 # define int64 int
378 # define SIZEOF_INT64 8
379 #elif SIZEOF_LONG_LONG == 8
380 # define int64 long long
381 # define SIZEOF_INT64 8
382 #elif SIZEOF_OFF_T == 8
383 # define int64 off_t
384 # define SIZEOF_INT64 8
385 #elif SIZEOF_INT > 8
386 # define int64 int
387 # define SIZEOF_INT64 SIZEOF_INT
388 #elif SIZEOF_LONG > 8
389 # define int64 long
390 # define SIZEOF_INT64 SIZEOF_LONG
391 #elif SIZEOF_LONG_LONG > 8
392 # define int64 long long
393 # define SIZEOF_INT64 SIZEOF_LONG_LONG
394 #else
395 /* As long as it gets... */
396 # define int64 off_t
397 # define SIZEOF_INT64 SIZEOF_OFF_T
398 #endif
399
400 /* Starting from protocol version 26, we always use 64-bit
401  * ino_t and dev_t internally, even if this platform does not
402  * allow files to have 64-bit inums.  That's because the
403  * receiver needs to find duplicate (dev,ino) tuples to detect
404  * hardlinks, and it might have files coming from a platform
405  * that has 64-bit inums.
406  *
407  * The only exception is if we're on a platform with no 64-bit type at
408  * all.
409  *
410  * Because we use read_longint() to get these off the wire, if you
411  * transfer devices or hardlinks with dev or inum > 2**32 to a machine
412  * with no 64-bit types then you will get an overflow error.  Probably
413  * not many people have that combination of machines, and you can
414  * avoid it by not preserving hardlinks or not transferring device
415  * nodes.  It's not clear that any other behaviour is better.
416  *
417  * Note that if you transfer devices from a 64-bit-devt machine (say,
418  * Solaris) to a 32-bit-devt machine (say, Linux-2.2/x86) then the
419  * device numbers will be truncated.  But it's a kind of silly thing
420  * to do anyhow.
421  *
422  * FIXME: I don't think the code in flist.c has ever worked on a system
423  * where dev_t is a struct.
424  */
425
426 struct idev {
427         int64 inode;
428         int64 dev;
429 };
430
431 #ifndef MIN
432 #define MIN(a,b) ((a)<(b)?(a):(b))
433 #endif
434
435 #ifndef MAX
436 #define MAX(a,b) ((a)>(b)?(a):(b))
437 #endif
438
439 #ifndef MAXHOSTNAMELEN
440 #define MAXHOSTNAMELEN 256
441 #endif
442
443 /* the length of the md4 checksum */
444 #define MD4_SUM_LENGTH 16
445 #define SUM_LENGTH 16
446 #define SHORT_SUM_LENGTH 2
447 #define BLOCKSUM_BIAS 10
448
449 #ifndef MAXPATHLEN
450 #define MAXPATHLEN 1024
451 #endif
452
453 #ifndef NAME_MAX
454 #define NAME_MAX 255
455 #endif
456
457 #ifndef INADDR_NONE
458 #define INADDR_NONE 0xffffffff
459 #endif
460
461 #ifndef IN_LOOPBACKNET
462 #define IN_LOOPBACKNET 127
463 #endif
464
465 #define GID_NONE ((gid_t)-1)
466
467 #define HL_CHECK_MASTER 0
468 #define HL_SKIP         1
469
470 struct hlink {
471         struct file_struct *next;
472         int hlindex;
473 };
474
475 #define F_DEV   link_u.idev->dev
476 #define F_INODE link_u.idev->inode
477
478 #define F_HLINDEX link_u.links->hlindex
479 #define F_NEXT  link_u.links->next
480
481 struct file_struct {
482         union {
483                 dev_t rdev;     /* The device number, if this is a device */
484                 char *sum;      /* Only a normal file can have a checksum */
485                 char *link;     /* Points to symlink string, if a symlink */
486         } u;
487         OFF_T length;
488         char *basename;         /* The current item's name (AKA filename) */
489         char *dirname;          /* The directory info inside the transfer */
490         union {
491                 char *root;     /* Sender-side dir info outside transfer */
492                 int depth;      /* Receiver-side directory depth info */
493         } dir;
494         union {
495                 struct idev *idev;
496                 struct hlink *links;
497         } link_u;
498         time_t modtime;
499         uid_t uid;
500         gid_t gid;
501         mode_t mode;
502         uchar flags;    /* this item MUST remain last */
503 };
504
505 /*
506  * Start the flist array at FLIST_START entries and grow it
507  * by doubling until FLIST_LINEAR then grow by FLIST_LINEAR
508  */
509 #define FLIST_START     (32 * 1024)
510 #define FLIST_LINEAR    (FLIST_START * 512)
511
512 /*
513  * Extent size for allocation pools A minimum size of 128KB
514  * is needed to mmap them so that freeing will release the
515  * space to the OS.
516  *
517  * Larger sizes reduce leftover fragments and speed free calls
518  * (when they happen) Smaller sizes increase the chance of
519  * freed allocations freeing whole extents.
520  */
521 #define FILE_EXTENT     (256 * 1024)
522 #define HLINK_EXTENT    (128 * 1024)
523
524 #define WITH_HLINK      1
525 #define WITHOUT_HLINK   0
526
527 struct file_list {
528         struct file_struct **files;
529         alloc_pool_t file_pool;
530         alloc_pool_t hlink_pool;
531         int count;
532         int malloced;
533         int low, high;
534 };
535
536 #define SUMFLG_SAME_OFFSET      (1<<0)
537
538 struct sum_buf {
539         OFF_T offset;           /**< offset in file of this chunk */
540         int32 len;              /**< length of chunk of file */
541         uint32 sum1;            /**< simple checksum */
542         short flags;            /**< flag bits */
543         char sum2[SUM_LENGTH];  /**< checksum  */
544 };
545
546 struct sum_struct {
547         OFF_T flength;          /**< total file length */
548         struct sum_buf *sums;   /**< points to info for each chunk */
549         int32 count;            /**< how many chunks */
550         int32 blength;          /**< block_length */
551         int32 remainder;        /**< flength % block_length */
552         int s2length;           /**< sum2_length */
553 };
554
555 struct map_struct {
556         OFF_T file_size;        /* File size (from stat)                */
557         OFF_T p_offset;         /* Window start                         */
558         OFF_T p_fd_offset;      /* offset of cursor in fd ala lseek     */
559         char *p;                /* Window pointer                       */
560         int32 p_size;           /* Largest window size we allocated     */
561         int32 p_len;            /* Latest (rounded) window size         */
562         int32 def_window_size;  /* Default window size                  */
563         int fd;                 /* File Descriptor                      */
564         int status;             /* first errno from read errors         */
565 };
566
567 #define MATCHFLG_WILD           (1<<0) /* pattern has '*', '[', and/or '?' */
568 #define MATCHFLG_WILD2          (1<<1) /* pattern has '**' */
569 #define MATCHFLG_WILD2_PREFIX   (1<<2) /* pattern starts with '**' */
570 #define MATCHFLG_ABS_PATH       (1<<3) /* path-match on absolute path */
571 #define MATCHFLG_INCLUDE        (1<<4) /* this is an include, not an exclude */
572 #define MATCHFLG_DIRECTORY      (1<<5) /* this matches only directories */
573 #define MATCHFLG_CLEAR_LIST     (1<<6) /* this item is the "!" token */
574 #define MATCHFLG_WORD_SPLIT     (1<<7) /* split rules on whitespace */
575 #define MATCHFLG_NO_INHERIT     (1<<8) /* don't inherit these rules */
576 #define MATCHFLG_NO_PREFIXES    (1<<9) /* parse no prefixes from patterns */
577 #define MATCHFLG_MERGE_FILE     (1<<10)/* specifies a file to merge */
578 #define MATCHFLG_PERDIR_MERGE   (1<<11)/* merge-file is searched per-dir */
579 #define MATCHFLG_EXCLUDE_SELF   (1<<12)/* merge-file name should be excluded */
580 #define MATCHFLG_FINISH_SETUP   (1<<13)/* per-dir merge file needs setup */
581 #define MATCHFLG_NEGATE         (1<<14)/* rule matches when pattern does not */
582 #define MATCHFLG_CVS_IGNORE     (1<<15)/* rule was -C or :C */
583 #define MATCHFLG_SENDER_SIDE    (1<<16)/* rule applies to the sending side */
584 #define MATCHFLG_RECEIVER_SIDE  (1<<17)/* rule applies to the receiving side */
585
586 #define MATCHFLGS_FROM_CONTAINER (MATCHFLG_ABS_PATH | MATCHFLG_INCLUDE \
587                                 | MATCHFLG_DIRECTORY | MATCHFLG_SENDER_SIDE \
588                                 | MATCHFLG_NEGATE | MATCHFLG_RECEIVER_SIDE)
589
590 struct filter_struct {
591         struct filter_struct *next;
592         char *pattern;
593         uint32 match_flags;
594         union {
595                 int slash_cnt;
596                 struct filter_list_struct *mergelist;
597         } u;
598 };
599
600 struct filter_list_struct {
601         struct filter_struct *head;
602         struct filter_struct *tail;
603         char *debug_type;
604 };
605
606 struct stats {
607         int64 total_size;
608         int64 total_transferred_size;
609         int64 total_written;
610         int64 total_read;
611         int64 literal_data;
612         int64 matched_data;
613         int64 flist_buildtime;
614         int64 flist_xfertime;
615         int flist_size;
616         int num_files;
617         int num_transferred_files;
618         int current_file_index;
619 };
620
621
622 #include "byteorder.h"
623 #include "lib/mdfour.h"
624 #include "lib/wildmatch.h"
625 #include "lib/permstring.h"
626 #include "lib/addrinfo.h"
627
628 #include "proto.h"
629
630 /* We have replacement versions of these if they're missing. */
631 #ifndef HAVE_ASPRINTF
632 int asprintf(char **ptr, const char *format, ...);
633 #endif
634
635 #ifndef HAVE_VASPRINTF
636 int vasprintf(char **ptr, const char *format, va_list ap);
637 #endif
638
639 #if !defined HAVE_VSNPRINTF || !defined HAVE_C99_VSNPRINTF
640 #define vsnprintf rsync_vsnprintf
641 int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
642 #endif
643
644 #if !defined HAVE_SNPRINTF || !defined HAVE_C99_VSNPRINTF
645 #define snprintf rsync_snprintf
646 int snprintf(char *str,size_t count,const char *fmt,...);
647 #endif
648
649
650 #ifndef HAVE_STRERROR
651 extern char *sys_errlist[];
652 #define strerror(i) sys_errlist[i]
653 #endif
654
655 #ifndef HAVE_STRCHR
656 # define strchr                 index
657 # define strrchr                rindex
658 #endif
659
660 #ifndef HAVE_ERRNO_DECL
661 extern int errno;
662 #endif
663
664 #define SUPPORT_LINKS HAVE_READLINK
665 #define SUPPORT_HARD_LINKS HAVE_LINK
666
667 #define SIGNAL_CAST (RETSIGTYPE (*)())
668
669 #ifndef EWOULDBLOCK
670 #define EWOULDBLOCK EAGAIN
671 #endif
672
673 #ifndef STDIN_FILENO
674 #define STDIN_FILENO 0
675 #endif
676
677 #ifndef STDOUT_FILENO
678 #define STDOUT_FILENO 1
679 #endif
680
681 #ifndef STDERR_FILENO
682 #define STDERR_FILENO 2
683 #endif
684
685 #ifndef S_IRUSR
686 #define S_IRUSR 0400
687 #endif
688
689 #ifndef S_IWUSR
690 #define S_IWUSR 0200
691 #endif
692
693 #ifndef ACCESSPERMS
694 #define ACCESSPERMS 0777
695 #endif
696
697 #ifndef S_ISVTX
698 #define S_ISVTX 0
699 #endif
700
701 #define CHMOD_BITS (S_ISUID | S_ISGID | S_ISVTX | ACCESSPERMS)
702
703 #ifndef _S_IFMT
704 #define _S_IFMT        0170000
705 #endif
706
707 #ifndef _S_IFLNK
708 #define _S_IFLNK  0120000
709 #endif
710
711 #ifndef S_ISLNK
712 #define S_ISLNK(mode) (((mode) & (_S_IFMT)) == (_S_IFLNK))
713 #endif
714
715 #ifndef S_ISBLK
716 #define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK))
717 #endif
718
719 #ifndef S_ISCHR
720 #define S_ISCHR(mode) (((mode) & (_S_IFMT)) == (_S_IFCHR))
721 #endif
722
723 #ifndef S_ISSOCK
724 #ifdef _S_IFSOCK
725 #define S_ISSOCK(mode) (((mode) & (_S_IFMT)) == (_S_IFSOCK))
726 #else
727 #define S_ISSOCK(mode) (0)
728 #endif
729 #endif
730
731 #ifndef S_ISFIFO
732 #ifdef _S_IFIFO
733 #define S_ISFIFO(mode) (((mode) & (_S_IFMT)) == (_S_IFIFO))
734 #else
735 #define S_ISFIFO(mode) (0)
736 #endif
737 #endif
738
739 #ifndef S_ISDIR
740 #define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
741 #endif
742
743 #ifndef S_ISREG
744 #define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG))
745 #endif
746
747 /* work out what fcntl flag to use for non-blocking */
748 #ifdef O_NONBLOCK
749 # define NONBLOCK_FLAG O_NONBLOCK
750 #elif defined SYSV
751 # define NONBLOCK_FLAG O_NDELAY
752 #else
753 # define NONBLOCK_FLAG FNDELAY
754 #endif
755
756 #ifndef INADDR_LOOPBACK
757 #define INADDR_LOOPBACK 0x7f000001
758 #endif
759
760 #ifndef INADDR_NONE
761 #define INADDR_NONE 0xffffffff
762 #endif
763
764 #define IS_DEVICE(mode) (S_ISCHR(mode) || S_ISBLK(mode) || S_ISSOCK(mode) || S_ISFIFO(mode))
765
766 /* Initial mask on permissions given to temporary files.  Mask off setuid
767      bits and group access because of potential race-condition security
768      holes, and mask other access because mode 707 is bizarre */
769 #define INITACCESSPERMS 0700
770
771 /* handler for null strings in printf format */
772 #define NS(s) ((s)?safe_fname(s):"<NULL>")
773
774 #if !defined __GNUC__ || defined __APPLE__
775 /* Apparently the OS X port of gcc gags on __attribute__.
776  *
777  * <http://www.opensource.apple.com/bugs/X/gcc/2512150.html> */
778 #define __attribute__(x)
779
780 #endif
781
782 /* Convenient wrappers for malloc and realloc.  Use them. */
783 #define new(type) ((type *)malloc(sizeof(type)))
784 #define new_array(type, num) ((type *)_new_array(sizeof(type), (num)))
785 #define realloc_array(ptr, type, num) ((type *)_realloc_array((ptr), sizeof(type), (num)))
786
787 /* use magic gcc attributes to catch format errors */
788  void rprintf(enum logcode , const char *, ...)
789      __attribute__((format (printf, 2, 3)))
790 ;
791
792 /* This is just like rprintf, but it also tries to print some
793  * representation of the error code.  Normally errcode = errno. */
794 void rsyserr(enum logcode, int, const char *, ...)
795      __attribute__((format (printf, 3, 4)))
796      ;
797
798 #ifdef REPLACE_INET_NTOA
799 #define inet_ntoa rep_inet_ntoa
800 #endif
801
802 /* Make sure that the O_BINARY flag is defined. */
803 #ifndef O_BINARY
804 #define O_BINARY 0
805 #endif
806
807 #ifndef HAVE_STRLCPY
808 size_t strlcpy(char *d, const char *s, size_t bufsize);
809 #endif
810
811 #ifndef HAVE_STRLCAT
812 size_t strlcat(char *d, const char *s, size_t bufsize);
813 #endif
814
815 #ifndef WEXITSTATUS
816 #define WEXITSTATUS(stat)       ((int)(((stat)>>8)&0xFF))
817 #endif
818
819 #define exit_cleanup(code) _exit_cleanup(code, __FILE__, __LINE__)
820
821 #ifdef HAVE_GETEUID
822 #define MY_UID() geteuid()
823 #else
824 #define MY_UID() getuid()
825 #endif
826
827 #ifdef HAVE_GETEGID
828 #define MY_GID() getegid()
829 #else
830 #define MY_GID() getgid()
831 #endif
832
833 extern int verbose;
834
835 #ifndef HAVE_INET_NTOP
836 const char *inet_ntop(int af, const void *src, char *dst, size_t size);
837 #endif
838
839 #ifndef HAVE_INET_PTON
840 int inet_pton(int af, const char *src, void *dst);
841 #endif
842
843 #ifdef MAINTAINER_MODE
844 const char *get_panic_action(void);
845 #endif
846
847 #define UNUSED(x) x __attribute__((__unused__))
848
849 extern const char *io_write_phase, *io_read_phase;