From dfb1da725316bcf6ad5c67f3337c9eea7cc668fd Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 19 Aug 2024 09:45:43 -0700 Subject: [PATCH] Fewer macros in incremen.c * src/incremen.c (DIRF_INIT, DIRF_NFS, DIRF_FOUND, DIRF_NEW) (DIRF_RENAMED, DIR_IS_INITED, DIR_IS_NFS, DIR_IS_FOUND) (DIR_IS_RENAMED, DIR_SET_FLAG, DIR_CLEAR_FLAG, NFS_FILE_STAT) (PD_FORCE_CHILDREN, PD_FORCE_INIT, PD_CHILDREN) (TAR_INCREMENTAL_VERSION, TEMP_DIR_TEMPLATE): Now constants or (lowercased) functions, not macros. (ST_DEV_MSB) [!HAVE_ST_FSTYPE_STRING]: Remove. Replace only use with something simpler. --- src/incremen.c | 149 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 50 deletions(-) diff --git a/src/incremen.c b/src/incremen.c index 9ef64ec0..2a8dca76 100644 --- a/src/incremen.c +++ b/src/incremen.c @@ -33,30 +33,31 @@ enum children ALL_CHILDREN }; -#define DIRF_INIT 0x0001 /* directory structure is initialized - (procdir called at least once) */ -#define DIRF_NFS 0x0002 /* directory is mounted on nfs */ -#define DIRF_FOUND 0x0004 /* directory is found on fs */ -#define DIRF_NEW 0x0008 /* directory is new (not found - in the previous dump) */ -#define DIRF_RENAMED 0x0010 /* Last target in a chain of renames */ -/* A directory which is renamed from another one is recognized by its - orig member, which is not-NULL. This directory may eventually be - the source for another rename, in which case it will be pointed to by - the orig member of another directory structure. The last directory - in such a chain of renames (the one which is not pointed to by any - other orig) is marked with the DIRF_RENAMED flag. This marks a starting - point from which append_incremental_renames starts encoding renames for - this chain. */ - -#define DIR_IS_INITED(d) ((d)->flags & DIRF_INIT) -#define DIR_IS_NFS(d) ((d)->flags & DIRF_NFS) -#define DIR_IS_FOUND(d) ((d)->flags & DIRF_FOUND) -/* #define DIR_IS_NEW(d) ((d)->flags & DIRF_NEW) FIXME: not used */ -#define DIR_IS_RENAMED(d) ((d)->flags & DIRF_RENAMED) - -#define DIR_SET_FLAG(d,f) (d)->flags |= (f) -#define DIR_CLEAR_FLAG(d,f) (d)->flags &= ~(f) +enum + { + /* Directory structure is initialized (procdir called at least once). */ + DIRF_INIT = 1 << 0, + + /* Directory is mounted on nfs. */ + DIRF_NFS = 1 << 1, + + /* Directory is found on fs. */ + DIRF_FOUND = 1 << 2, + + /* Directory is new (not found in the previous dump). */ + DIRF_NEW = 1 << 3, + + /* Last target in a chain of renames. + A directory which is renamed from another one is recognized by its + orig member, which is not-NULL. This directory may eventually be + the source for another rename, in which case it will be pointed to by + the orig member of another directory structure. The last directory + in such a chain of renames (the one which is not pointed to by any + other orig) is marked with the DIRF_RENAMED flag. This marks a starting + point from which append_incremental_renames starts encoding renames for + this chain. */ + DIRF_RENAMED= 1 << 4 + }; struct dumpdir /* Dump directory listing */ { @@ -86,6 +87,45 @@ struct directory char *name; /* file name of directory */ }; +static bool +dir_is_inited (struct directory const *d) +{ + return !!(d->flags & DIRF_INIT); +} +static bool +dir_is_nfs (struct directory const *d) +{ + return !!(d->flags & DIRF_NFS); +} +static bool +dir_is_found (struct directory const *d) +{ + return !!(d->flags & DIRF_FOUND); +} +#if false +/* FIXME: not used. */ +static bool +dir_is_new (struct directory const *d) +{ + return !!(d->flags & DIRF_NEW); +} +#endif +static bool +dir_is_renamed (struct directory const *d) +{ + return !!(d->flags & DIRF_RENAMED); +} +static void +dir_set_flag (struct directory *d, int f) +{ + d->flags |= f; +} +static void +dir_clear_flag (struct directory *d, int f) +{ + d->flags &= ~f; +} + static struct dumpdir * dumpdir_create0 (const char *contents, const char *cmask) { @@ -212,13 +252,15 @@ static struct directory *dirhead, *dirtail; static Hash_table *directory_table; static Hash_table *directory_meta_table; +static bool +nfs_file_stat (struct stat const *st) +{ #if HAVE_ST_FSTYPE_STRING - static char const nfs_string[] = "nfs"; -# define NFS_FILE_STAT(st) (strcmp ((st).st_fstype, nfs_string) == 0) + return strcmp (st->st_fstype, "nfs") == 0; #else -# define ST_DEV_MSB(st) (~ (dev_t) 0 << (TYPE_WIDTH ((st).st_dev) - 1)) -# define NFS_FILE_STAT(st) (((st).st_dev & ST_DEV_MSB (st)) != 0) + return (st->st_dev >> (TYPE_WIDTH (st->st_dev) - 1)) & 1; #endif +} /* Calculate the hash of a directory. */ static size_t @@ -338,9 +380,9 @@ note_directory (char const *name, struct timespec mtime, directory->inode_number = ino; directory->children = CHANGED_CHILDREN; if (nfs) - DIR_SET_FLAG (directory, DIRF_NFS); + dir_set_flag (directory, DIRF_NFS); if (found) - DIR_SET_FLAG (directory, DIRF_FOUND); + dir_set_flag (directory, DIRF_FOUND); if (contents) directory->dump = dumpdir_create (contents); else @@ -438,9 +480,16 @@ update_parent_directory (struct tar_stat_info *parent) } } -#define PD_FORCE_CHILDREN 0x10 -#define PD_FORCE_INIT 0x20 -#define PD_CHILDREN(f) ((f) & 3) +enum + { + PD_FORCE_CHILDREN = 0x10, + PD_FORCE_INIT = 0x20, + }; +static enum children +pd_children (int f) +{ + return f & 3; +} static struct directory * procdir (const char *name_buffer, struct tar_stat_info *st, @@ -449,12 +498,12 @@ procdir (const char *name_buffer, struct tar_stat_info *st, { struct directory *directory; struct stat *stat_data = &st->stat; - bool nfs = NFS_FILE_STAT (*stat_data); + bool nfs = nfs_file_stat (stat_data); bool perhaps_renamed = false; if ((directory = find_directory (name_buffer)) != NULL) { - if (DIR_IS_INITED (directory)) + if (dir_is_inited (directory)) { if (flag & PD_FORCE_INIT) { @@ -481,7 +530,7 @@ procdir (const char *name_buffer, struct tar_stat_info *st, relying on the i-node to establish differences. */ if (! ((!check_device_option - || (DIR_IS_NFS (directory) && nfs) + || (dir_is_nfs (directory) && nfs) || directory->device_number == stat_data->st_dev) && directory->inode_number == stat_data->st_ino)) { @@ -497,8 +546,8 @@ procdir (const char *name_buffer, struct tar_stat_info *st, quotearg_colon (name_buffer), quote_n (1, d->name)); directory->orig = d; - DIR_SET_FLAG (directory, DIRF_RENAMED); - DIR_CLEAR_FLAG (d, DIRF_RENAMED); + dir_set_flag (directory, DIRF_RENAMED); + dir_clear_flag (d, DIRF_RENAMED); dirlist_replace_prefix (d->name, name_buffer); } directory->children = CHANGED_CHILDREN; @@ -511,12 +560,12 @@ procdir (const char *name_buffer, struct tar_stat_info *st, directory->inode_number = stat_data->st_ino; } if (nfs) - DIR_SET_FLAG (directory, DIRF_NFS); + dir_set_flag (directory, DIRF_NFS); } else directory->children = CHANGED_CHILDREN; - DIR_SET_FLAG (directory, DIRF_FOUND); + dir_set_flag (directory, DIRF_FOUND); } else { @@ -540,15 +589,15 @@ procdir (const char *name_buffer, struct tar_stat_info *st, quotearg_colon (name_buffer), quote_n (1, d->name)); directory->orig = d; - DIR_SET_FLAG (directory, DIRF_RENAMED); - DIR_CLEAR_FLAG (d, DIRF_RENAMED); + dir_set_flag (directory, DIRF_RENAMED); + dir_clear_flag (d, DIRF_RENAMED); dirlist_replace_prefix (d->name, name_buffer); } directory->children = CHANGED_CHILDREN; } else { - DIR_SET_FLAG (directory, DIRF_NEW); + dir_set_flag (directory, DIRF_NEW); warnopt (WARN_NEW_DIRECTORY, 0, _("%s: Directory is new"), quotearg_colon (name_buffer)); directory->children = @@ -582,7 +631,7 @@ procdir (const char *name_buffer, struct tar_stat_info *st, else if (flag & PD_FORCE_CHILDREN) { - directory->children = PD_CHILDREN(flag); + directory->children = pd_children (flag); if (directory->children == NO_CHILDREN) *entry = 'N'; } @@ -591,7 +640,7 @@ procdir (const char *name_buffer, struct tar_stat_info *st, warnopt (WARN_RENAME_DIRECTORY, 0, _("%s: Directory has been renamed"), quotearg_colon (name_buffer)); - DIR_SET_FLAG (directory, DIRF_INIT); + dir_set_flag (directory, DIRF_INIT); if (directory->children != NO_CHILDREN) { @@ -942,7 +991,7 @@ append_incremental_renames (struct directory *dir) size = 0; for (dp = dirhead; dp; dp = dp->next) - if (DIR_IS_RENAMED (dp)) + if (dir_is_renamed (dp)) store_rename (dp, &stk); /* FIXME: Is this the right thing to do when DIR is null? */ @@ -967,7 +1016,7 @@ static FILE *listed_incremental_stream; 0 up to TAR_INCREMENTAL_VERSION, inclusive. It is able to create only snapshots of TAR_INCREMENTAL_VERSION */ -#define TAR_INCREMENTAL_VERSION 2 +enum { TAR_INCREMENTAL_VERSION = 2 }; /* Read incremental snapshot formats 0 and 1 */ static void @@ -1387,12 +1436,12 @@ write_directory_file_entry (void *entry, void *data) struct directory const *directory = entry; FILE *fp = data; - if (DIR_IS_FOUND (directory)) + if (dir_is_found (directory)) { char buf[SYSINT_BUFSIZE]; char const *s; - s = DIR_IS_NFS (directory) ? "1" : "0"; + s = dir_is_nfs (directory) ? "1" : "0"; fwrite (s, 2, 1, fp); s = timetostr (directory->mtime.tv_sec, buf); fwrite (s, strlen (s) + 1, 1, fp); @@ -1612,7 +1661,7 @@ try_purge_directory (char const *directory_name) { if (*arc == 'X') { -#define TEMP_DIR_TEMPLATE "tar.XXXXXX" + static char const TEMP_DIR_TEMPLATE[] = "tar.XXXXXX"; size_t len = strlen (arc + 1); temp_stub = xrealloc (temp_stub, len + 1 + sizeof TEMP_DIR_TEMPLATE); memcpy (temp_stub, arc + 1, len); -- 2.47.3