Annotation of embedaddon/rsync/rsync.h, revision 1.1.1.4
1.1 misho 1: /*
2: * Copyright (C) 1996, 2000 Andrew Tridgell
3: * Copyright (C) 1996 Paul Mackerras
4: * Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
1.1.1.4 ! misho 5: * Copyright (C) 2003-2020 Wayne Davison
1.1 misho 6: *
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 3 of the License, or
10: * (at your option) any later version.
11: *
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.
16: *
17: * You should have received a copy of the GNU General Public License along
18: * with this program; if not, visit the http://fsf.org website.
19: */
20:
21: #define False 0
22: #define True 1
1.1.1.4 ! misho 23: #define Unset (-1) /* Our BOOL values are always an int. */
1.1 misho 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 SYMLINK_PREFIX "/rsyncd-munged/" /* This MUST have a trailing slash! */
37: #define SYMLINK_PREFIX_LEN ((int)sizeof SYMLINK_PREFIX - 1)
38:
39: #define BACKUP_SUFFIX "~"
40:
41: /* a non-zero CHAR_OFFSET makes the rolling sum stronger, but is
42: incompatible with older versions :-( */
43: #define CHAR_OFFSET 0
44:
45: /* These flags are only used during the flist transfer. */
46:
47: #define XMIT_TOP_DIR (1<<0)
48: #define XMIT_SAME_MODE (1<<1)
49: #define XMIT_SAME_RDEV_pre28 (1<<2) /* protocols 20 - 27 */
50: #define XMIT_EXTENDED_FLAGS (1<<2) /* protocols 28 - now */
51: #define XMIT_SAME_UID (1<<3)
52: #define XMIT_SAME_GID (1<<4)
53: #define XMIT_SAME_NAME (1<<5)
54: #define XMIT_LONG_NAME (1<<6)
55: #define XMIT_SAME_TIME (1<<7)
1.1.1.4 ! misho 56:
1.1 misho 57: #define XMIT_SAME_RDEV_MAJOR (1<<8) /* protocols 28 - now (devices only) */
58: #define XMIT_NO_CONTENT_DIR (1<<8) /* protocols 30 - now (dirs only) */
1.1.1.4 ! misho 59: #define XMIT_HLINKED (1<<9) /* protocols 28 - now (non-dirs) */
1.1 misho 60: #define XMIT_SAME_DEV_pre30 (1<<10) /* protocols 28 - 29 */
61: #define XMIT_USER_NAME_FOLLOWS (1<<10) /* protocols 30 - now */
1.1.1.4 ! misho 62: #define XMIT_RDEV_MINOR_8_pre30 (1<<11) /* protocols 28 - 29 */
1.1 misho 63: #define XMIT_GROUP_NAME_FOLLOWS (1<<11) /* protocols 30 - now */
64: #define XMIT_HLINK_FIRST (1<<12) /* protocols 30 - now (HLINKED files only) */
65: #define XMIT_IO_ERROR_ENDLIST (1<<12) /* protocols 31*- now (w/XMIT_EXTENDED_FLAGS) (also protocol 30 w/'f' compat flag) */
1.1.1.2 misho 66: #define XMIT_MOD_NSEC (1<<13) /* protocols 31 - now */
1.1.1.4 ! misho 67: #define XMIT_SAME_ATIME (1<<14) /* any protocol - restricted by command-line option */
! 68: #define XMIT_UNUSED_15 (1<<15) /* unused flag bit */
! 69:
! 70: /* The following XMIT flags require an rsync that uses a varint for the flag values */
! 71:
! 72: #define XMIT_SAME_FLAGS (1<<16) /* any protocol - restricted by command-line option */
! 73: #define XMIT_CRTIME_EQ_MTIME (1<<17) /* any protocol - restricted by command-line option */
1.1 misho 74:
75: /* These flags are used in the live flist data. */
76:
77: #define FLAG_TOP_DIR (1<<0) /* sender/receiver/generator */
78: #define FLAG_OWNED_BY_US (1<<0) /* generator: set by make_file() for aux flists only */
79: #define FLAG_FILE_SENT (1<<1) /* sender/receiver/generator */
80: #define FLAG_DIR_CREATED (1<<1) /* generator */
81: #define FLAG_CONTENT_DIR (1<<2) /* sender/receiver/generator */
82: #define FLAG_MOUNT_DIR (1<<3) /* sender/generator (dirs only) */
83: #define FLAG_SKIP_HLINK (1<<3) /* receiver/generator (w/FLAG_HLINKED) */
84: #define FLAG_DUPLICATE (1<<4) /* sender */
85: #define FLAG_MISSING_DIR (1<<4) /* generator */
86: #define FLAG_HLINKED (1<<5) /* receiver/generator (checked on all types) */
87: #define FLAG_HLINK_FIRST (1<<6) /* receiver/generator (w/FLAG_HLINKED) */
88: #define FLAG_IMPLIED_DIR (1<<6) /* sender/receiver/generator (dirs only) */
89: #define FLAG_HLINK_LAST (1<<7) /* receiver/generator */
90: #define FLAG_HLINK_DONE (1<<8) /* receiver/generator (checked on all types) */
91: #define FLAG_LENGTH64 (1<<9) /* sender/receiver/generator */
92: #define FLAG_SKIP_GROUP (1<<10) /* receiver/generator */
93: #define FLAG_TIME_FAILED (1<<11)/* generator */
1.1.1.2 misho 94: #define FLAG_MOD_NSEC (1<<12) /* sender/receiver/generator */
1.1 misho 95:
96: /* These flags are passed to functions but not stored. */
97:
98: #define FLAG_DIVERT_DIRS (1<<16) /* sender, but must be unique */
1.1.1.4 ! misho 99: #define FLAG_PERHAPS_DIR (1<<17) /* generator */
1.1 misho 100:
101: /* These flags are for get_dirlist(). */
102: #define GDL_IGNORE_FILTER_RULES (1<<0)
1.1.1.4 ! misho 103: #define GDL_PERHAPS_DIR (1<<1)
1.1 misho 104:
105: /* Some helper macros for matching bits. */
106: #define BITS_SET(val,bits) (((val) & (bits)) == (bits))
107: #define BITS_SETnUNSET(val,onbits,offbits) (((val) & ((onbits)|(offbits))) == (onbits))
108: #define BITS_EQUAL(b1,b2,mask) (((unsigned)(b1) & (unsigned)(mask)) \
109: == ((unsigned)(b2) & (unsigned)(mask)))
110:
111: /* update this if you make incompatible changes */
1.1.1.2 misho 112: #define PROTOCOL_VERSION 31
1.1 misho 113:
114: /* This is used when working on a new protocol version in CVS, and should
115: * be a new non-zero value for each CVS change that affects the protocol.
116: * It must ALWAYS be 0 when the protocol goes final (and NEVER before)! */
117: #define SUBPROTOCOL_VERSION 0
118:
119: /* We refuse to interoperate with versions that are not in this range.
120: * Note that we assume we'll work with later versions: the onus is on
121: * people writing them to make sure that they don't send us anything
122: * we won't understand.
123: *
124: * Interoperation with old but supported protocol versions
125: * should cause a warning to be printed. At a future date
126: * the old protocol will become the minimum and
127: * compatibility code removed.
128: *
129: * There are two possible explanations for the limit at
130: * MAX_PROTOCOL_VERSION: either to allow new major-rev versions that
131: * do not interoperate with us, and (more likely) so that we can
132: * detect an attempt to connect rsync to a non-rsync server, which is
133: * unlikely to begin by sending a byte between MIN_PROTOCL_VERSION and
134: * MAX_PROTOCOL_VERSION. */
135:
136: #define MIN_PROTOCOL_VERSION 20
137: #define OLD_PROTOCOL_VERSION 25
138: #define MAX_PROTOCOL_VERSION 40
139:
1.1.1.2 misho 140: #define MIN_FILECNT_LOOKAHEAD 1000
141: #define MAX_FILECNT_LOOKAHEAD 10000
1.1 misho 142:
143: #define RSYNC_PORT 873
144:
145: #define SPARSE_WRITE_SIZE (1024)
146: #define WRITE_SIZE (32*1024)
147: #define CHUNK_SIZE (32*1024)
148: #define MAX_MAP_SIZE (256*1024)
1.1.1.2 misho 149: #define IO_BUFFER_SIZE (32*1024)
1.1 misho 150: #define MAX_BLOCK_SIZE ((int32)1 << 17)
151:
152: /* For compatibility with older rsyncs */
153: #define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)
154:
1.1.1.2 misho 155: #define ROUND_UP_1024(siz) ((siz) & (1024-1) ? ((siz) | (1024-1)) + 1 : (siz))
156:
1.1 misho 157: #define IOERR_GENERAL (1<<0) /* For backward compatibility, this must == 1 */
158: #define IOERR_VANISHED (1<<1)
159: #define IOERR_DEL_LIMIT (1<<2)
160:
161: #define MAX_ARGS 1000
1.1.1.4 ! misho 162: #define MAX_FILTER_ARGS 100
1.1 misho 163: #define MAX_BASIS_DIRS 20
164: #define MAX_SERVER_ARGS (MAX_BASIS_DIRS*2 + 100)
165:
1.1.1.4 ! misho 166: #define COMPARE_DEST 1
! 167: #define COPY_DEST 2
! 168: #define LINK_DEST 3
! 169: #define CLONE_DEST 4
! 170:
! 171: #if !defined FICLONE && defined __linux__
! 172: #define FICLONE _IOW(0x94, 9, int)
! 173: #endif
! 174:
1.1 misho 175: #define MPLEX_BASE 7
176:
177: #define NO_FILTERS 0
178: #define SERVER_FILTERS 1
179: #define ALL_FILTERS 2
1.1.1.4 ! misho 180: /* Don't let the file be excluded, but check for a filter that might affect
! 181: * its attributes via FILTRULES_ATTRS. */
! 182: #define ALL_FILTERS_NO_EXCLUDE 3
1.1 misho 183:
184: #define XFLG_FATAL_ERRORS (1<<0)
185: #define XFLG_OLD_PREFIXES (1<<1)
186: #define XFLG_ANCHORED2ABS (1<<2) /* leading slash indicates absolute */
187: #define XFLG_ABS_IF_SLASH (1<<3) /* leading or interior slash is absolute */
188: #define XFLG_DIR2WILD3 (1<<4) /* dir/ match gets trailing *** added */
189:
190: #define ATTRS_REPORT (1<<0)
191: #define ATTRS_SKIP_MTIME (1<<1)
1.1.1.4 ! misho 192: #define ATTRS_ACCURATE_TIME (1<<2)
! 193: #define ATTRS_SKIP_ATIME (1<<3)
! 194: #define ATTRS_DELAY_IMMUTABLE (1<<4)
! 195: #define ATTRS_SKIP_CRTIME (1<<5)
1.1 misho 196:
1.1.1.4 ! misho 197: #define MSG_FLUSH 2
1.1 misho 198: #define FULL_FLUSH 1
199: #define NORMAL_FLUSH 0
200:
201: #define PDIR_CREATE 1
202: #define PDIR_DELETE 0
203:
204: /* Note: 0x00 - 0x7F are used for basis_dir[] indexes! */
205: #define FNAMECMP_BASIS_DIR_LOW 0x00 /* Must remain 0! */
206: #define FNAMECMP_BASIS_DIR_HIGH 0x7F
207: #define FNAMECMP_FNAME 0x80
208: #define FNAMECMP_PARTIAL_DIR 0x81
209: #define FNAMECMP_BACKUP 0x82
210: #define FNAMECMP_FUZZY 0x83
211:
212: /* For use by the itemize_changes code */
213: #define ITEM_REPORT_ATIME (1<<0)
214: #define ITEM_REPORT_CHANGE (1<<1)
215: #define ITEM_REPORT_SIZE (1<<2) /* regular files only */
216: #define ITEM_REPORT_TIMEFAIL (1<<2) /* symlinks only */
217: #define ITEM_REPORT_TIME (1<<3)
218: #define ITEM_REPORT_PERMS (1<<4)
219: #define ITEM_REPORT_OWNER (1<<5)
220: #define ITEM_REPORT_GROUP (1<<6)
221: #define ITEM_REPORT_ACL (1<<7)
222: #define ITEM_REPORT_XATTR (1<<8)
1.1.1.4 ! misho 223: #define ITEM_REPORT_FFLAGS (1<<9)
! 224: #define ITEM_REPORT_CRTIME (1<<10)
1.1 misho 225: #define ITEM_BASIS_TYPE_FOLLOWS (1<<11)
226: #define ITEM_XNAME_FOLLOWS (1<<12)
227: #define ITEM_IS_NEW (1<<13)
228: #define ITEM_LOCAL_CHANGE (1<<14)
229: #define ITEM_TRANSFER (1<<15)
230: /* These are outside the range of the transmitted flags. */
231: #define ITEM_MISSING_DATA (1<<16) /* used by log_formatted() */
232: #define ITEM_DELETED (1<<17) /* used by log_formatted() */
233: #define ITEM_MATCHED (1<<18) /* used by itemize() */
234:
235: #define SIGNIFICANT_ITEM_FLAGS (~(\
236: ITEM_BASIS_TYPE_FOLLOWS | ITEM_XNAME_FOLLOWS | ITEM_LOCAL_CHANGE))
237:
1.1.1.4 ! misho 238: /* this is the minimum we'll use, irrespective of config setting */
! 239: /* definitely don't set to less than about 30 seconds */
! 240: #define SLP_MIN_TIMEOUT 120
! 241:
1.1 misho 242: #define CFN_KEEP_DOT_DIRS (1<<0)
243: #define CFN_KEEP_TRAILING_SLASH (1<<1)
244: #define CFN_DROP_TRAILING_DOT_DIR (1<<2)
245: #define CFN_COLLAPSE_DOT_DOT_DIRS (1<<3)
1.1.1.3 misho 246: #define CFN_REFUSE_DOT_DOT_DIRS (1<<4)
1.1 misho 247:
248: #define SP_DEFAULT 0
249: #define SP_KEEP_DOT_DIRS (1<<0)
250:
251: #define CD_NORMAL 0
252: #define CD_SKIP_CHDIR 1
253:
254: /* Log-message categories. FLOG only goes to the log file, not the client;
255: * FCLIENT is the opposite. */
256: enum logcode {
257: FNONE=0, /* never sent */
258: FERROR_XFER=1, FINFO=2, /* sent over socket for any protocol */
259: FERROR=3, FWARNING=4, /* sent over socket for protocols >= 30 */
260: FERROR_SOCKET=5, FLOG=6, /* only sent via receiver -> generator pipe */
261: FERROR_UTF8=8, /* only sent via receiver -> generator pipe */
262: FCLIENT=7 /* never transmitted (e.g. server converts to FINFO) */
263: };
264:
265: /* Messages types that are sent over the message channel. The logcode
266: * values must all be present here with identical numbers. */
267: enum msgcode {
268: MSG_DATA=0, /* raw data on the multiplexed stream */
269: MSG_ERROR_XFER=FERROR_XFER, MSG_INFO=FINFO, /* remote logging */
270: MSG_ERROR=FERROR, MSG_WARNING=FWARNING, /* protocol-30 remote logging */
271: MSG_ERROR_SOCKET=FERROR_SOCKET, /* sibling logging */
272: MSG_ERROR_UTF8=FERROR_UTF8, /* sibling logging */
273: MSG_LOG=FLOG, MSG_CLIENT=FCLIENT, /* sibling logging */
274: MSG_REDO=9, /* reprocess indicated flist index */
1.1.1.2 misho 275: MSG_STATS=10, /* message has stats data for generator */
1.1 misho 276: MSG_IO_ERROR=22,/* the sending side had an I/O error */
1.1.1.2 misho 277: MSG_IO_TIMEOUT=33,/* tell client about a daemon's timeout value */
278: MSG_NOOP=42, /* a do-nothing message (legacy protocol-30 only) */
1.1.1.4 ! misho 279: MSG_CHECKSUM=55,/* sent via rcvr -> gen pipe and local-host-only gen -> sender */
1.1.1.2 misho 280: MSG_ERROR_EXIT=86, /* synchronize an error exit (siblings and protocol >= 31) */
1.1 misho 281: MSG_SUCCESS=100,/* successfully updated indicated flist index */
282: MSG_DELETED=101,/* successfully deleted a file on receiving side */
283: MSG_NO_SEND=102,/* sender failed to open a file we wanted */
284: };
285:
1.1.1.4 ! misho 286: #define MSG_CHECKSUM_LONGS 5
! 287: #define MSG_CHECKSUM_LEN (MSG_CHECKSUM_LONGS*8 + 4 + MAX_DIGEST_LEN)
! 288:
1.1 misho 289: #define NDX_DONE -1
290: #define NDX_FLIST_EOF -2
1.1.1.2 misho 291: #define NDX_DEL_STATS -3
1.1 misho 292: #define NDX_FLIST_OFFSET -101
293:
1.1.1.4 ! misho 294: /* For calling delete_item(), delete_dir_contents(), and delete_in_dir(). */
1.1.1.2 misho 295: #define DEL_NO_UID_WRITE (1<<0) /* file/dir has our uid w/o write perm */
296: #define DEL_RECURSE (1<<1) /* if dir, delete all contents */
297: #define DEL_DIR_IS_EMPTY (1<<2) /* internal delete_FUNCTIONS use only */
298: #define DEL_FOR_FILE (1<<3) /* making room for a replacement file */
299: #define DEL_FOR_DIR (1<<4) /* making room for a replacement dir */
300: #define DEL_FOR_SYMLINK (1<<5) /* making room for a replacement symlink */
301: #define DEL_FOR_DEVICE (1<<6) /* making room for a replacement device */
302: #define DEL_FOR_SPECIAL (1<<7) /* making room for a replacement special */
303: #define DEL_FOR_BACKUP (1<<8) /* the delete is for a backup operation */
1.1.1.4 ! misho 304: #define DEL_NO_DELETIONS (1<<9) /* just check for renames w/o deleting */
1.1.1.2 misho 305:
306: #define DEL_MAKE_ROOM (DEL_FOR_FILE|DEL_FOR_DIR|DEL_FOR_SYMLINK|DEL_FOR_DEVICE|DEL_FOR_SPECIAL)
307:
308: enum delret {
309: DR_SUCCESS = 0, DR_FAILURE, DR_AT_LIMIT, DR_NOT_EMPTY
310: };
311:
312: /* Defines for make_path() */
313: #define MKP_DROP_NAME (1<<0) /* drop trailing filename or trailing slash */
314: #define MKP_SKIP_SLASH (1<<1) /* skip one or more leading slashes */
315:
316: /* Defines for maybe_send_keepalive() */
317: #define MSK_ALLOW_FLUSH (1<<0)
318: #define MSK_ACTIVE_RECEIVER (1<<1)
319:
1.1 misho 320: #include "errcode.h"
321:
322: #include "config.h"
1.1.1.4 ! misho 323: #include "version.h"
1.1 misho 324:
325: /* The default RSYNC_RSH is always set in config.h. */
326:
327: #include <stdio.h>
328: #ifdef HAVE_SYS_TYPES_H
329: # include <sys/types.h>
330: #endif
331: #ifdef HAVE_SYS_STAT_H
332: # include <sys/stat.h>
333: #endif
334: #ifdef STDC_HEADERS
335: # include <stdlib.h>
336: # include <stddef.h>
337: #else
338: # ifdef HAVE_STDLIB_H
339: # include <stdlib.h>
340: # endif
341: #endif
342: #ifdef HAVE_STRING_H
343: # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
344: # include <memory.h>
345: # endif
346: # include <string.h>
347: #endif
348: #ifdef HAVE_STRINGS_H
349: # include <strings.h>
350: #endif
351: #ifdef HAVE_INTTYPES_H
352: # include <inttypes.h>
353: #endif
354: #ifdef HAVE_STDINT_H
355: # include <stdint.h>
356: #endif
357: #ifdef HAVE_UNISTD_H
358: # include <unistd.h>
359: #endif
360:
361: #ifdef HAVE_SYS_PARAM_H
362: #include <sys/param.h>
363: #endif
364:
365: #if defined HAVE_MALLOC_H && (defined HAVE_MALLINFO || !defined HAVE_STDLIB_H)
366: #include <malloc.h>
367: #endif
368:
369: #ifdef HAVE_SYS_SOCKET_H
370: #include <sys/socket.h>
371: #endif
372:
373: #ifdef TIME_WITH_SYS_TIME
374: #include <sys/time.h>
375: #include <time.h>
376: #else
377: #ifdef HAVE_SYS_TIME_H
378: #include <sys/time.h>
379: #else
380: #include <time.h>
381: #endif
382: #endif
383:
384: #ifdef HAVE_FCNTL_H
385: #include <fcntl.h>
386: #else
387: #ifdef HAVE_SYS_FCNTL_H
388: #include <sys/fcntl.h>
389: #endif
390: #endif
391:
392: #ifdef HAVE_SYS_IOCTL_H
393: #include <sys/ioctl.h>
394: #endif
395:
396: #ifdef HAVE_SYS_FILIO_H
397: #include <sys/filio.h>
398: #endif
399:
400: #include <signal.h>
401: #ifdef HAVE_SYS_WAIT_H
402: #include <sys/wait.h>
403: #endif
404: #ifdef HAVE_CTYPE_H
405: #include <ctype.h>
406: #endif
407: #ifdef HAVE_GRP_H
408: #include <grp.h>
409: #endif
410: #include <errno.h>
411:
412: #ifdef HAVE_UTIME_H
413: #include <utime.h>
414: #endif
415:
1.1.1.4 ! misho 416: #if defined HAVE_UTIMENSAT || defined HAVE_LUTIMES || defined HAVE_SETATTRLIST
1.1 misho 417: #define CAN_SET_SYMLINK_TIMES 1
418: #endif
419:
420: #if defined HAVE_LCHOWN || defined CHOWN_MODIFIES_SYMLINK
421: #define CAN_CHOWN_SYMLINK 1
422: #endif
423:
424: #if defined HAVE_LCHMOD || defined HAVE_SETATTRLIST
425: #define CAN_CHMOD_SYMLINK 1
426: #endif
427:
1.1.1.4 ! misho 428: #if defined HAVE_UTIMENSAT || defined HAVE_SETATTRLIST
! 429: #define CAN_SET_NSEC 1
! 430: #endif
! 431:
! 432: #ifdef CAN_SET_NSEC
1.1.1.2 misho 433: #ifdef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
434: #define ST_MTIME_NSEC st_mtim.tv_nsec
1.1.1.4 ! misho 435: #define ST_ATIME_NSEC st_atim.tv_nsec
1.1.1.2 misho 436: #elif defined(HAVE_STRUCT_STAT_ST_MTIMENSEC)
437: #define ST_MTIME_NSEC st_mtimensec
1.1.1.4 ! misho 438: #define ST_ATIME_NSEC st_atimensec
! 439: #elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
! 440: #define ST_MTIME_NSEC st_mtimespec.tv_nsec
! 441: #define ST_ATIME_NSEC st_atimespec.tv_nsec
1.1.1.2 misho 442: #endif
443: #endif
444:
1.1 misho 445: #ifdef HAVE_SYS_SELECT_H
446: #include <sys/select.h>
447: #endif
448:
449: #ifdef HAVE_SYS_MODE_H
450: /* apparently AIX needs this for S_ISLNK */
451: #ifndef S_ISLNK
452: #include <sys/mode.h>
453: #endif
454: #endif
455:
456: /* these are needed for the uid/gid mapping code */
457: #include <pwd.h>
458: #include <grp.h>
459:
460: #include <stdarg.h>
461: #include <netinet/in.h>
462: #include <arpa/inet.h>
463: #ifdef HAVE_NETDB_H
464: #include <netdb.h>
465: #endif
466: #include <syslog.h>
1.1.1.4 ! misho 467: #ifdef HAVE_SYS_FILE_H
1.1 misho 468: #include <sys/file.h>
1.1.1.4 ! misho 469: #endif
1.1 misho 470:
471: #ifdef HAVE_DIRENT_H
472: # include <dirent.h>
473: #else
474: # define dirent direct
475: # ifdef HAVE_SYS_NDIR_H
476: # include <sys/ndir.h>
477: # endif
478: # ifdef HAVE_SYS_DIR_H
479: # include <sys/dir.h>
480: # endif
481: # ifdef HAVE_NDIR_H
482: # include <ndir.h>
483: # endif
484: #endif
485:
486: #ifdef MAJOR_IN_MKDEV
487: #include <sys/mkdev.h>
488: # if !defined makedev && (defined mkdev || defined _WIN32 || defined __WIN32__)
489: # define makedev mkdev
490: # endif
491: #elif defined MAJOR_IN_SYSMACROS
492: #include <sys/sysmacros.h>
493: #endif
494:
495: #ifdef MAKEDEV_TAKES_3_ARGS
496: #define MAKEDEV(devmajor,devminor) makedev(0,devmajor,devminor)
497: #else
1.1.1.4 ! misho 498: #ifndef __TANDEM
1.1 misho 499: #define MAKEDEV(devmajor,devminor) makedev(devmajor,devminor)
1.1.1.4 ! misho 500: #else
! 501: # include <sys/stat.h>
! 502: # define major DEV_TO_MAJOR
! 503: # define minor DEV_TO_MINOR
! 504: # define MAKEDEV MAJORMINOR_TO_DEV
! 505: #endif
! 506: #endif
! 507:
! 508: #ifdef __TANDEM
! 509: # include <floss.h(floss_read,floss_write,floss_fork,floss_execvp)>
! 510: # include <floss.h(floss_getpwuid,floss_select,floss_seteuid)>
! 511: # define S_IEXEC S_IXUSR
! 512: # define ROOT_UID 65535
! 513: #else
! 514: # define ROOT_UID 0
1.1 misho 515: #endif
516:
517: #ifdef HAVE_COMPAT_H
518: #include <compat.h>
519: #endif
520:
521: #ifdef HAVE_LIMITS_H
522: # include <limits.h>
523: #endif
524:
525: #if defined USE_ICONV_OPEN && defined HAVE_ICONV_H
526: #include <iconv.h>
527: #ifndef ICONV_CONST
528: #define ICONV_CONST
529: #endif
530: #else
531: #ifdef ICONV_CONST
532: #undef ICONV_CONST
533: #endif
534: #ifdef ICONV_OPTION
535: #undef ICONV_OPTION
536: #endif
537: #ifdef iconv_t
538: #undef iconv_t
539: #endif
540: #define iconv_t int
541: #endif
542:
1.1.1.4 ! misho 543: #ifdef GSSAPI_OPTION
! 544: #ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H
! 545: #include <gssapi/gssapi_generic.h>
! 546: #endif
! 547: #ifdef HAVE_GSSAPI_GSSAPI_H
! 548: #include <gssapi/gssapi.h>
! 549: #endif
! 550: #endif
! 551:
1.1 misho 552: #include <assert.h>
553:
554: #include "lib/pool_alloc.h"
555:
556: #ifndef HAVE_ID_T
557: typedef unsigned int id_t;
558: #endif
559: #ifndef HAVE_PID_T
560: typedef int pid_t;
561: #endif
562: #ifndef HAVE_MODE_T
563: typedef unsigned int mode_t;
564: #endif
565: #ifndef HAVE_OFF_T
566: typedef long off_t;
567: #undef SIZEOF_OFF_T
568: #define SIZEOF_OFF_T SIZEOF_LONG
569: #endif
570: #ifndef HAVE_SIZE_T
571: typedef unsigned int size_t;
572: #endif
573:
574: #define BOOL int
575:
576: #ifndef uchar
577: #define uchar unsigned char
578: #endif
579:
580: #ifdef SIGNED_CHAR_OK
581: #define schar signed char
582: #else
583: #define schar char
584: #endif
585:
586: #ifndef int16
587: #if SIZEOF_INT16_T == 2
588: # define int16 int16_t
589: #else
590: # define int16 short
591: #endif
592: #endif
593:
594: #ifndef uint16
595: #if SIZEOF_UINT16_T == 2
596: # define uint16 uint16_t
597: #else
598: # define uint16 unsigned int16
599: #endif
600: #endif
601:
1.1.1.4 ! misho 602: #ifndef UF_COMPRESSED
! 603: #define UF_COMPRESSED 0x00000020
! 604: #endif
! 605: #ifndef VOL_CAP_FMT_DECMPFS_COMPRESSION
! 606: #define VOL_CAP_FMT_DECMPFS_COMPRESSION 0x00010000
! 607: #endif
! 608:
! 609: #if defined SUPPORT_XATTRS && defined SUPPORT_FILEFLAGS
! 610: #define SUPPORT_HFS_COMPRESSION 1
! 611: #endif
! 612:
! 613: #ifndef __APPLE__ /* Do we need a configure check for this? */
! 614: #define SUPPORT_ATIMES 1
! 615: #endif
! 616:
! 617: #ifdef HAVE_GETATTRLIST
! 618: #define SUPPORT_CRTIMES 1
! 619: #endif
! 620:
! 621: #define NO_FFLAGS ((uint32)-1)
! 622:
! 623: #ifdef HAVE_CHFLAGS
! 624: #define SUPPORT_FILEFLAGS 1
! 625: #define SUPPORT_FORCE_CHANGE 1
! 626: #endif
! 627:
! 628: #if defined SUPPORT_FILEFLAGS || defined SUPPORT_FORCE_CHANGE
! 629: #ifndef UF_NOUNLINK
! 630: #define UF_NOUNLINK 0
! 631: #endif
! 632: #ifndef SF_NOUNLINK
! 633: #define SF_NOUNLINK 0
! 634: #endif
! 635: #define USR_IMMUTABLE (UF_IMMUTABLE|UF_NOUNLINK|UF_APPEND)
! 636: #define SYS_IMMUTABLE (SF_IMMUTABLE|SF_NOUNLINK|SF_APPEND)
! 637: #define ALL_IMMUTABLE (USR_IMMUTABLE|SYS_IMMUTABLE)
! 638: #define ST_FLAGS(st) ((st).st_flags)
! 639: #else
! 640: #define USR_IMMUTABLE 0
! 641: #define SYS_IMMUTABLE 0
! 642: #define ALL_IMMUTABLE 0
! 643: #define ST_FLAGS(st) NO_FFLAGS
! 644: #endif
! 645:
1.1 misho 646: /* Find a variable that is either exactly 32-bits or longer.
647: * If some code depends on 32-bit truncation, it will need to
648: * take special action in a "#if SIZEOF_INT32 > 4" section. */
649: #ifndef int32
650: #if SIZEOF_INT32_T == 4
651: # define int32 int32_t
652: # define SIZEOF_INT32 4
653: #elif SIZEOF_INT == 4
654: # define int32 int
655: # define SIZEOF_INT32 4
656: #elif SIZEOF_LONG == 4
657: # define int32 long
658: # define SIZEOF_INT32 4
659: #elif SIZEOF_SHORT == 4
660: # define int32 short
661: # define SIZEOF_INT32 4
662: #elif SIZEOF_INT > 4
663: # define int32 int
664: # define SIZEOF_INT32 SIZEOF_INT
665: #elif SIZEOF_LONG > 4
666: # define int32 long
667: # define SIZEOF_INT32 SIZEOF_LONG
668: #else
669: # error Could not find a 32-bit integer variable
670: #endif
671: #else
672: # define SIZEOF_INT32 4
673: #endif
674:
675: #ifndef uint32
676: #if SIZEOF_UINT32_T == 4
677: # define uint32 uint32_t
678: #else
679: # define uint32 unsigned int32
680: #endif
681: #endif
682:
683: #if SIZEOF_OFF_T == 8 || !SIZEOF_OFF64_T || !defined HAVE_STRUCT_STAT64
684: #define OFF_T off_t
685: #define STRUCT_STAT struct stat
686: #define SIZEOF_CAPITAL_OFF_T SIZEOF_OFF_T
687: #else
688: #define OFF_T off64_t
689: #define STRUCT_STAT struct stat64
690: #define USE_STAT64_FUNCS 1
691: #define SIZEOF_CAPITAL_OFF_T SIZEOF_OFF64_T
692: #endif
693:
694: /* CAVEAT: on some systems, int64 will really be a 32-bit integer IFF
695: * that's the maximum size the file system can handle and there is no
696: * 64-bit type available. The rsync source must therefore take steps
697: * to ensure that any code that really requires a 64-bit integer has
698: * it (e.g. the checksum code uses two 32-bit integers for its 64-bit
699: * counter). */
700: #if SIZEOF_INT64_T == 8
701: # define int64 int64_t
702: # define SIZEOF_INT64 8
703: #elif SIZEOF_LONG == 8
704: # define int64 long
705: # define SIZEOF_INT64 8
706: #elif SIZEOF_INT == 8
707: # define int64 int
708: # define SIZEOF_INT64 8
709: #elif SIZEOF_LONG_LONG == 8
710: # define int64 long long
711: # define SIZEOF_INT64 8
712: #elif SIZEOF_OFF64_T == 8
713: # define int64 off64_t
714: # define SIZEOF_INT64 8
715: #elif SIZEOF_OFF_T == 8
716: # define int64 off_t
717: # define SIZEOF_INT64 8
718: #elif SIZEOF_INT > 8
719: # define int64 int
720: # define SIZEOF_INT64 SIZEOF_INT
721: #elif SIZEOF_LONG > 8
722: # define int64 long
723: # define SIZEOF_INT64 SIZEOF_LONG
724: #elif SIZEOF_LONG_LONG > 8
725: # define int64 long long
726: # define SIZEOF_INT64 SIZEOF_LONG_LONG
727: #else
728: /* As long as it gets... */
729: # define int64 off_t
730: # define SIZEOF_INT64 SIZEOF_OFF_T
731: #endif
732:
1.1.1.4 ! misho 733: #define HT_KEY32 0
! 734: #define HT_KEY64 1
! 735:
1.1 misho 736: struct hashtable {
737: void *nodes;
738: int32 size, entries;
739: uint32 node_size;
1.1.1.2 misho 740: short key64;
1.1 misho 741: };
742:
743: struct ht_int32_node {
744: void *data;
745: int32 key;
746: };
747:
748: struct ht_int64_node {
749: void *data;
750: int64 key;
751: };
752:
753: #define HT_NODE(tbl, bkts, i) ((void*)((char*)(bkts) + (i)*(tbl)->node_size))
754: #define HT_KEY(node, k64) ((k64)? ((struct ht_int64_node*)(node))->key \
755: : (int64)((struct ht_int32_node*)(node))->key)
756:
757: #ifndef MIN
758: #define MIN(a,b) ((a)<(b)?(a):(b))
759: #endif
760:
761: #ifndef MAX
762: #define MAX(a,b) ((a)>(b)?(a):(b))
763: #endif
764:
765: #ifndef MAXHOSTNAMELEN
766: #define MAXHOSTNAMELEN 256
767: #endif
768:
769: #define SUM_LENGTH 16
770: #define SHORT_SUM_LENGTH 2
771: #define BLOCKSUM_BIAS 10
772:
773: #ifndef MAXPATHLEN
774: #define MAXPATHLEN 1024
775: #endif
776:
777: /* We want a roomy line buffer that can hold more than MAXPATHLEN,
778: * and significantly more than an overly short MAXPATHLEN. */
779: #if MAXPATHLEN < 4096
780: #define BIGPATHBUFLEN (4096+1024)
781: #else
782: #define BIGPATHBUFLEN (MAXPATHLEN+1024)
783: #endif
784:
785: #ifndef NAME_MAX
786: #define NAME_MAX 255
787: #endif
788:
1.1.1.4 ! misho 789: #ifndef SIZE_MAX
! 790: #define SIZE_MAX ((size_t)-1)
! 791: #endif
! 792:
1.1 misho 793: #ifndef INADDR_NONE
794: #define INADDR_NONE 0xffffffff
795: #endif
796:
797: #ifndef IN_LOOPBACKNET
798: #define IN_LOOPBACKNET 127
799: #endif
800:
801: #if HAVE_UNIXWARE_ACLS|HAVE_SOLARIS_ACLS|HAVE_HPUX_ACLS
802: #define ACLS_NEED_MASK 1
803: #endif
804:
1.1.1.2 misho 805: #if defined HAVE_FALLOCATE || HAVE_SYS_FALLOCATE
806: #ifdef HAVE_LINUX_FALLOC_H
807: #include <linux/falloc.h>
808: #endif
809: #ifdef FALLOC_FL_KEEP_SIZE
810: #define SUPPORT_PREALLOCATION 1
811: #elif defined HAVE_FTRUNCATE
812: #define SUPPORT_PREALLOCATION 1
813: #define PREALLOCATE_NEEDS_TRUNCATE 1
814: #endif
815: #else /* !fallocate */
816: #if defined HAVE_EFFICIENT_POSIX_FALLOCATE && defined HAVE_FTRUNCATE
817: #define SUPPORT_PREALLOCATION 1
818: #define PREALLOCATE_NEEDS_TRUNCATE 1
819: #endif
820: #endif
821:
1.1.1.4 ! misho 822: #if SIZEOF_CHARP == 4
! 823: # define PTRS_ARE_32 1
! 824: # define PTR_EXTRA_CNT 1
! 825: #elif SIZEOF_CHARP == 8
! 826: # define PTRS_ARE_64 1
! 827: # define PTR_EXTRA_CNT EXTRA64_CNT
! 828: #else
! 829: # error Character pointers are not 4 or 8 bytes.
! 830: #endif
! 831:
! 832: #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
! 833: #define USE_FLEXIBLE_ARRAY 1
! 834: #endif
! 835:
1.1 misho 836: union file_extras {
837: int32 num;
838: uint32 unum;
1.1.1.4 ! misho 839: #ifdef PTRS_ARE_32
! 840: const char* ptr;
! 841: #endif
! 842: };
! 843:
! 844: union file_extras64 {
! 845: int64 num;
! 846: #ifdef PTRS_ARE_64
! 847: const char* ptr;
! 848: #endif
1.1 misho 849: };
850:
851: struct file_struct {
852: const char *dirname; /* The dir info inside the transfer */
853: time_t modtime; /* When the item was last modified */
854: uint32 len32; /* Lowest 32 bits of the file's length */
855: uint16 mode; /* The item's type and permissions */
856: uint16 flags; /* The FLAG_* bits for this item */
1.1.1.4 ! misho 857: #ifdef USE_FLEXIBLE_ARRAY
! 858: const char basename[]; /* The basename (AKA filename) follows */
! 859: #else
! 860: const char basename[1]; /* A kluge that should work like a flexible array */
! 861: #endif
1.1 misho 862: };
863:
864: extern int file_extra_cnt;
865: extern int inc_recurse;
1.1.1.4 ! misho 866: extern int atimes_ndx;
! 867: extern int crtimes_ndx;
! 868: extern int pathname_ndx;
! 869: extern int depth_ndx;
1.1 misho 870: extern int uid_ndx;
871: extern int gid_ndx;
1.1.1.4 ! misho 872: extern int fileflags_ndx;
1.1 misho 873: extern int acls_ndx;
874: extern int xattrs_ndx;
875:
1.1.1.4 ! misho 876: #ifdef USE_FLEXIBLE_ARRAY
! 877: #define FILE_STRUCT_LEN (sizeof (struct file_struct))
! 878: #else
1.1 misho 879: #define FILE_STRUCT_LEN (offsetof(struct file_struct, basename))
1.1.1.4 ! misho 880: #endif
1.1 misho 881: #define EXTRA_LEN (sizeof (union file_extras))
882: #define DEV_EXTRA_CNT 2
883: #define DIRNODE_EXTRA_CNT 3
1.1.1.4 ! misho 884: #define EXTRA64_CNT ((sizeof (union file_extras64) + EXTRA_LEN - 1) / EXTRA_LEN)
1.1 misho 885: #define SUM_EXTRA_CNT ((MAX_DIGEST_LEN + EXTRA_LEN - 1) / EXTRA_LEN)
886:
887: #define REQ_EXTRA(f,ndx) ((union file_extras*)(f) - (ndx))
888: #define OPT_EXTRA(f,bump) ((union file_extras*)(f) - file_extra_cnt - 1 - (bump))
889:
1.1.1.4 ! misho 890: /* These are guaranteed to be allocated first in the array so that they
! 891: * are aligned for direct int64-pointer access. */
! 892: #define REQ_EXTRA64(f,ndx) ((union file_extras64*)REQ_EXTRA(f,ndx))
! 893:
1.1.1.2 misho 894: #define NSEC_BUMP(f) ((f)->flags & FLAG_MOD_NSEC ? 1 : 0)
1.1 misho 895: #define LEN64_BUMP(f) ((f)->flags & FLAG_LENGTH64 ? 1 : 0)
1.1.1.2 misho 896: #define START_BUMP(f) (NSEC_BUMP(f) + LEN64_BUMP(f))
1.1 misho 897: #define HLINK_BUMP(f) ((f)->flags & (FLAG_HLINKED|FLAG_HLINK_DONE) ? inc_recurse+1 : 0)
898: #define ACL_BUMP(f) (acls_ndx ? 1 : 0)
899:
900: /* The length applies to all items. */
901: #if SIZEOF_INT64 < 8
902: #define F_LENGTH(f) ((int64)(f)->len32)
903: #else
1.1.1.4 ! misho 904: #define F_HIGH_LEN(f) (OPT_EXTRA(f, NSEC_BUMP(f))->unum)
! 905: #define F_LENGTH(f) ((int64)(f)->len32 + ((f)->flags & FLAG_LENGTH64 ? (int64)F_HIGH_LEN(f) << 32 : 0))
1.1 misho 906: #endif
907:
1.1.1.4 ! misho 908: #define F_MOD_NSEC(f) OPT_EXTRA(f, 0)->unum
! 909: #define F_MOD_NSEC_or_0(f) ((f)->flags & FLAG_MOD_NSEC ? F_MOD_NSEC(f) : 0)
1.1.1.2 misho 910:
1.1 misho 911: /* If there is a symlink string, it is always right after the basename */
912: #define F_SYMLINK(f) ((f)->basename + strlen((f)->basename) + 1)
913:
914: /* The sending side always has this available: */
1.1.1.4 ! misho 915: #ifdef PTRS_ARE_32
! 916: #define F_PATHNAME(f) REQ_EXTRA(f, pathname_ndx)->ptr
! 917: #else
! 918: #define F_PATHNAME(f) REQ_EXTRA64(f, pathname_ndx)->ptr
! 919: #endif
1.1 misho 920:
921: /* The receiving side always has this available: */
1.1.1.4 ! misho 922: #define F_DEPTH(f) REQ_EXTRA(f, depth_ndx)->num
1.1 misho 923:
924: /* When the associated option is on, all entries will have these present: */
925: #define F_OWNER(f) REQ_EXTRA(f, uid_ndx)->unum
926: #define F_GROUP(f) REQ_EXTRA(f, gid_ndx)->unum
1.1.1.4 ! misho 927: #if defined SUPPORT_FILEFLAGS || defined SUPPORT_FORCE_CHANGE
! 928: #define F_FFLAGS(f) REQ_EXTRA(f, fileflags_ndx)->unum
! 929: #else
! 930: #define F_FFLAGS(f) NO_FFLAGS
! 931: #endif
1.1 misho 932: #define F_ACL(f) REQ_EXTRA(f, acls_ndx)->num
933: #define F_XATTR(f) REQ_EXTRA(f, xattrs_ndx)->num
934: #define F_NDX(f) REQ_EXTRA(f, unsort_ndx)->num
1.1.1.4 ! misho 935: #define F_ATIME(f) REQ_EXTRA64(f, atimes_ndx)->num
! 936: #define F_CRTIME(f) REQ_EXTRA64(f, crtimes_ndx)->num
1.1 misho 937:
938: /* These items are per-entry optional: */
1.1.1.2 misho 939: #define F_HL_GNUM(f) OPT_EXTRA(f, START_BUMP(f))->num /* non-dirs */
940: #define F_HL_PREV(f) OPT_EXTRA(f, START_BUMP(f)+inc_recurse)->num /* non-dirs */
941: #define F_DIR_NODE_P(f) (&OPT_EXTRA(f, START_BUMP(f) \
1.1 misho 942: + DIRNODE_EXTRA_CNT - 1)->num) /* sender dirs */
1.1.1.2 misho 943: #define F_DIR_RELNAMES_P(f) (&OPT_EXTRA(f, START_BUMP(f) + DIRNODE_EXTRA_CNT \
1.1 misho 944: + PTR_EXTRA_CNT - 1)->num) /* sender dirs */
1.1.1.2 misho 945: #define F_DIR_DEFACL(f) OPT_EXTRA(f, START_BUMP(f))->unum /* receiver dirs */
946: #define F_DIR_DEV_P(f) (&OPT_EXTRA(f, START_BUMP(f) + ACL_BUMP(f) \
1.1 misho 947: + DEV_EXTRA_CNT - 1)->unum) /* receiver dirs */
948:
1.1.1.2 misho 949: /* This optional item might follow an F_HL_*() item. */
950: #define F_RDEV_P(f) (&OPT_EXTRA(f, START_BUMP(f) + HLINK_BUMP(f) + DEV_EXTRA_CNT - 1)->unum)
1.1 misho 951:
952: /* The sum is only present on regular files. */
1.1.1.2 misho 953: #define F_SUM(f) ((char*)OPT_EXTRA(f, START_BUMP(f) + HLINK_BUMP(f) \
1.1 misho 954: + SUM_EXTRA_CNT - 1))
955:
1.1.1.4 ! misho 956: /* These are only valid on an entry derived from a checksum file. */
! 957: #define F_CTIME(f) OPT_EXTRA(f, LEN64_BUMP(f) + SUM_EXTRA_CNT)->unum
! 958: #define F_INODE(f) OPT_EXTRA(f, LEN64_BUMP(f) + SUM_EXTRA_CNT + 1)->unum
! 959:
1.1 misho 960: /* Some utility defines: */
961: #define F_IS_ACTIVE(f) (f)->basename[0]
962: #define F_IS_HLINKED(f) ((f)->flags & FLAG_HLINKED)
963:
964: #define F_HLINK_NOT_FIRST(f) BITS_SETnUNSET((f)->flags, FLAG_HLINKED, FLAG_HLINK_FIRST)
965: #define F_HLINK_NOT_LAST(f) BITS_SETnUNSET((f)->flags, FLAG_HLINKED, FLAG_HLINK_LAST)
966:
967: /* These access the F_DIR_DEV_P() and F_RDEV_P() values: */
968: #define DEV_MAJOR(a) (a)[0]
969: #define DEV_MINOR(a) (a)[1]
970:
971: /* These access the F_DIRS_NODE_P() values: */
972: #define DIR_PARENT(a) (a)[0]
973: #define DIR_FIRST_CHILD(a) (a)[1]
974: #define DIR_NEXT_SIBLING(a) (a)[2]
975:
1.1.1.3 misho 976: #define IS_MISSING_FILE(statbuf) ((statbuf).st_mode == 0)
977:
1.1 misho 978: /*
979: * Start the flist array at FLIST_START entries and grow it
980: * by doubling until FLIST_LINEAR then grow by FLIST_LINEAR
981: */
982: #define FLIST_START (32 * 1024)
983: #define FLIST_LINEAR (FLIST_START * 512)
984:
985: /*
986: * Extent size for allocation pools: A minimum size of 128KB
987: * is needed to mmap them so that freeing will release the
988: * space to the OS.
989: *
990: * Larger sizes reduce leftover fragments and speed free calls
991: * (when they happen). Smaller sizes increase the chance of
992: * freed allocations freeing whole extents.
993: */
994: #define NORMAL_EXTENT (256 * 1024)
995: #define SMALL_EXTENT (128 * 1024)
996:
997: #define FLIST_TEMP (1<<1)
998:
999: struct file_list {
1000: struct file_list *next, *prev;
1001: struct file_struct **files, **sorted;
1002: alloc_pool_t file_pool;
1003: void *pool_boundary;
1004: int used, malloced;
1005: int low, high; /* 0-relative index values excluding empties */
1006: int ndx_start; /* the start offset for inc_recurse mode */
1007: int flist_num; /* 1-relative file_list number or 0 */
1008: int parent_ndx; /* dir_flist index of parent directory */
1009: int in_progress, to_redo;
1010: };
1011:
1012: #define SUMFLG_SAME_OFFSET (1<<0)
1013:
1014: struct sum_buf {
1015: OFF_T offset; /**< offset in file of this chunk */
1016: int32 len; /**< length of chunk of file */
1017: uint32 sum1; /**< simple checksum */
1018: int32 chain; /**< next hash-table collision */
1019: short flags; /**< flag bits */
1020: char sum2[SUM_LENGTH]; /**< checksum */
1021: };
1022:
1023: struct sum_struct {
1024: OFF_T flength; /**< total file length */
1025: struct sum_buf *sums; /**< points to info for each chunk */
1026: int32 count; /**< how many chunks */
1027: int32 blength; /**< block_length */
1028: int32 remainder; /**< flength % block_length */
1029: int s2length; /**< sum2_length */
1030: };
1031:
1032: struct map_struct {
1033: OFF_T file_size; /* File size (from stat) */
1034: OFF_T p_offset; /* Window start */
1035: OFF_T p_fd_offset; /* offset of cursor in fd ala lseek */
1036: char *p; /* Window pointer */
1037: int32 p_size; /* Largest window size we allocated */
1038: int32 p_len; /* Latest (rounded) window size */
1039: int32 def_window_size; /* Default window size */
1040: int fd; /* File Descriptor */
1041: int status; /* first errno from read errors */
1042: };
1043:
1.1.1.4 ! misho 1044: struct chmod_mode_struct;
! 1045:
! 1046: #define NAME_IS_FILE (0) /* filter name as a file */
! 1047: #define NAME_IS_DIR (1<<0) /* filter name as a dir */
! 1048: #define NAME_IS_XATTR (1<<2) /* filter name as an xattr */
! 1049:
1.1.1.2 misho 1050: #define FILTRULE_WILD (1<<0) /* pattern has '*', '[', and/or '?' */
1051: #define FILTRULE_WILD2 (1<<1) /* pattern has '**' */
1052: #define FILTRULE_WILD2_PREFIX (1<<2) /* pattern starts with "**" */
1053: #define FILTRULE_WILD3_SUFFIX (1<<3) /* pattern ends with "***" */
1054: #define FILTRULE_ABS_PATH (1<<4) /* path-match on absolute path */
1055: #define FILTRULE_INCLUDE (1<<5) /* this is an include, not an exclude */
1056: #define FILTRULE_DIRECTORY (1<<6) /* this matches only directories */
1057: #define FILTRULE_WORD_SPLIT (1<<7) /* split rules on whitespace */
1058: #define FILTRULE_NO_INHERIT (1<<8) /* don't inherit these rules */
1059: #define FILTRULE_NO_PREFIXES (1<<9) /* parse no prefixes from patterns */
1060: #define FILTRULE_MERGE_FILE (1<<10)/* specifies a file to merge */
1061: #define FILTRULE_PERDIR_MERGE (1<<11)/* merge-file is searched per-dir */
1062: #define FILTRULE_EXCLUDE_SELF (1<<12)/* merge-file name should be excluded */
1063: #define FILTRULE_FINISH_SETUP (1<<13)/* per-dir merge file needs setup */
1064: #define FILTRULE_NEGATE (1<<14)/* rule matches when pattern does not */
1065: #define FILTRULE_CVS_IGNORE (1<<15)/* rule was -C or :C */
1066: #define FILTRULE_SENDER_SIDE (1<<16)/* rule applies to the sending side */
1067: #define FILTRULE_RECEIVER_SIDE (1<<17)/* rule applies to the receiving side */
1068: #define FILTRULE_CLEAR_LIST (1<<18)/* this item is the "!" token */
1069: #define FILTRULE_PERISHABLE (1<<19)/* perishable if parent dir goes away */
1.1.1.4 ! misho 1070: #define FILTRULE_XATTR (1<<20)/* rule only applies to xattr names */
! 1071: #define FILTRULE_CHMOD (1<<21)/* chmod-tweak matching files */
! 1072: #define FILTRULE_FORCE_OWNER (1<<22)/* force owner of matching files */
! 1073: #define FILTRULE_FORCE_GROUP (1<<23)/* force group of matching files */
1.1.1.2 misho 1074:
1075: #define FILTRULES_SIDES (FILTRULE_SENDER_SIDE | FILTRULE_RECEIVER_SIDE)
1.1.1.4 ! misho 1076: #define FILTRULES_ATTRS (FILTRULE_CHMOD | FILTRULE_FORCE_OWNER | FILTRULE_FORCE_GROUP)
! 1077:
! 1078: struct filter_chmod_struct {
! 1079: unsigned int ref_cnt;
! 1080: char *modestr;
! 1081: struct chmod_mode_struct *modes;
! 1082: };
1.1 misho 1083:
1.1.1.2 misho 1084: typedef struct filter_struct {
1.1 misho 1085: struct filter_struct *next;
1086: char *pattern;
1.1.1.2 misho 1087: uint32 rflags;
1.1 misho 1088: union {
1089: int slash_cnt;
1090: struct filter_list_struct *mergelist;
1091: } u;
1.1.1.4 ! misho 1092: /* TODO: Use an "extras" mechanism to avoid
! 1093: * allocating this memory when we don't need it. */
! 1094: struct filter_chmod_struct *chmod;
! 1095: uid_t force_uid;
! 1096: gid_t force_gid;
1.1.1.2 misho 1097: } filter_rule;
1.1 misho 1098:
1.1.1.2 misho 1099: typedef struct filter_list_struct {
1100: filter_rule *head;
1101: filter_rule *tail;
1.1 misho 1102: char *debug_type;
1.1.1.2 misho 1103: } filter_rule_list;
1.1 misho 1104:
1105: struct stats {
1106: int64 total_size;
1107: int64 total_transferred_size;
1108: int64 total_written;
1109: int64 total_read;
1110: int64 literal_data;
1111: int64 matched_data;
1112: int64 flist_buildtime;
1113: int64 flist_xfertime;
1114: int64 flist_size;
1.1.1.2 misho 1115: int num_files, num_dirs, num_symlinks, num_devices, num_specials;
1116: int created_files, created_dirs, created_symlinks, created_devices, created_specials;
1117: int deleted_files, deleted_dirs, deleted_symlinks, deleted_devices, deleted_specials;
1118: int xferred_files;
1.1 misho 1119: };
1120:
1121: struct chmod_mode_struct;
1122:
1123: struct flist_ndx_item {
1124: struct flist_ndx_item *next;
1125: int ndx;
1126: };
1127:
1128: typedef struct {
1129: struct flist_ndx_item *head, *tail;
1130: } flist_ndx_list;
1131:
1132: #define EMPTY_ITEM_LIST {NULL, 0, 0}
1133:
1134: typedef struct {
1135: void *items;
1136: size_t count;
1137: size_t malloced;
1138: } item_list;
1139:
1140: #define EXPAND_ITEM_LIST(lp, type, incr) \
1141: (type*)expand_item_list(lp, sizeof (type), #type, incr)
1142:
1143: #define EMPTY_XBUF {NULL, 0, 0, 0}
1144:
1145: typedef struct {
1146: char *buf;
1147: size_t pos; /* pos = read pos in the buf */
1148: size_t len; /* len = chars following pos */
1149: size_t size; /* size = total space in buf */
1150: } xbuf;
1151:
1152: #define INIT_XBUF(xb, str, ln, sz) (xb).buf = (str), (xb).len = (ln), (xb).size = (sz), (xb).pos = 0
1.1.1.2 misho 1153: #define INIT_XBUF_STRLEN(xb, str) (xb).buf = (str), (xb).len = strlen((xb).buf), (xb).size = (size_t)-1, (xb).pos = 0
1.1 misho 1154: /* This one is used to make an output xbuf based on a char[] buffer: */
1155: #define INIT_CONST_XBUF(xb, bf) (xb).buf = (bf), (xb).size = sizeof (bf), (xb).len = (xb).pos = 0
1156:
1157: #define ICB_EXPAND_OUT (1<<0)
1158: #define ICB_INCLUDE_BAD (1<<1)
1159: #define ICB_INCLUDE_INCOMPLETE (1<<2)
1.1.1.2 misho 1160: #define ICB_CIRCULAR_OUT (1<<3)
1161: #define ICB_INIT (1<<4)
1162:
1163: #define IOBUF_KEEP_BUFS 0
1164: #define IOBUF_FREE_BUFS 1
1165:
1166: #define MPLX_SWITCHING IOBUF_KEEP_BUFS
1167: #define MPLX_ALL_DONE IOBUF_FREE_BUFS
1168: #define MPLX_TO_BUFFERED 2
1.1 misho 1169:
1170: #define RL_EOL_NULLS (1<<0)
1171: #define RL_DUMP_COMMENTS (1<<1)
1172: #define RL_CONVERT (1<<2)
1173:
1174: typedef struct {
1175: char name_type;
1.1.1.4 ! misho 1176: #ifdef USE_FLEXIBLE_ARRAY
! 1177: char fname[]; /* has variable size */
! 1178: #else
! 1179: char fname[1]; /* A kluge that should work like a flexible array */
! 1180: #endif
1.1 misho 1181: } relnamecache;
1182:
1.1.1.4 ! misho 1183: #ifdef USE_FLEXIBLE_ARRAY
! 1184: #define RELNAMECACHE_LEN (sizeof (relnamecache))
! 1185: #else
! 1186: #define RELNAMECACHE_LEN (offsetof(relnamecache, fname))
! 1187: #endif
! 1188:
! 1189: #define CSF_ENABLE (1<<1)
! 1190: #define CSF_LAX (1<<2)
! 1191: #define CSF_UPDATE (1<<3)
! 1192: #define CSF_AFFECT_DRYRUN (1<<4)
! 1193:
! 1194: #define CSF_IGNORE_FILES 0
! 1195: #define CSF_LAX_MODE (CSF_ENABLE|CSF_LAX)
! 1196: #define CSF_STRICT_MODE (CSF_ENABLE)
! 1197:
1.1 misho 1198: #include "byteorder.h"
1199: #include "lib/mdigest.h"
1200: #include "lib/wildmatch.h"
1201: #include "lib/permstring.h"
1202: #include "lib/addrinfo.h"
1203:
1204: #ifndef __GNUC__
1205: #define __attribute__(x)
1206: #else
1207: # if __GNUC__ <= 2
1208: # define NORETURN
1209: # endif
1210: #endif
1211:
1212: #define UNUSED(x) x __attribute__((__unused__))
1213: #ifndef NORETURN
1214: #define NORETURN __attribute__((__noreturn__))
1215: #endif
1216:
1217: typedef struct {
1218: STRUCT_STAT st;
1.1.1.4 ! misho 1219: time_t crtime;
1.1 misho 1220: #ifdef SUPPORT_ACLS
1221: struct rsync_acl *acc_acl; /* access ACL */
1222: struct rsync_acl *def_acl; /* default ACL */
1223: #endif
1224: #ifdef SUPPORT_XATTRS
1225: item_list *xattr;
1226: #endif
1227: } stat_x;
1228:
1.1.1.4 ! misho 1229: #define ACL_READY(sx) ((sx).acc_acl != NULL)
! 1230: #define XATTR_READY(sx) ((sx).xattr != NULL)
1.1.1.3 misho 1231:
1.1.1.4 ! misho 1232: #define CLVL_NOT_SPECIFIED INT_MIN
1.1.1.3 misho 1233:
1.1.1.4 ! misho 1234: #define CPRES_AUTO (-1)
! 1235: #define CPRES_NONE 0
! 1236: #define CPRES_ZLIB 1
! 1237: #define CPRES_ZLIBX 2
! 1238: #define CPRES_LZ4 3
! 1239: #define CPRES_ZSTD 4
! 1240:
! 1241: #define NSTR_CHECKSUM 0
! 1242: #define NSTR_COMPRESS 1
! 1243:
! 1244: struct name_num_item {
! 1245: int num;
! 1246: const char *name, *main_name;
! 1247: };
1.1 misho 1248:
1.1.1.4 ! misho 1249: struct name_num_obj {
! 1250: const char *type;
! 1251: const char *negotiated_name;
! 1252: uchar *saw;
! 1253: int saw_len;
! 1254: int negotiated_num;
! 1255: struct name_num_item list[8]; /* A big-enough len (we'll get a compile error if it is ever too small) */
! 1256: };
! 1257:
! 1258: #ifndef __cplusplus
1.1 misho 1259: #include "proto.h"
1.1.1.4 ! misho 1260: #endif
1.1 misho 1261:
1262: #ifndef SUPPORT_XATTRS
1263: #define x_stat(fn,fst,xst) do_stat(fn,fst)
1264: #define x_lstat(fn,fst,xst) do_lstat(fn,fst)
1265: #define x_fstat(fd,fst,xst) do_fstat(fd,fst)
1266: #endif
1267:
1268: /* We have replacement versions of these if they're missing. */
1269: #ifndef HAVE_ASPRINTF
1270: int asprintf(char **ptr, const char *format, ...);
1271: #endif
1272:
1273: #ifndef HAVE_VASPRINTF
1274: int vasprintf(char **ptr, const char *format, va_list ap);
1275: #endif
1276:
1277: #if !defined HAVE_VSNPRINTF || !defined HAVE_C99_VSNPRINTF
1278: #define vsnprintf rsync_vsnprintf
1279: int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
1280: #endif
1281:
1282: #if !defined HAVE_SNPRINTF || !defined HAVE_C99_VSNPRINTF
1283: #define snprintf rsync_snprintf
1284: int snprintf(char *str, size_t count, const char *fmt,...);
1285: #endif
1286:
1287: #ifndef HAVE_STRERROR
1288: extern char *sys_errlist[];
1289: #define strerror(i) sys_errlist[i]
1290: #endif
1291:
1292: #ifndef HAVE_STRCHR
1293: # define strchr index
1294: # define strrchr rindex
1295: #endif
1296:
1297: #ifndef HAVE_ERRNO_DECL
1298: extern int errno;
1299: #endif
1300:
1301: #ifdef HAVE_READLINK
1302: #define SUPPORT_LINKS 1
1.1.1.2 misho 1303: #if !defined NO_SYMLINK_XATTRS && !defined NO_SYMLINK_USER_XATTRS
1304: #define do_readlink(path, buf, bufsiz) readlink(path, buf, bufsiz)
1305: #endif
1.1 misho 1306: #endif
1307: #ifdef HAVE_LINK
1308: #define SUPPORT_HARD_LINKS 1
1309: #endif
1310:
1311: #ifdef HAVE_SIGACTION
1312: #define SIGACTION(n,h) sigact.sa_handler=(h), sigaction((n),&sigact,NULL)
1313: #define signal(n,h) we_need_to_call_SIGACTION_not_signal(n,h)
1314: #else
1315: #define SIGACTION(n,h) signal(n,h)
1316: #endif
1317:
1318: #ifndef EWOULDBLOCK
1319: #define EWOULDBLOCK EAGAIN
1320: #endif
1321:
1322: #ifndef STDIN_FILENO
1323: #define STDIN_FILENO 0
1324: #endif
1325:
1326: #ifndef STDOUT_FILENO
1327: #define STDOUT_FILENO 1
1328: #endif
1329:
1330: #ifndef STDERR_FILENO
1331: #define STDERR_FILENO 2
1332: #endif
1333:
1334: #ifndef S_IRUSR
1335: #define S_IRUSR 0400
1336: #endif
1337:
1338: #ifndef S_IWUSR
1339: #define S_IWUSR 0200
1340: #endif
1341:
1342: #ifndef ACCESSPERMS
1343: #define ACCESSPERMS 0777
1344: #endif
1345:
1346: #ifndef S_ISVTX
1347: #define S_ISVTX 0
1348: #endif
1349:
1350: #define CHMOD_BITS (S_ISUID | S_ISGID | S_ISVTX | ACCESSPERMS)
1351:
1352: #ifndef _S_IFMT
1353: #define _S_IFMT 0170000
1354: #endif
1355:
1356: #ifndef _S_IFLNK
1357: #define _S_IFLNK 0120000
1358: #endif
1359:
1360: #ifndef S_ISLNK
1361: #define S_ISLNK(mode) (((mode) & (_S_IFMT)) == (_S_IFLNK))
1362: #endif
1363:
1364: #ifndef S_ISBLK
1365: #define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK))
1366: #endif
1367:
1368: #ifndef S_ISCHR
1369: #define S_ISCHR(mode) (((mode) & (_S_IFMT)) == (_S_IFCHR))
1370: #endif
1371:
1372: #ifndef S_ISSOCK
1373: #ifdef _S_IFSOCK
1374: #define S_ISSOCK(mode) (((mode) & (_S_IFMT)) == (_S_IFSOCK))
1375: #else
1376: #define S_ISSOCK(mode) (0)
1377: #endif
1378: #endif
1379:
1380: #ifndef S_ISFIFO
1381: #ifdef _S_IFIFO
1382: #define S_ISFIFO(mode) (((mode) & (_S_IFMT)) == (_S_IFIFO))
1383: #else
1384: #define S_ISFIFO(mode) (0)
1385: #endif
1386: #endif
1387:
1388: #ifndef S_ISDIR
1389: #define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
1390: #endif
1391:
1392: #ifndef S_ISREG
1393: #define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG))
1394: #endif
1395:
1396: /* work out what fcntl flag to use for non-blocking */
1397: #ifdef O_NONBLOCK
1398: # define NONBLOCK_FLAG O_NONBLOCK
1399: #elif defined SYSV
1400: # define NONBLOCK_FLAG O_NDELAY
1401: #else
1402: # define NONBLOCK_FLAG FNDELAY
1403: #endif
1404:
1405: #ifndef INADDR_LOOPBACK
1406: #define INADDR_LOOPBACK 0x7f000001
1407: #endif
1408:
1409: #ifndef INADDR_NONE
1410: #define INADDR_NONE 0xffffffff
1411: #endif
1412:
1413: #define IS_SPECIAL(mode) (S_ISSOCK(mode) || S_ISFIFO(mode))
1414: #define IS_DEVICE(mode) (S_ISCHR(mode) || S_ISBLK(mode))
1415:
1416: #define PRESERVE_FILE_TIMES (1<<0)
1417: #define PRESERVE_DIR_TIMES (1<<1)
1418: #define PRESERVE_LINK_TIMES (1<<2)
1419:
1420: /* Initial mask on permissions given to temporary files. Mask off setuid
1421: bits and group access because of potential race-condition security
1422: holes, and mask other access because mode 707 is bizarre */
1423: #define INITACCESSPERMS 0700
1424:
1425: /* handler for null strings in printf format */
1426: #define NS(s) ((s)?(s):"<NULL>")
1427:
1.1.1.4 ! misho 1428: extern char *do_calloc;
! 1429:
1.1 misho 1430: /* Convenient wrappers for malloc and realloc. Use them. */
1.1.1.4 ! misho 1431: #define new(type) ((type*)my_alloc(NULL, sizeof (type), 1, __FILE__, __LINE__))
! 1432: #define new0(type) ((type*)my_alloc(do_calloc, sizeof (type), 1, __FILE__, __LINE__))
! 1433: #define realloc_buf(ptr, num) my_alloc((ptr), (num), 1, __FILE__, __LINE__)
! 1434:
! 1435: #define new_array(type, num) ((type*)my_alloc(NULL, (num), sizeof (type), __FILE__, __LINE__))
! 1436: #define new_array0(type, num) ((type*)my_alloc(do_calloc, (num), sizeof (type), __FILE__, __LINE__))
! 1437: #define realloc_array(ptr, type, num) ((type*)my_alloc((ptr), (num), sizeof (type), __FILE__, __LINE__))
! 1438:
! 1439: #undef strdup
! 1440: #define strdup(s) my_strdup(s, __FILE__, __LINE__)
! 1441:
! 1442: #define out_of_memory(msg) _out_of_memory(msg, __FILE__, __LINE__)
! 1443: #define overflow_exit(msg) _overflow_exit(msg, __FILE__, __LINE__)
1.1 misho 1444:
1445: /* use magic gcc attributes to catch format errors */
1446: void rprintf(enum logcode , const char *, ...)
1447: __attribute__((format (printf, 2, 3)))
1448: ;
1449:
1450: /* This is just like rprintf, but it also tries to print some
1451: * representation of the error code. Normally errcode = errno. */
1452: void rsyserr(enum logcode, int, const char *, ...)
1453: __attribute__((format (printf, 3, 4)))
1454: ;
1455:
1456: /* Make sure that the O_BINARY flag is defined. */
1457: #ifndef O_BINARY
1458: #define O_BINARY 0
1459: #endif
1460:
1461: #ifndef HAVE_STRLCPY
1462: size_t strlcpy(char *d, const char *s, size_t bufsize);
1463: #endif
1464:
1465: #ifndef HAVE_STRLCAT
1466: size_t strlcat(char *d, const char *s, size_t bufsize);
1467: #endif
1468:
1469: #ifndef WEXITSTATUS
1470: #define WEXITSTATUS(stat) ((int)(((stat)>>8)&0xFF))
1471: #endif
1472: #ifndef WIFEXITED
1473: #define WIFEXITED(stat) ((int)((stat)&0xFF) == 0)
1474: #endif
1475:
1476: #define exit_cleanup(code) _exit_cleanup(code, __FILE__, __LINE__)
1477:
1478: #ifdef HAVE_GETEUID
1479: #define MY_UID() geteuid()
1480: #else
1481: #define MY_UID() getuid()
1482: #endif
1483:
1484: #ifdef HAVE_GETEGID
1485: #define MY_GID() getegid()
1486: #else
1487: #define MY_GID() getgid()
1488: #endif
1489:
1490: #ifdef FORCE_FD_ZERO_MEMSET
1491: #undef FD_ZERO
1492: #define FD_ZERO(fdsetp) memset(fdsetp, 0, sizeof (fd_set))
1493: #endif
1494:
1.1.1.2 misho 1495: extern short info_levels[], debug_levels[];
1496:
1497: #define INFO_GTE(flag, lvl) (info_levels[INFO_##flag] >= (lvl))
1498: #define INFO_EQ(flag, lvl) (info_levels[INFO_##flag] == (lvl))
1499: #define DEBUG_GTE(flag, lvl) (debug_levels[DEBUG_##flag] >= (lvl))
1500: #define DEBUG_EQ(flag, lvl) (debug_levels[DEBUG_##flag] == (lvl))
1501:
1502: #define INFO_BACKUP 0
1503: #define INFO_COPY (INFO_BACKUP+1)
1504: #define INFO_DEL (INFO_COPY+1)
1505: #define INFO_FLIST (INFO_DEL+1)
1506: #define INFO_MISC (INFO_FLIST+1)
1507: #define INFO_MOUNT (INFO_MISC+1)
1508: #define INFO_NAME (INFO_MOUNT+1)
1509: #define INFO_PROGRESS (INFO_NAME+1)
1510: #define INFO_REMOVE (INFO_PROGRESS+1)
1511: #define INFO_SKIP (INFO_REMOVE+1)
1512: #define INFO_STATS (INFO_SKIP+1)
1513: #define INFO_SYMSAFE (INFO_STATS+1)
1514:
1515: #define COUNT_INFO (INFO_SYMSAFE+1)
1516:
1517: #define DEBUG_ACL 0
1518: #define DEBUG_BACKUP (DEBUG_ACL+1)
1519: #define DEBUG_BIND (DEBUG_BACKUP+1)
1520: #define DEBUG_CHDIR (DEBUG_BIND+1)
1521: #define DEBUG_CONNECT (DEBUG_CHDIR+1)
1522: #define DEBUG_CMD (DEBUG_CONNECT+1)
1.1.1.4 ! misho 1523: #define DEBUG_DB (DEBUG_CMD+1)
! 1524: #define DEBUG_DEL (DEBUG_DB+1)
1.1.1.2 misho 1525: #define DEBUG_DELTASUM (DEBUG_DEL+1)
1526: #define DEBUG_DUP (DEBUG_DELTASUM+1)
1527: #define DEBUG_EXIT (DEBUG_DUP+1)
1528: #define DEBUG_FILTER (DEBUG_EXIT+1)
1529: #define DEBUG_FLIST (DEBUG_FILTER+1)
1530: #define DEBUG_FUZZY (DEBUG_FLIST+1)
1531: #define DEBUG_GENR (DEBUG_FUZZY+1)
1532: #define DEBUG_HASH (DEBUG_GENR+1)
1.1.1.4 ! misho 1533: #define DEBUG_HASHLINK (DEBUG_HASH+1)
! 1534: #define DEBUG_HLINK (DEBUG_HASHLINK+1)
1.1.1.2 misho 1535: #define DEBUG_ICONV (DEBUG_HLINK+1)
1536: #define DEBUG_IO (DEBUG_ICONV+1)
1.1.1.4 ! misho 1537: #define DEBUG_NSTR (DEBUG_IO+1)
! 1538: #define DEBUG_OWN (DEBUG_NSTR+1)
1.1.1.2 misho 1539: #define DEBUG_PROTO (DEBUG_OWN+1)
1540: #define DEBUG_RECV (DEBUG_PROTO+1)
1541: #define DEBUG_SEND (DEBUG_RECV+1)
1542: #define DEBUG_TIME (DEBUG_SEND+1)
1543:
1544: #define COUNT_DEBUG (DEBUG_TIME+1)
1.1 misho 1545:
1546: #ifndef HAVE_INET_NTOP
1547: const char *inet_ntop(int af, const void *src, char *dst, size_t size);
1548: #endif
1549:
1550: #ifndef HAVE_INET_PTON
1551: int inet_pton(int af, const char *src, void *dst);
1552: #endif
1553:
1.1.1.2 misho 1554: #ifndef HAVE_GETPASS
1555: char *getpass(const char *prompt);
1556: #endif
1557:
1.1 misho 1558: #ifdef MAINTAINER_MODE
1559: const char *get_panic_action(void);
1560: #endif
1.1.1.4 ! misho 1561:
! 1562: #define NOISY_DEATH(msg) do { \
! 1563: fprintf(stderr, "%s in %s at line %d\n", msg, __FILE__, __LINE__); \
! 1564: exit_cleanup(RERR_UNSUPPORTED); \
! 1565: } while (0)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>