diff options
author | Arun Prakash Jana <engineerarun@gmail.com> | 2020-02-27 18:49:44 +0530 |
---|---|---|
committer | Arun Prakash Jana <engineerarun@gmail.com> | 2020-02-27 18:49:44 +0530 |
commit | 95356681ffc24987daeda46c8fb3fb5b04d9952f (patch) | |
tree | 079641c24306cb983f630bc6091c27d379318a57 /src/nnn.c | |
parent | 74e77f78fa9d4e89c9b2660997545528d2d1a2a3 (diff) | |
download | nnn-95356681ffc24987daeda46c8fb3fb5b04d9952f.tar.gz |
Fix handling hard-links
Diffstat (limited to 'src/nnn.c')
-rw-r--r-- | src/nnn.c | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -165,7 +165,7 @@ #define BLK_SHIFT_512 9 /* Detect hardlinks in du */ -#define HASH_BITS (0xFFFF) +#define HASH_BITS (0xFFFFFF) #define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */ /* Program return codes */ @@ -700,8 +700,10 @@ static char *xitoa(uint val) /* * Source: https://elixir.bootlin.com/linux/latest/source/arch/alpha/include/asm/bitops.h */ -static bool test_set_bit(ulong nr) +static bool test_set_bit(uint nr) { + nr &= HASH_BITS; + ull *m = ((ull *)ihashbmp) + (nr >> 6); if (*m & (1 << (nr & 63))) @@ -713,8 +715,10 @@ static bool test_set_bit(ulong nr) } #if 0 -static bool test_clear_bit(ulong nr) +static bool test_clear_bit(uint nr) { + nr &= HASH_BITS; + ull *m = ((ull *) ihashbmp) + (nr >> 6); if (!(*m & (1 << (nr & 63)))) @@ -4189,7 +4193,7 @@ static void launch_app(const char *path, char *newpath) static int sum_bsize(const char *UNUSED(fpath), const struct stat *sb, int typeflag, struct FTW *UNUSED(ftwbuf)) { if (sb->st_blocks && (typeflag == FTW_F || typeflag == FTW_D) - && (sb->st_nlink <= 1 || test_set_bit((ulong)sb->st_ino + (ulong)sb->st_size))) + && (sb->st_nlink <= 1 || test_set_bit((uint)sb->st_ino))) ent_blocks += sb->st_blocks; ++num_files; @@ -4199,7 +4203,7 @@ static int sum_bsize(const char *UNUSED(fpath), const struct stat *sb, int typef static int sum_asize(const char *UNUSED(fpath), const struct stat *sb, int typeflag, struct FTW *UNUSED(ftwbuf)) { if (sb->st_size && (typeflag == FTW_F || typeflag == FTW_D) - && (sb->st_nlink <= 1 || test_set_bit((ulong)sb->st_ino + (ulong)sb->st_size))) + && (sb->st_nlink <= 1 || test_set_bit((uint)sb->st_ino))) ent_blocks += sb->st_size; ++num_files; @@ -4319,8 +4323,7 @@ static int dentfill(char *path, struct entry **dents) } } else { /* Do not recount hard links */ - if (sb.st_nlink <= 1 - || test_set_bit((ulong)sb.st_ino + (ulong)sb.st_size)) + if (sb.st_nlink <= 1 || test_set_bit((uint)sb.st_ino)) dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks); ++num_files; } @@ -4417,8 +4420,7 @@ static int dentfill(char *path, struct entry **dents) } else { dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks); /* Do not recount hard links */ - if (sb.st_nlink <= 1 - || test_set_bit((ulong)sb.st_ino + (ulong)sb.st_size)) + if (sb.st_nlink <= 1 || test_set_bit((uint)sb.st_ino)) dir_blocks += dentp->blocks; ++num_files; } |