Add -i option to toolbox cmd ls

Change-Id: I4690fc10dc07bf1883bcf8ec18399235dc97d317
This commit is contained in:
William Roberts 2013-04-03 16:01:30 -07:00
parent 02e8d73079
commit 403b195548

View file

@ -28,6 +28,7 @@
#define LIST_LONG_NUMERIC (1 << 5) #define LIST_LONG_NUMERIC (1 << 5)
#define LIST_CLASSIFY (1 << 6) #define LIST_CLASSIFY (1 << 6)
#define LIST_MACLABEL (1 << 7) #define LIST_MACLABEL (1 << 7)
#define LIST_INODE (1 << 8)
// fwd // fwd
static int listpath(const char *name, int flags); static int listpath(const char *name, int flags);
@ -127,22 +128,20 @@ static int show_total_size(const char *dirname, DIR *d, int flags)
return 0; return 0;
} }
static int listfile_size(const char *path, const char *filename, int flags) static int listfile_size(const char *path, const char *filename, struct stat *s,
int flags)
{ {
struct stat s; if(!s || !path) {
if (lstat(path, &s) < 0) {
fprintf(stderr, "lstat '%s' failed: %s\n", path, strerror(errno));
return -1; return -1;
} }
/* blocks are 512 bytes, we want output to be KB */ /* blocks are 512 bytes, we want output to be KB */
if ((flags & LIST_SIZE) != 0) { if ((flags & LIST_SIZE) != 0) {
printf("%lld ", s.st_blocks / 2); printf("%lld ", s->st_blocks / 2);
} }
if ((flags & LIST_CLASSIFY) != 0) { if ((flags & LIST_CLASSIFY) != 0) {
char filetype = mode2kind(s.st_mode); char filetype = mode2kind(s->st_mode);
if (filetype != 'l') { if (filetype != 'l') {
printf("%c ", filetype); printf("%c ", filetype);
} else { } else {
@ -161,15 +160,18 @@ static int listfile_size(const char *path, const char *filename, int flags)
return 0; return 0;
} }
static int listfile_long(const char *path, int flags) static int listfile_long(const char *path, struct stat *s, int flags)
{ {
struct stat s;
char date[32]; char date[32];
char mode[16]; char mode[16];
char user[16]; char user[16];
char group[16]; char group[16];
const char *name; const char *name;
if(!s || !path) {
return -1;
}
/* name is anything after the final '/', or the whole path if none*/ /* name is anything after the final '/', or the whole path if none*/
name = strrchr(path, '/'); name = strrchr(path, '/');
if(name == 0) { if(name == 0) {
@ -178,36 +180,32 @@ static int listfile_long(const char *path, int flags)
name++; name++;
} }
if(lstat(path, &s) < 0) { mode2str(s->st_mode, mode);
return -1;
}
mode2str(s.st_mode, mode);
if (flags & LIST_LONG_NUMERIC) { if (flags & LIST_LONG_NUMERIC) {
sprintf(user, "%ld", s.st_uid); sprintf(user, "%ld", s->st_uid);
sprintf(group, "%ld", s.st_gid); sprintf(group, "%ld", s->st_gid);
} else { } else {
user2str(s.st_uid, user); user2str(s->st_uid, user);
group2str(s.st_gid, group); group2str(s->st_gid, group);
} }
strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime)); strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s->st_mtime));
date[31] = 0; date[31] = 0;
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890
// MMMMMMMM UUUUUUUU GGGGGGGGG XXXXXXXX YYYY-MM-DD HH:MM NAME (->LINK) // MMMMMMMM UUUUUUUU GGGGGGGGG XXXXXXXX YYYY-MM-DD HH:MM NAME (->LINK)
switch(s.st_mode & S_IFMT) { switch(s->st_mode & S_IFMT) {
case S_IFBLK: case S_IFBLK:
case S_IFCHR: case S_IFCHR:
printf("%s %-8s %-8s %3d, %3d %s %s\n", printf("%s %-8s %-8s %3d, %3d %s %s\n",
mode, user, group, mode, user, group,
(int) MAJOR(s.st_rdev), (int) MINOR(s.st_rdev), (int) MAJOR(s->st_rdev), (int) MINOR(s->st_rdev),
date, name); date, name);
break; break;
case S_IFREG: case S_IFREG:
printf("%s %-8s %-8s %8lld %s %s\n", printf("%s %-8s %-8s %8lld %s %s\n",
mode, user, group, s.st_size, date, name); mode, user, group, s->st_size, date, name);
break; break;
case S_IFLNK: { case S_IFLNK: {
char linkto[256]; char linkto[256];
@ -237,15 +235,18 @@ static int listfile_long(const char *path, int flags)
return 0; return 0;
} }
static int listfile_maclabel(const char *path, int flags) static int listfile_maclabel(const char *path, struct stat *s, int flags)
{ {
struct stat s;
char mode[16]; char mode[16];
char user[16]; char user[16];
char group[16]; char group[16];
char *maclabel = NULL; char *maclabel = NULL;
const char *name; const char *name;
if(!s || !path) {
return -1;
}
/* name is anything after the final '/', or the whole path if none*/ /* name is anything after the final '/', or the whole path if none*/
name = strrchr(path, '/'); name = strrchr(path, '/');
if(name == 0) { if(name == 0) {
@ -254,20 +255,16 @@ static int listfile_maclabel(const char *path, int flags)
name++; name++;
} }
if(lstat(path, &s) < 0) {
return -1;
}
lgetfilecon(path, &maclabel); lgetfilecon(path, &maclabel);
if (!maclabel) { if (!maclabel) {
return -1; return -1;
} }
mode2str(s.st_mode, mode); mode2str(s->st_mode, mode);
user2str(s.st_uid, user); user2str(s->st_uid, user);
group2str(s.st_gid, group); group2str(s->st_gid, group);
switch(s.st_mode & S_IFMT) { switch(s->st_mode & S_IFMT) {
case S_IFLNK: { case S_IFLNK: {
char linkto[256]; char linkto[256];
ssize_t len; ssize_t len;
@ -301,7 +298,9 @@ static int listfile_maclabel(const char *path, int flags)
static int listfile(const char *dirname, const char *filename, int flags) static int listfile(const char *dirname, const char *filename, int flags)
{ {
if ((flags & (LIST_LONG | LIST_SIZE | LIST_CLASSIFY | LIST_MACLABEL)) == 0) { struct stat s;
if ((flags & (LIST_LONG | LIST_SIZE | LIST_CLASSIFY | LIST_MACLABEL | LIST_INODE)) == 0) {
printf("%s\n", filename); printf("%s\n", filename);
return 0; return 0;
} }
@ -316,12 +315,20 @@ static int listfile(const char *dirname, const char *filename, int flags)
pathname = filename; pathname = filename;
} }
if(lstat(pathname, &s) < 0) {
return -1;
}
if(flags & LIST_INODE) {
printf("%8llu ", s.st_ino);
}
if ((flags & LIST_MACLABEL) != 0) { if ((flags & LIST_MACLABEL) != 0) {
return listfile_maclabel(pathname, flags); return listfile_maclabel(pathname, &s, flags);
} else if ((flags & LIST_LONG) != 0) { } else if ((flags & LIST_LONG) != 0) {
return listfile_long(pathname, flags); return listfile_long(pathname, &s, flags);
} else /*((flags & LIST_SIZE) != 0)*/ { } else /*((flags & LIST_SIZE) != 0)*/ {
return listfile_size(pathname, filename, flags); return listfile_size(pathname, filename, &s, flags);
} }
} }
@ -456,6 +463,7 @@ int ls_main(int argc, char **argv)
case 'Z': flags |= LIST_MACLABEL; break; case 'Z': flags |= LIST_MACLABEL; break;
case 'a': flags |= LIST_ALL; break; case 'a': flags |= LIST_ALL; break;
case 'F': flags |= LIST_CLASSIFY; break; case 'F': flags |= LIST_CLASSIFY; break;
case 'i': flags |= LIST_INODE; break;
default: default:
fprintf(stderr, "%s: Unknown option '-%c'. Aborting.\n", "ls", arg[0]); fprintf(stderr, "%s: Unknown option '-%c'. Aborting.\n", "ls", arg[0]);
exit(1); exit(1);