Add support for the -L option to ls.

This commit is contained in:
Matt Kraai 2000-09-22 03:11:47 +00:00
parent 810d38f850
commit a2f2a8f8c0
3 changed files with 41 additions and 0 deletions

View File

@ -169,6 +169,9 @@
// enable ls -R // enable ls -R
#define BB_FEATURE_LS_RECURSIVE #define BB_FEATURE_LS_RECURSIVE
// //
// enable ls -L
#define BB_FEATURE_LS_FOLLOWLINKS
//
// Change ping implementation -- simplified, featureless, but really small. // Change ping implementation -- simplified, featureless, but really small.
//#define BB_FEATURE_SIMPLE_PING //#define BB_FEATURE_SIMPLE_PING
// //

View File

@ -159,6 +159,9 @@ static unsigned int sort_order= SORT_FORWARD;
#ifdef BB_FEATURE_LS_TIMESTAMPS #ifdef BB_FEATURE_LS_TIMESTAMPS
static unsigned int time_fmt= TIME_MOD; static unsigned int time_fmt= TIME_MOD;
#endif #endif
#ifdef BB_FEATURE_LS_FOLLOWLINKS
static unsigned int follow_links=FALSE;
#endif
static unsigned short column = 0; static unsigned short column = 0;
#ifdef BB_FEATURE_AUTOWIDTH #ifdef BB_FEATURE_AUTOWIDTH
@ -474,6 +477,16 @@ struct dnode **list_dir(char *path)
cur= (struct dnode *)xmalloc(sizeof(struct dnode)); cur= (struct dnode *)xmalloc(sizeof(struct dnode));
cur->fullname= xstrdup(fullname); cur->fullname= xstrdup(fullname);
cur->name= cur->fullname + (int)(fnend - fullname) ; cur->name= cur->fullname + (int)(fnend - fullname) ;
#ifdef BB_FEATURE_LS_FOLLOWLINKS
if (follow_links == TRUE) {
if (stat(fullname, &cur->dstat)) {
errorMsg("%s: %s\n", fullname, strerror(errno));
free(cur->fullname);
free(cur);
continue;
}
} else
#endif
if (lstat(fullname, &cur->dstat)) { /* get file stat info into node */ if (lstat(fullname, &cur->dstat)) { /* get file stat info into node */
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", fullname, strerror(errno));
free(cur->fullname); free(cur->fullname);
@ -681,6 +694,9 @@ extern int ls_main(int argc, char **argv)
#endif #endif
#ifdef BB_FEATURE_LS_TIMESTAMPS #ifdef BB_FEATURE_LS_TIMESTAMPS
"cetu" "cetu"
#endif
#ifdef BB_FEATURE_LS_FOLLOWLINKS
"L"
#endif #endif
)) > 0) { )) > 0) {
switch (opt) { switch (opt) {
@ -714,6 +730,9 @@ extern int ls_main(int argc, char **argv)
case 't': sort_opts= SORT_MTIME; break; case 't': sort_opts= SORT_MTIME; break;
case 'u': time_fmt = TIME_ACCESS; sort_opts= SORT_ATIME; break; case 'u': time_fmt = TIME_ACCESS; sort_opts= SORT_ATIME; break;
#endif #endif
#ifdef BB_FEATURE_LS_FOLLOWLINKS
case 'L': follow_links= TRUE; break;
#endif
#ifdef BB_FEATURE_AUTOWIDTH #ifdef BB_FEATURE_AUTOWIDTH
case 'T': tabstops= atoi(optarg); break; case 'T': tabstops= atoi(optarg); break;
case 'w': terminal_width= atoi(optarg); break; case 'w': terminal_width= atoi(optarg); break;

19
ls.c
View File

@ -159,6 +159,9 @@ static unsigned int sort_order= SORT_FORWARD;
#ifdef BB_FEATURE_LS_TIMESTAMPS #ifdef BB_FEATURE_LS_TIMESTAMPS
static unsigned int time_fmt= TIME_MOD; static unsigned int time_fmt= TIME_MOD;
#endif #endif
#ifdef BB_FEATURE_LS_FOLLOWLINKS
static unsigned int follow_links=FALSE;
#endif
static unsigned short column = 0; static unsigned short column = 0;
#ifdef BB_FEATURE_AUTOWIDTH #ifdef BB_FEATURE_AUTOWIDTH
@ -474,6 +477,16 @@ struct dnode **list_dir(char *path)
cur= (struct dnode *)xmalloc(sizeof(struct dnode)); cur= (struct dnode *)xmalloc(sizeof(struct dnode));
cur->fullname= xstrdup(fullname); cur->fullname= xstrdup(fullname);
cur->name= cur->fullname + (int)(fnend - fullname) ; cur->name= cur->fullname + (int)(fnend - fullname) ;
#ifdef BB_FEATURE_LS_FOLLOWLINKS
if (follow_links == TRUE) {
if (stat(fullname, &cur->dstat)) {
errorMsg("%s: %s\n", fullname, strerror(errno));
free(cur->fullname);
free(cur);
continue;
}
} else
#endif
if (lstat(fullname, &cur->dstat)) { /* get file stat info into node */ if (lstat(fullname, &cur->dstat)) { /* get file stat info into node */
errorMsg("%s: %s\n", fullname, strerror(errno)); errorMsg("%s: %s\n", fullname, strerror(errno));
free(cur->fullname); free(cur->fullname);
@ -681,6 +694,9 @@ extern int ls_main(int argc, char **argv)
#endif #endif
#ifdef BB_FEATURE_LS_TIMESTAMPS #ifdef BB_FEATURE_LS_TIMESTAMPS
"cetu" "cetu"
#endif
#ifdef BB_FEATURE_LS_FOLLOWLINKS
"L"
#endif #endif
)) > 0) { )) > 0) {
switch (opt) { switch (opt) {
@ -714,6 +730,9 @@ extern int ls_main(int argc, char **argv)
case 't': sort_opts= SORT_MTIME; break; case 't': sort_opts= SORT_MTIME; break;
case 'u': time_fmt = TIME_ACCESS; sort_opts= SORT_ATIME; break; case 'u': time_fmt = TIME_ACCESS; sort_opts= SORT_ATIME; break;
#endif #endif
#ifdef BB_FEATURE_LS_FOLLOWLINKS
case 'L': follow_links= TRUE; break;
#endif
#ifdef BB_FEATURE_AUTOWIDTH #ifdef BB_FEATURE_AUTOWIDTH
case 'T': tabstops= atoi(optarg); break; case 'T': tabstops= atoi(optarg); break;
case 'w': terminal_width= atoi(optarg); break; case 'w': terminal_width= atoi(optarg); break;