mirror of
https://github.com/jarun/nnn.git
synced 2024-12-01 02:49:44 +00:00
Fix handling hard-links
This commit is contained in:
parent
74e77f78fa
commit
95356681ff
20
src/nnn.c
20
src/nnn.c
|
@ -165,7 +165,7 @@
|
||||||
#define BLK_SHIFT_512 9
|
#define BLK_SHIFT_512 9
|
||||||
|
|
||||||
/* Detect hardlinks in du */
|
/* Detect hardlinks in du */
|
||||||
#define HASH_BITS (0xFFFF)
|
#define HASH_BITS (0xFFFFFF)
|
||||||
#define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */
|
#define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */
|
||||||
|
|
||||||
/* Program return codes */
|
/* 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
|
* 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);
|
ull *m = ((ull *)ihashbmp) + (nr >> 6);
|
||||||
|
|
||||||
if (*m & (1 << (nr & 63)))
|
if (*m & (1 << (nr & 63)))
|
||||||
|
@ -713,8 +715,10 @@ static bool test_set_bit(ulong nr)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#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);
|
ull *m = ((ull *) ihashbmp) + (nr >> 6);
|
||||||
|
|
||||||
if (!(*m & (1 << (nr & 63))))
|
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))
|
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)
|
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;
|
ent_blocks += sb->st_blocks;
|
||||||
|
|
||||||
++num_files;
|
++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))
|
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)
|
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;
|
ent_blocks += sb->st_size;
|
||||||
|
|
||||||
++num_files;
|
++num_files;
|
||||||
|
@ -4319,8 +4323,7 @@ static int dentfill(char *path, struct entry **dents)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Do not recount hard links */
|
/* Do not recount hard links */
|
||||||
if (sb.st_nlink <= 1
|
if (sb.st_nlink <= 1 || test_set_bit((uint)sb.st_ino))
|
||||||
|| test_set_bit((ulong)sb.st_ino + (ulong)sb.st_size))
|
|
||||||
dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks);
|
dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks);
|
||||||
++num_files;
|
++num_files;
|
||||||
}
|
}
|
||||||
|
@ -4417,8 +4420,7 @@ static int dentfill(char *path, struct entry **dents)
|
||||||
} else {
|
} else {
|
||||||
dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks);
|
dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks);
|
||||||
/* Do not recount hard links */
|
/* Do not recount hard links */
|
||||||
if (sb.st_nlink <= 1
|
if (sb.st_nlink <= 1 || test_set_bit((uint)sb.st_ino))
|
||||||
|| test_set_bit((ulong)sb.st_ino + (ulong)sb.st_size))
|
|
||||||
dir_blocks += dentp->blocks;
|
dir_blocks += dentp->blocks;
|
||||||
++num_files;
|
++num_files;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue