Fixed -F with absolute path and short listing

This commit is contained in:
Pierre Pronchery 2005-05-07 16:07:54 +00:00
parent f7ae0e5273
commit dc16adf0c8

View File

@ -220,7 +220,7 @@ static int _ls(int argc, char * argv[], Prefs * prefs)
SList * dirs; SList * dirs;
int res = 0; int res = 0;
int i; int i;
int j; int isdir;
char * str; char * str;
if(argc == 0) if(argc == 0)
@ -229,23 +229,15 @@ static int _ls(int argc, char * argv[], Prefs * prefs)
return 2; return 2;
for(i = 0; i < argc; i++) for(i = 0; i < argc; i++)
{ {
if((j = _is_directory(argv[i])) == 2) if((isdir = _is_directory(argv[i])) == 2)
{
res++; res++;
continue; else if((str = strdup(argv[i])) == NULL)
}
if((str = strdup(argv[i])) == NULL)
{
res += _ls_error("malloc", 1); res += _ls_error("malloc", 1);
continue; else if(*prefs & PREFS_d)
}
if(*prefs & PREFS_d)
{
res += slist_insert_sorted(files, str, res += slist_insert_sorted(files, str,
(compare_func)strcmp); (compare_func)strcmp);
continue; else
} res += slist_insert_sorted(isdir ? dirs : files, str,
res += slist_insert_sorted(j ? dirs : files, str,
(compare_func)strcmp); (compare_func)strcmp);
} }
res += _ls_do(NULL, files, dirs, prefs); res += _ls_do(NULL, files, dirs, prefs);
@ -268,7 +260,7 @@ static int _ls_directory_do(char * directory, Prefs * prefs)
struct dirent * de; struct dirent * de;
char * file = NULL; char * file = NULL;
char * p; char * p;
int pos = 0; int pos = 1;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "_ls_directory_do(%s, ...)\n", directory); fprintf(stderr, "_ls_directory_do(%s, ...)\n", directory);
@ -276,17 +268,15 @@ static int _ls_directory_do(char * directory, Prefs * prefs)
if((dir = opendir(directory)) == NULL) if((dir = opendir(directory)) == NULL)
return _ls_error(directory, 2); return _ls_error(directory, 2);
_ls_args(&files, &dirs); _ls_args(&files, &dirs);
while((de = readdir(dir)) != NULL) for(; (de = readdir(dir)) != NULL; pos++)
{ {
pos++;
if(*(de->d_name) == '.' && !(*prefs & PREFS_a)) if(*(de->d_name) == '.' && !(*prefs & PREFS_a))
continue; continue;
slist_insert_sorted(files, strdup(de->d_name), slist_insert_sorted(files, strdup(de->d_name),
(compare_func)strcmp); (compare_func)strcmp);
if(pos <= 2) if(pos <= 2)
continue; continue;
if((p = realloc(file, strlen(directory) if((p = realloc(file, strlen(directory) + strlen(de->d_name)
+ strlen(de->d_name)
+ 2)) == NULL) + 2)) == NULL)
{ {
_ls_error("malloc", 0); _ls_error("malloc", 0);
@ -337,7 +327,7 @@ static int _ls_do(char * directory, SList * files, SList * dirs, Prefs * prefs)
} }
static int _ls_free(void * data, void * user); static int _ls_free(void * data, void * user);
static int _ls_do_files_short(SList * files, Prefs * prefs); static int _ls_do_files_short(char * directory, SList * files, Prefs * prefs);
static int _ls_do_files_long(char * directory, SList * files, Prefs * prefs); static int _ls_do_files_long(char * directory, SList * files, Prefs * prefs);
static int _ls_do_files(char * directory, SList * files, Prefs * prefs) static int _ls_do_files(char * directory, SList * files, Prefs * prefs)
{ {
@ -346,14 +336,14 @@ static int _ls_do_files(char * directory, SList * files, Prefs * prefs)
if(*prefs & PREFS_l) if(*prefs & PREFS_l)
res = _ls_do_files_long(directory, files, prefs); res = _ls_do_files_long(directory, files, prefs);
else else
res = _ls_do_files_short(files, prefs); res = _ls_do_files_short(directory, files, prefs);
slist_apply(files, _ls_free, NULL); slist_apply(files, _ls_free, NULL);
slist_delete(files); slist_delete(files);
return res; return res;
} }
static char _short_file_mode(char const * file); static char _short_file_mode(char const * directory, char const * file);
static int _ls_do_files_short(SList * files, Prefs * prefs) static int _ls_do_files_short(char * directory, SList * files, Prefs * prefs)
{ {
char * cols; char * cols;
char * p; char * p;
@ -366,8 +356,7 @@ static int _ls_do_files_short(SList * files, Prefs * prefs)
SList cur; SList cur;
if(((*prefs & PREFS_1) == 0) && (cols = getenv("COLUMNS")) != NULL if(((*prefs & PREFS_1) == 0) && (cols = getenv("COLUMNS")) != NULL
&& *cols != '\0' && *cols != '\0' && (len = strtol(cols, &p, 10)) > 0
&& (len = strtol(cols, &p, 10)) > 0
&& *p == '\0') && *p == '\0')
{ {
for(cur = *files; cur != NULL; slist_next(&cur)) for(cur = *files; cur != NULL; slist_next(&cur))
@ -380,7 +369,7 @@ static int _ls_do_files_short(SList * files, Prefs * prefs)
p = slist_data(&cur); p = slist_data(&cur);
j = strlen(p); j = strlen(p);
fwrite(p, sizeof(char), j, stdout); fwrite(p, sizeof(char), j, stdout);
if((*prefs & PREFS_F) && (c = _short_file_mode(p))) if((*prefs & PREFS_F) && (c = _short_file_mode(directory, p)))
{ {
fputc(c, stdout); fputc(c, stdout);
j++; j++;
@ -400,13 +389,21 @@ static int _ls_do_files_short(SList * files, Prefs * prefs)
} }
static char _file_mode_letter(mode_t mode); static char _file_mode_letter(mode_t mode);
static char _short_file_mode(char const * file) static char _short_file_mode(char const * directory, char const * file)
{ {
struct stat st; struct stat st;
char * p;
char c = '\0';
if(stat(file, &st) != 0) if((p = malloc(strlen(directory) + 1 + strlen(file) + 1)) == NULL)
return _ls_error(file, 0); return _ls_error("malloc", 0);
return _file_mode_letter(st.st_mode); sprintf(p, "%s/%s", directory, file);
if(stat(p, &st) != 0)
_ls_error(file, 0);
else
c = _file_mode_letter(st.st_mode);
free(p);
return c;
} }
static void _long_mode(char str[11], mode_t mode); static void _long_mode(char str[11], mode_t mode);
@ -547,7 +544,7 @@ static char _file_mode_letter(mode_t mode)
return '/'; return '/';
if(S_ISFIFO(mode)) if(S_ISFIFO(mode))
return '|'; return '|';
if(mode & S_IXUSR) /* FIXME */ if(mode & (S_IXUSR | S_IXGRP | S_IXOTH))
return '*'; return '*';
return '\0'; return '\0';
} }