aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Janda <felix.janda@posteo.de>2013-04-22 22:29:43 +0200
committerFelix Janda <felix.janda@posteo.de>2013-04-22 22:29:43 +0200
commit5a221e6b84e9eab02e24ca541530e28eb7cfddac (patch)
treeffa01832e66ea605e40c5e6c730b22b6088b121d
parentb4a86ac3ab6a248b5345557a4c9f1efba7695246 (diff)
downloadtoybox-5a221e6b84e9eab02e24ca541530e28eb7cfddac.tar.gz
Add library function for the file permission formatting in ls and stat
-rw-r--r--lib/lib.c26
-rw-r--r--lib/lib.h1
-rw-r--r--toys/pending/stat.c23
-rw-r--r--toys/posix/ls.c23
4 files changed, 31 insertions, 42 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 4d8e23a4..b89f2db8 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -1176,6 +1176,32 @@ barf:
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)
{
diff --git a/lib/lib.h b/lib/lib.h
index ab858f90..a4da031c 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -178,6 +178,7 @@ int sig_to_num(char *pidstr);
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);
diff --git a/toys/pending/stat.c b/toys/pending/stat.c
index 4ce2548b..9710acff 100644
--- a/toys/pending/stat.c
+++ b/toys/pending/stat.c
@@ -50,7 +50,7 @@ config STAT
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 @@ static char * check_type_file(mode_t mode, size_t size)
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 @@ void stat_main(void)
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);
}
diff --git a/toys/posix/ls.c b/toys/posix/ls.c
index 5982adfe..76fb7947 100644
--- a/toys/posix/ls.c
+++ b/toys/posix/ls.c
@@ -335,28 +335,9 @@ static void listfiles(int dirfd, struct dirtree *indir)
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;
-
- 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;
- }
+ char perm[11], thyme[64], *usr, *upad, *grp, *grpad;
- 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);