implement -1CFx flags
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9335 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -34,6 +34,19 @@
|
|||||||
|
|
||||||
RCSID("$Id$");
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
#define sec_fprintf2 fprintf
|
||||||
|
#define sec_fflush fflush
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 1; i < argc; i++)
|
||||||
|
builtin_ls(stdout, argv[i]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct fileinfo {
|
struct fileinfo {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int inode;
|
int inode;
|
||||||
@@ -63,17 +76,23 @@ free_fileinfo(struct fileinfo *f)
|
|||||||
free(f->link);
|
free(f->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LS_DIRS 1
|
#define LS_DIRS (1 << 0)
|
||||||
#define LS_IGNORE_DOT 2
|
#define LS_IGNORE_DOT (1 << 1)
|
||||||
#define LS_SORT_MODE 12
|
#define LS_SORT_MODE (3 << 2)
|
||||||
#define SORT_MODE(f) ((f) & LS_SORT_MODE)
|
#define SORT_MODE(f) ((f) & LS_SORT_MODE)
|
||||||
#define LS_SORT_NAME 4
|
#define LS_SORT_NAME (1 << 2)
|
||||||
#define LS_SORT_MTIME 8
|
#define LS_SORT_MTIME (2 << 2)
|
||||||
#define LS_SORT_SIZE 12
|
#define LS_SORT_SIZE (3 << 2)
|
||||||
#define LS_SORT_REVERSE 16
|
#define LS_SORT_REVERSE (1 << 4)
|
||||||
|
|
||||||
#define LS_SIZE 32
|
#define LS_SIZE (1 << 5)
|
||||||
#define LS_INODE 64
|
#define LS_INODE (1 << 6)
|
||||||
|
#define LS_TYPE (1 << 7)
|
||||||
|
#define LS_DISP_MODE (3 << 8)
|
||||||
|
#define DISP_MODE(f) ((f) & LS_DISP_MODE)
|
||||||
|
#define LS_DISP_LONG (1 << 8)
|
||||||
|
#define LS_DISP_COLUMN (2 << 8)
|
||||||
|
#define LS_DISP_CROSS (3 << 8)
|
||||||
|
|
||||||
#ifndef S_ISTXT
|
#ifndef S_ISTXT
|
||||||
#define S_ISTXT S_ISVTX
|
#define S_ISTXT S_ISVTX
|
||||||
@@ -91,6 +110,7 @@ static void
|
|||||||
make_fileinfo(const char *filename, struct fileinfo *file, int flags)
|
make_fileinfo(const char *filename, struct fileinfo *file, int flags)
|
||||||
{
|
{
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
int file_type = 0;
|
||||||
struct stat *st = &file->st;
|
struct stat *st = &file->st;
|
||||||
|
|
||||||
file->inode = st->st_ino;
|
file->inode = st->st_ino;
|
||||||
@@ -100,23 +120,36 @@ make_fileinfo(const char *filename, struct fileinfo *file, int flags)
|
|||||||
file->bsize = st->st_blocks * 512 / 1024;
|
file->bsize = st->st_blocks * 512 / 1024;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(S_ISDIR(st->st_mode))
|
if(S_ISDIR(st->st_mode)) {
|
||||||
file->mode[0] = 'd';
|
file->mode[0] = 'd';
|
||||||
|
file_type = '/';
|
||||||
|
}
|
||||||
else if(S_ISCHR(st->st_mode))
|
else if(S_ISCHR(st->st_mode))
|
||||||
file->mode[0] = 'c';
|
file->mode[0] = 'c';
|
||||||
else if(S_ISBLK(st->st_mode))
|
else if(S_ISBLK(st->st_mode))
|
||||||
file->mode[0] = 'b';
|
file->mode[0] = 'b';
|
||||||
else if(S_ISREG(st->st_mode))
|
else if(S_ISREG(st->st_mode)) {
|
||||||
file->mode[0] = '-';
|
file->mode[0] = '-';
|
||||||
else if(S_ISFIFO(st->st_mode))
|
if(st->st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
|
||||||
|
file_type = '*';
|
||||||
|
}
|
||||||
|
else if(S_ISFIFO(st->st_mode)) {
|
||||||
file->mode[0] = 'p';
|
file->mode[0] = 'p';
|
||||||
else if(S_ISLNK(st->st_mode))
|
file_type = '|';
|
||||||
|
}
|
||||||
|
else if(S_ISLNK(st->st_mode)) {
|
||||||
file->mode[0] = 'l';
|
file->mode[0] = 'l';
|
||||||
else if(S_ISSOCK(st->st_mode))
|
file_type = '@';
|
||||||
|
}
|
||||||
|
else if(S_ISSOCK(st->st_mode)) {
|
||||||
file->mode[0] = 's';
|
file->mode[0] = 's';
|
||||||
|
file_type = '=';
|
||||||
|
}
|
||||||
#ifdef S_ISWHT
|
#ifdef S_ISWHT
|
||||||
else if(S_ISWHT(st->st_mode))
|
else if(S_ISWHT(st->st_mode)) {
|
||||||
file->mode[0] = 'w';
|
file->mode[0] = 'w';
|
||||||
|
file_type = '%';
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
file->mode[0] = '?';
|
file->mode[0] = '?';
|
||||||
@@ -192,7 +225,10 @@ make_fileinfo(const char *filename, struct fileinfo *file, int flags)
|
|||||||
p++;
|
p++;
|
||||||
else
|
else
|
||||||
p = filename;
|
p = filename;
|
||||||
file->filename = strdup(p);
|
if((flags & LS_TYPE) && file_type != 0)
|
||||||
|
asprintf(&file->filename, "%s%c", p, file_type);
|
||||||
|
else
|
||||||
|
file->filename = strdup(p);
|
||||||
}
|
}
|
||||||
if(S_ISLNK(st->st_mode)) {
|
if(S_ISLNK(st->st_mode)) {
|
||||||
int n;
|
int n;
|
||||||
@@ -414,7 +450,7 @@ list_files(FILE *out, const char **files, int n_files, int flags)
|
|||||||
(int (*)(const void*, const void*))compare_size);
|
(int (*)(const void*, const void*))compare_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
{
|
if(DISP_MODE(flags) == LS_DISP_LONG) {
|
||||||
int max_inode = 0;
|
int max_inode = 0;
|
||||||
int max_bsize = 0;
|
int max_bsize = 0;
|
||||||
int max_n_link = 0;
|
int max_n_link = 0;
|
||||||
@@ -482,10 +518,58 @@ list_files(FILE *out, const char **files, int n_files, int flags)
|
|||||||
max_major,
|
max_major,
|
||||||
max_minor,
|
max_minor,
|
||||||
max_date);
|
max_date);
|
||||||
for(i = 0; i < n_files; i++)
|
} else if(DISP_MODE(flags) == LS_DISP_COLUMN ||
|
||||||
free_fileinfo(&fi[i]);
|
DISP_MODE(flags) == LS_DISP_CROSS) {
|
||||||
free(fi);
|
int max_len = 0;
|
||||||
|
int num_files = n_files;
|
||||||
|
int columns;
|
||||||
|
int j;
|
||||||
|
for(i = 0; i < n_files; i++) {
|
||||||
|
if(fi[i].filename == NULL) {
|
||||||
|
num_files--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(strlen(fi[i].filename) > max_len)
|
||||||
|
max_len = strlen(fi[i].filename);
|
||||||
|
}
|
||||||
|
columns = 80 / (max_len + 1); /* get space between columns */
|
||||||
|
max_len = 80 / columns;
|
||||||
|
if(DISP_MODE(flags) == LS_DISP_CROSS) {
|
||||||
|
for(i = 0, j = 0; i < n_files; i++) {
|
||||||
|
if(fi[i].filename == NULL)
|
||||||
|
continue;
|
||||||
|
sec_fprintf2(out, "%-*s", max_len, fi[i].filename);
|
||||||
|
j++;
|
||||||
|
if(j == columns) {
|
||||||
|
sec_fprintf2(out, "\r\n");
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(j > 0)
|
||||||
|
sec_fprintf2(out, "\r\n");
|
||||||
|
} else {
|
||||||
|
int skip = (num_files + columns - 1) / columns;
|
||||||
|
j = 0;
|
||||||
|
for(i = 0; i < skip; i++) {
|
||||||
|
for(j = i; j < n_files;) {
|
||||||
|
while(j < n_files && fi[j].filename == NULL)
|
||||||
|
j++;
|
||||||
|
sec_fprintf2(out, "%-*s", max_len, fi[j].filename);
|
||||||
|
j += skip;
|
||||||
|
}
|
||||||
|
sec_fprintf2(out, "\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(i = 0; i < n_files; i++) {
|
||||||
|
if(fi[i].filename == NULL)
|
||||||
|
continue;
|
||||||
|
sec_fprintf2(out, "%s\r\n", fi[i].filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
for(i = 0; i < n_files; i++)
|
||||||
|
free_fileinfo(&fi[i]);
|
||||||
|
free(fi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -545,17 +629,21 @@ list_dir(FILE *out, const char *directory, int flags)
|
|||||||
void
|
void
|
||||||
builtin_ls(FILE *out, const char *file)
|
builtin_ls(FILE *out, const char *file)
|
||||||
{
|
{
|
||||||
int flags = LS_SORT_NAME;
|
int flags = LS_SORT_NAME | LS_IGNORE_DOT | LS_DISP_LONG;
|
||||||
|
|
||||||
if(*file == '-') {
|
if(*file == '-') {
|
||||||
const char *p;
|
const char *p;
|
||||||
for(p = file + 1; *p; p++) {
|
for(p = file + 1; *p; p++) {
|
||||||
switch(*p) {
|
switch(*p) {
|
||||||
|
case '1':
|
||||||
|
flags = (flags & ~LS_DISP_MODE);
|
||||||
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
case 'A':
|
case 'A':
|
||||||
flags &= ~LS_IGNORE_DOT;
|
flags &= ~LS_IGNORE_DOT;
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
|
flags = (flags & ~LS_DISP_MODE) | LS_DISP_COLUMN;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
flags |= LS_DIRS;
|
flags |= LS_DIRS;
|
||||||
@@ -563,10 +651,14 @@ builtin_ls(FILE *out, const char *file)
|
|||||||
case 'f':
|
case 'f':
|
||||||
flags = (flags & ~LS_SORT_MODE);
|
flags = (flags & ~LS_SORT_MODE);
|
||||||
break;
|
break;
|
||||||
|
case 'F':
|
||||||
|
flags |= LS_TYPE;
|
||||||
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
flags |= flags | LS_INODE;
|
flags |= LS_INODE;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
|
flags = (flags & ~LS_DISP_MODE) | LS_DISP_LONG;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
flags = (flags & ~LS_SORT_MODE) | LS_SORT_MTIME;
|
flags = (flags & ~LS_SORT_MODE) | LS_SORT_MTIME;
|
||||||
@@ -580,6 +672,9 @@ builtin_ls(FILE *out, const char *file)
|
|||||||
case 'r':
|
case 'r':
|
||||||
flags |= LS_SORT_REVERSE;
|
flags |= LS_SORT_REVERSE;
|
||||||
break;
|
break;
|
||||||
|
case 'x':
|
||||||
|
flags = (flags & ~LS_DISP_MODE) | LS_DISP_CROSS;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file = ".";
|
file = ".";
|
||||||
|
Reference in New Issue
Block a user