Mercurial > hg > toybox
changeset 885:beb32d780164
Add library function for the file permission formatting in ls and stat
author | Felix Janda <felix.janda@posteo.de> |
---|---|
date | Mon, 22 Apr 2013 22:29:43 +0200 |
parents | ac9991f66d0d |
children | 6bb5c8ace240 |
files | lib/lib.c lib/lib.h toys/pending/stat.c toys/posix/ls.c |
diffstat | 4 files changed, 31 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/lib.c Sat Apr 27 00:57:11 2013 -0500 +++ b/lib/lib.c Mon Apr 22 22:29:43 2013 +0200 @@ -1176,6 +1176,32 @@ error_exit("bad mode '%s'", modestr); } +// Format a mode for ls and stat +void format_mode(char (*buf)[11], mode_t mode) +{ + char c, d; + int i, bit; + + (*buf)[10]=0; + for (i=0; i<9; i++) { + bit = mode & (1<<i); + c = i%3; + if (!c && (mode & (1<<((d=i/3)+9)))) { + c = "tss"[d]; + if (!bit) c &= ~0x20; + } else c = bit ? "xwr"[c] : '-'; + (*buf)[9-i] = c; + } + + if (S_ISDIR(mode)) c = 'd'; + else if (S_ISBLK(mode)) c = 'b'; + else if (S_ISCHR(mode)) c = 'c'; + else if (S_ISLNK(mode)) c = 'l'; + else if (S_ISFIFO(mode)) c = 'p'; + else if (S_ISSOCK(mode)) c = 's'; + else c = '-'; + **buf = c; +} char* make_human_readable(unsigned long long size, unsigned long unit) {
--- a/lib/lib.h Sat Apr 27 00:57:11 2013 -0500 +++ b/lib/lib.h Mon Apr 22 22:29:43 2013 +0200 @@ -178,6 +178,7 @@ char *num_to_sig(int sig); mode_t string_to_mode(char *mode_str, mode_t base); +void format_mode(char (*buf)[11], mode_t mode); // password helper functions int read_password(char * buff, int buflen, char* mesg);
--- a/toys/pending/stat.c Sat Apr 27 00:57:11 2013 -0500 +++ b/toys/pending/stat.c Mon Apr 22 22:29:43 2013 +0200 @@ -50,7 +50,7 @@ GLOBALS( char *fmt; - char *access_str; + char access_str[11]; char *file_type; struct passwd *user_name; struct group *group_name; @@ -86,25 +86,6 @@ if (S_ISSOCK(mode)) return "socket"; } -static char * get_access_str(unsigned long permission, mode_t mode) -{ - static char access_string[11]; - char *s = access_string; - char *rwx[] = {"---", "--x", "-w-", "-wx", - "r--", "r-x", "rw-", "rwx"}; - - if (S_ISDIR(mode)) *s = 'd'; - else *s = '-'; - - for (s += 7; s > access_string; s-=3) { - memcpy(s, rwx[permission & 7], 3); - permission >>= 3; - } - - access_string[10] = '\0'; - return access_string; -} - static char * date_stat_format(time_t time) { static char buf[36]; @@ -252,7 +233,7 @@ TT.user_name = getpwuid(TT.toystat->st_uid); TT.group_name = getgrgid(TT.toystat->st_gid); // function to get access in human readable format - TT.access_str = get_access_str(TT.toystat->st_mode & ~S_IFMT, TT.toystat->st_mode); + format_mode(&TT.access_str, TT.toystat->st_mode); } else do_statfs(*toys.optargs); print_stat_format(fmts[!flag_c*flag_f+flag_c], flag_f); }
--- a/toys/posix/ls.c Sat Apr 27 00:57:11 2013 -0500 +++ b/toys/posix/ls.c Mon Apr 22 22:29:43 2013 +0200 @@ -335,28 +335,9 @@ if (flags & (FLAG_l|FLAG_o|FLAG_n|FLAG_g)) { struct tm *tm; - char perm[11], thyme[64], c, d, *usr, *upad, *grp, *grpad; - int i, bit; + char perm[11], thyme[64], *usr, *upad, *grp, *grpad; - perm[10]=0; - for (i=0; i<9; i++) { - bit = mode & (1<<i); - c = i%3; - if (!c && (mode & (1<<((d=i/3)+9)))) { - c = "tss"[d]; - if (!bit) c &= ~0x20; - } else c = bit ? "xwr"[c] : '-'; - perm[9-i] = c; - } - - if (S_ISDIR(mode)) c = 'd'; - else if (S_ISBLK(mode)) c = 'b'; - else if (S_ISCHR(mode)) c = 'c'; - else if (S_ISLNK(mode)) c = 'l'; - else if (S_ISFIFO(mode)) c = 'p'; - else if (S_ISSOCK(mode)) c = 's'; - else c = '-'; - *perm = c; + format_mode(&perm, mode); tm = localtime(&(st->st_mtime)); strftime(thyme, sizeof(thyme), "%F %H:%M", tm);