Add support for the -L option to ls.
authorMatt Kraai <kraai@debian.org>
Fri, 22 Sep 2000 03:11:47 +0000 (03:11 -0000)
committerMatt Kraai <kraai@debian.org>
Fri, 22 Sep 2000 03:11:47 +0000 (03:11 -0000)
busybox.def.h
coreutils/ls.c
ls.c

index 9d046ab..42ec906 100644 (file)
 // enable ls -R
 #define BB_FEATURE_LS_RECURSIVE
 //
+// enable ls -L
+#define BB_FEATURE_LS_FOLLOWLINKS
+//
 // Change ping implementation -- simplified, featureless, but really small.
 //#define BB_FEATURE_SIMPLE_PING
 //
index b818003..0e08f76 100644 (file)
@@ -159,6 +159,9 @@ static unsigned int sort_order=     SORT_FORWARD;
 #ifdef BB_FEATURE_LS_TIMESTAMPS
 static unsigned int time_fmt=  TIME_MOD;
 #endif
+#ifdef BB_FEATURE_LS_FOLLOWLINKS
+static unsigned int follow_links=FALSE;
+#endif
 
 static unsigned short column = 0;
 #ifdef BB_FEATURE_AUTOWIDTH
@@ -474,6 +477,16 @@ struct dnode **list_dir(char *path)
                cur= (struct dnode *)xmalloc(sizeof(struct dnode));
                cur->fullname= xstrdup(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 */
                        errorMsg("%s: %s\n", fullname, strerror(errno));
                        free(cur->fullname);
@@ -682,6 +695,9 @@ extern int ls_main(int argc, char **argv)
 #ifdef BB_FEATURE_LS_TIMESTAMPS
 "cetu"
 #endif
+#ifdef BB_FEATURE_LS_FOLLOWLINKS
+"L"
+#endif
        )) > 0) {
                switch (opt) {
                        case '1': style_fmt = STYLE_SINGLE; break;
@@ -714,6 +730,9 @@ extern int ls_main(int argc, char **argv)
                        case 't': sort_opts= SORT_MTIME; break;
                        case 'u': time_fmt = TIME_ACCESS; sort_opts= SORT_ATIME; break;
 #endif
+#ifdef BB_FEATURE_LS_FOLLOWLINKS
+                       case 'L': follow_links= TRUE; break;
+#endif
 #ifdef BB_FEATURE_AUTOWIDTH
                        case 'T': tabstops= atoi(optarg); break;
                        case 'w': terminal_width= atoi(optarg); break;
diff --git a/ls.c b/ls.c
index b818003..0e08f76 100644 (file)
--- a/ls.c
+++ b/ls.c
@@ -159,6 +159,9 @@ static unsigned int sort_order=     SORT_FORWARD;
 #ifdef BB_FEATURE_LS_TIMESTAMPS
 static unsigned int time_fmt=  TIME_MOD;
 #endif
+#ifdef BB_FEATURE_LS_FOLLOWLINKS
+static unsigned int follow_links=FALSE;
+#endif
 
 static unsigned short column = 0;
 #ifdef BB_FEATURE_AUTOWIDTH
@@ -474,6 +477,16 @@ struct dnode **list_dir(char *path)
                cur= (struct dnode *)xmalloc(sizeof(struct dnode));
                cur->fullname= xstrdup(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 */
                        errorMsg("%s: %s\n", fullname, strerror(errno));
                        free(cur->fullname);
@@ -682,6 +695,9 @@ extern int ls_main(int argc, char **argv)
 #ifdef BB_FEATURE_LS_TIMESTAMPS
 "cetu"
 #endif
+#ifdef BB_FEATURE_LS_FOLLOWLINKS
+"L"
+#endif
        )) > 0) {
                switch (opt) {
                        case '1': style_fmt = STYLE_SINGLE; break;
@@ -714,6 +730,9 @@ extern int ls_main(int argc, char **argv)
                        case 't': sort_opts= SORT_MTIME; break;
                        case 'u': time_fmt = TIME_ACCESS; sort_opts= SORT_ATIME; break;
 #endif
+#ifdef BB_FEATURE_LS_FOLLOWLINKS
+                       case 'L': follow_links= TRUE; break;
+#endif
 #ifdef BB_FEATURE_AUTOWIDTH
                        case 'T': tabstops= atoi(optarg); break;
                        case 'w': terminal_width= atoi(optarg); break;