|
|
@@ -3360,59 +3360,38 @@ static char *coolsize(off_t size) |
|
|
|
return size_buf; |
|
|
|
} |
|
|
|
|
|
|
|
static char get_ind(mode_t mode, bool perms, uchar *pair) |
|
|
|
/* Convert a mode field into "ls -l" type perms field. */ |
|
|
|
static char *get_lsperms(mode_t mode) |
|
|
|
{ |
|
|
|
static const char * const rwx[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}; |
|
|
|
static char bits[11] = {'\0'}; |
|
|
|
|
|
|
|
switch (mode & S_IFMT) { |
|
|
|
case S_IFREG: |
|
|
|
if (perms) |
|
|
|
return '-'; |
|
|
|
if (mode & 0100) { |
|
|
|
*pair = C_EXE; |
|
|
|
return '*'; |
|
|
|
} |
|
|
|
*pair = C_FIL; |
|
|
|
return '\0'; |
|
|
|
bits[0] = '-'; |
|
|
|
break; |
|
|
|
case S_IFDIR: |
|
|
|
if (perms) |
|
|
|
return 'd'; |
|
|
|
*pair = C_DIR; |
|
|
|
return '/'; |
|
|
|
bits[0] = 'd'; |
|
|
|
break; |
|
|
|
case S_IFLNK: |
|
|
|
return perms ? 'l' : '@'; |
|
|
|
bits[0] = 'l'; |
|
|
|
break; |
|
|
|
case S_IFSOCK: |
|
|
|
if (perms) |
|
|
|
return 's'; |
|
|
|
*pair = C_SOC; |
|
|
|
return '='; |
|
|
|
bits[0] = 's'; |
|
|
|
break; |
|
|
|
case S_IFIFO: |
|
|
|
if (perms) |
|
|
|
return 'p'; |
|
|
|
*pair = C_PIP; |
|
|
|
return '|'; |
|
|
|
bits[0] = 'p'; |
|
|
|
break; |
|
|
|
case S_IFBLK: |
|
|
|
if (perms) |
|
|
|
return 'b'; |
|
|
|
*pair = C_BLK; |
|
|
|
return '\0'; |
|
|
|
bits[0] = 'b'; |
|
|
|
break; |
|
|
|
case S_IFCHR: |
|
|
|
if (perms) |
|
|
|
return 'c'; |
|
|
|
*pair = C_CHR; |
|
|
|
return '\0'; |
|
|
|
bits[0] = 'c'; |
|
|
|
break; |
|
|
|
default: |
|
|
|
if (!perms) |
|
|
|
*pair = C_UND; |
|
|
|
return '?'; |
|
|
|
bits[0] = '?'; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Convert a mode field into "ls -l" type perms field. */ |
|
|
|
static char *get_lsperms(mode_t mode) |
|
|
|
{ |
|
|
|
static const char * const rwx[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}; |
|
|
|
static char bits[11] = {'\0'}; |
|
|
|
|
|
|
|
bits[0] = get_ind(mode, TRUE, NULL); |
|
|
|
|
|
|
|
xstrsncpy(&bits[1], rwx[(mode >> 6) & 7], 4); |
|
|
|
xstrsncpy(&bits[4], rwx[(mode >> 3) & 7], 4); |
|
|
@@ -3439,30 +3418,63 @@ static void print_time(const time_t *timep) |
|
|
|
static void printent(const struct entry *ent, uint namecols, bool sel) |
|
|
|
{ |
|
|
|
uchar pair = 0; |
|
|
|
char ind = get_ind(ent->mode, FALSE, &pair); |
|
|
|
char ind = '\0'; |
|
|
|
int attrs = sel ? A_REVERSE : 0; |
|
|
|
|
|
|
|
if (g_state.ctxcolor) { |
|
|
|
if (ind == '@') { |
|
|
|
if (ent->flags & DIR_OR_LINK_TO_DIR) |
|
|
|
ind = '/'; |
|
|
|
attrs |= A_DIM; |
|
|
|
} else if (ent->flags & HARD_LINK) |
|
|
|
attrs |= A_DIM; |
|
|
|
} else { |
|
|
|
if (ind == '@') { |
|
|
|
if (ent->flags & DIR_OR_LINK_TO_DIR) { |
|
|
|
ind = '/'; |
|
|
|
attrs |= A_BOLD; |
|
|
|
} |
|
|
|
pair = (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK; |
|
|
|
} else if (!ent->size && (pair == C_FIL || pair == C_EXE)) |
|
|
|
switch (ent->mode & S_IFMT) { |
|
|
|
case S_IFREG: |
|
|
|
if (ent->mode & 0100) { |
|
|
|
pair = C_EXE; |
|
|
|
ind = '*'; |
|
|
|
} |
|
|
|
|
|
|
|
if (ent->flags & HARD_LINK) |
|
|
|
pair = C_HRD; |
|
|
|
|
|
|
|
if (!ent->size) |
|
|
|
pair = C_UND; |
|
|
|
else if (pair == C_DIR) |
|
|
|
else if (!pair) |
|
|
|
pair = C_FIL; |
|
|
|
break; |
|
|
|
case S_IFDIR: |
|
|
|
pair = C_DIR; |
|
|
|
attrs |= A_BOLD; |
|
|
|
ind = '/'; |
|
|
|
break; |
|
|
|
case S_IFLNK: |
|
|
|
if (ent->flags & DIR_OR_LINK_TO_DIR) { |
|
|
|
attrs |= A_BOLD; |
|
|
|
else if (ent->flags & HARD_LINK) |
|
|
|
pair = C_HRD; |
|
|
|
else if (ent->flags & FILE_MISSING) |
|
|
|
ind = '/'; |
|
|
|
} else |
|
|
|
ind = '@'; |
|
|
|
|
|
|
|
if (g_state.ctxcolor) |
|
|
|
attrs |= A_DIM; |
|
|
|
else |
|
|
|
pair = (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK; |
|
|
|
break; |
|
|
|
case S_IFSOCK: |
|
|
|
pair = C_SOC; |
|
|
|
ind = '='; |
|
|
|
break; |
|
|
|
case S_IFIFO: |
|
|
|
pair = C_PIP; |
|
|
|
ind = '|'; |
|
|
|
break; |
|
|
|
case S_IFBLK: |
|
|
|
pair = C_BLK; |
|
|
|
break; |
|
|
|
case S_IFCHR: |
|
|
|
pair = C_CHR; |
|
|
|
break; |
|
|
|
default: |
|
|
|
pair = C_UND; |
|
|
|
ind = '?'; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (!g_state.ctxcolor) { |
|
|
|
if (ent->flags & FILE_MISSING) |
|
|
|
pair = C_MIS; |
|
|
|
|
|
|
|
if (pair && fcolors[pair]) |
|
|
@@ -3532,6 +3544,7 @@ static void printent_long(const struct entry *ent, uint namecols, bool sel) |
|
|
|
pair = C_EXE; |
|
|
|
ind2 = '*'; |
|
|
|
} |
|
|
|
|
|
|
|
if (ent->flags & HARD_LINK) { |
|
|
|
pair = C_HRD; |
|
|
|
ln = TRUE; |
|
|
@@ -3589,17 +3602,19 @@ static void printent_long(const struct entry *ent, uint namecols, bool sel) |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (ent->flags & FILE_MISSING) |
|
|
|
pair = C_MIS; |
|
|
|
|
|
|
|
addstr(" "); |
|
|
|
if (!(ln && g_state.ctxcolor)) { |
|
|
|
attroff(A_DIM); |
|
|
|
attrs ^= A_DIM; |
|
|
|
|
|
|
|
if (!g_state.ctxcolor && pair && fcolors[pair]) { |
|
|
|
attrs |= COLOR_PAIR(pair); |
|
|
|
attron(attrs); |
|
|
|
if (!g_state.ctxcolor) { |
|
|
|
if (ent->flags & FILE_MISSING) |
|
|
|
pair = C_MIS; |
|
|
|
|
|
|
|
if (pair && fcolors[pair]) { |
|
|
|
attrs |= COLOR_PAIR(pair); |
|
|
|
attron(attrs); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#ifndef NOLOCALE |
|
|
|