Patch from Matt Kraai to enable proxy support.
[oweals/busybox.git] / ls.c
diff --git a/ls.c b/ls.c
index b1fbe3b2a487678148f387b49e0985e39244a4b2..94c73b377433ab8c1a8984069f7f75028f09b1dd 100644 (file)
--- a/ls.c
+++ b/ls.c
 
 #define SPLIT_DIR              0
 #define SPLIT_FILE             1
+#define SPLIT_SUBDIR   2
 
 #define TYPEINDEX(mode) (((mode) >> 12) & 0x0f)
 #define TYPECHAR(mode)  ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)])
@@ -180,7 +181,7 @@ static int my_stat(struct dnode *cur)
 #ifdef BB_FEATURE_LS_FOLLOWLINKS
        if (follow_links == TRUE) {
                if (stat(cur->fullname, &cur->dstat)) {
-                       errorMsg("%s: %s\n", cur->fullname, strerror(errno));
+                       error_msg("%s: %s\n", cur->fullname, strerror(errno));
                        status = EXIT_FAILURE;
                        free(cur->fullname);
                        free(cur);
@@ -189,7 +190,7 @@ static int my_stat(struct dnode *cur)
        } else
 #endif
        if (lstat(cur->fullname, &cur->dstat)) {
-               errorMsg("%s: %s\n", cur->fullname, strerror(errno));
+               error_msg("%s: %s\n", cur->fullname, strerror(errno));
                status = EXIT_FAILURE;
                free(cur->fullname);
                free(cur);
@@ -236,11 +237,16 @@ static void nexttabstop( void )
 }
 
 /*----------------------------------------------------------------------*/
+static int is_subdir(struct dnode *dn)
+{
+       return (S_ISDIR(dn->dstat.st_mode) && strcmp(dn->name, ".") != 0 &&
+                       strcmp(dn->name, "..") != 0);
+}
+
 int countdirs(struct dnode **dn, int nfiles)
 {
        int i, dirs;
 
-       /* count how many dirs and regular files there are */
        if (dn==NULL || nfiles < 1) return(0);
        dirs= 0;
        for (i=0; i<nfiles; i++) {
@@ -249,6 +255,18 @@ int countdirs(struct dnode **dn, int nfiles)
        return(dirs);
 }
 
+int countsubdirs(struct dnode **dn, int nfiles)
+{
+       int i, subdirs;
+
+       if (dn == NULL || nfiles < 1) return 0;
+       subdirs = 0;
+       for (i = 0; i < nfiles; i++)
+               if (is_subdir(dn[i]))
+                       subdirs++;
+       return subdirs;
+}
+
 int countfiles(struct dnode **dnp)
 {
        int nfiles;
@@ -296,9 +314,13 @@ struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
        if (dn==NULL || nfiles < 1) return(NULL);
 
        /* count how many dirs and regular files there are */
-       dncnt= countdirs(dn, nfiles); /* assume we are looking for dirs */
-       if (which != SPLIT_DIR)
-               dncnt= nfiles - dncnt;  /* looking for files */
+       if (which == SPLIT_SUBDIR)
+               dncnt = countsubdirs(dn, nfiles);
+       else {
+               dncnt= countdirs(dn, nfiles); /* assume we are looking for dirs */
+               if (which == SPLIT_FILE)
+                       dncnt= nfiles - dncnt;  /* looking for files */
+       }
 
        /* allocate a file array and a dir array */
        dnp= dnalloc(dncnt);
@@ -309,6 +331,10 @@ struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
                        if (S_ISDIR(dn[i]->dstat.st_mode)) {
                                dnp[d++]= dn[i];
                        }  /* else skip the file */
+               } else if (which == SPLIT_SUBDIR) {
+                       if (is_subdir(dn[i])) {
+                               dnp[d++]= dn[i];
+                       }  /* else skip the file or dir */
                } else {
                        if (!(S_ISDIR(dn[i]->dstat.st_mode))) {
                                dnp[d++]= dn[i];
@@ -455,8 +481,8 @@ void showdirs(struct dnode **dn, int ndirs)
 #ifdef BB_FEATURE_LS_RECURSIVE
                        if (disp_opts & DISP_RECURSIVE) {
                                /* recursive- list the sub-dirs */
-                               dnd= splitdnarray(subdnp, nfiles, SPLIT_DIR);
-                               dndirs= countdirs(subdnp, nfiles);
+                               dnd= splitdnarray(subdnp, nfiles, SPLIT_SUBDIR);
+                               dndirs= countsubdirs(subdnp, nfiles);
                                if (dndirs > 0) {
 #ifdef BB_FEATURE_LS_SORTFILES
                                        shellsort(dnd, dndirs);
@@ -485,7 +511,7 @@ struct dnode **list_dir(char *path)
        nfiles= 0;
        dir = opendir(path);
        if (dir == NULL) {
-               errorMsg("%s: %s\n", path, strerror(errno));
+               error_msg("%s: %s\n", path, strerror(errno));
                status = EXIT_FAILURE;
                return(NULL);   /* could not open the dir */
        }
@@ -565,7 +591,7 @@ int list_single(struct dnode *dn)
                                column += 5;
                                break;
                        case LIST_MODEBITS:
-                               fprintf(stdout, "%10s", (char *)modeString(dn->dstat.st_mode));
+                               fprintf(stdout, "%10s", (char *)mode_string(dn->dstat.st_mode));
                                column += 10;
                                break;
                        case LIST_NLINKS:
@@ -852,5 +878,4 @@ extern int ls_main(int argc, char **argv)
 
   print_usage_message:
        usage(ls_usage);
-       return(FALSE);
 }