Allows min size specification without unit (i.e. in bytes)
[dus.git] / dus.c
diff --git a/dus.c b/dus.c
index 780d360..a9ceedc 100644 (file)
--- a/dus.c
+++ b/dus.c
@@ -106,20 +106,22 @@ size_sum_t entry_size(const char *name) {
     return 0;
   }
 
-  dir = opendir(name);
-
-  if(dir) {
-    while((dir_e = readdir(dir))) {
-      if(!ignore_entry(dir_e->d_name)) {
-        snprintf(subname, PATH_MAX, "%s/%s", name, dir_e->d_name);
-        result += entry_size(subname);
+  if(S_ISDIR(dummy.st_mode)) {
+    dir = opendir(name);
+    if(dir) {
+      while((dir_e = readdir(dir))) {
+        if(!ignore_entry(dir_e->d_name)) {
+          snprintf(subname, PATH_MAX, "%s/%s", name, dir_e->d_name);
+          result += entry_size(subname);
+        }
       }
+      closedir(dir);
+    } else {
+      fprintf(stderr, "Can not open directory %s: %s\n", name, strerror(errno));
+      exit(EXIT_FAILURE);
     }
-    closedir(dir);
-  } else {
-    if(S_ISREG(dummy.st_mode)) {
-      result += dummy.st_size;
-    }
+  } else if(S_ISREG(dummy.st_mode)) {
+    result += dummy.st_size;
   }
 
   return result;
@@ -147,6 +149,9 @@ size_sum_t atoss(const char *string) {
       fprintf(stderr, "Syntax error in %s\n", string);
     }
   }
+
+  total += partial_total;
+
   return total;
 }
 
@@ -251,29 +256,30 @@ void raw_print(char *buffer, size_t buffer_size,
   snprintf(b, buffer_size - (b - buffer), "%s\n", filename);
 }
 
-void fancy_print(char *buffer, size_t buffer_size, char *filename, size_sum_t size) {
+void fancy_print(char *buffer, size_t buffer_size,
+                 char *filename, size_sum_t size) {
   if(size < 1024) {
     snprintf(buffer,
              buffer_size,
-             "% 7d -- %s\n",
+             "% 8d -- %s\n",
              ((int) size),
              filename);
   } else if(size < 1024 * 1024) {
     snprintf(buffer,
              buffer_size,
-             "% 6.1fK -- %s\n",
+             "% 7.1fK -- %s\n",
              ((double) (size))/(1024.0),
              filename);
   } else if(size < 1024 * 1024 * 1024) {
     snprintf(buffer,
              buffer_size,
-             "% 6.1fM -- %s\n",
+             "% 7.1fM -- %s\n",
              ((double) (size))/(1024.0 * 1024),
              filename);
   } else {
     snprintf(buffer,
              buffer_size,
-             "% 6.1fG -- %s\n",
+             "% 7.1fG -- %s\n",
              ((double) (size))/(1024.0 * 1024.0 * 1024.0),
              filename);
   }
@@ -358,7 +364,7 @@ void print_sorted(struct entry_node *root, int width, int height) {
 void usage(FILE *out) {
   fprintf(out, "Usage: dus [OPTION]... [FILE]...\n");
   fprintf(out, "Version %s (%s)\n", VERSION_NUMBER, UNAME);
-  fprintf(out, "List files and directories sorted according to their sizes. If no files or directories are provided as arguments, use the content of the current directory.\n");
+  fprintf(out, "Lists files and directories according to their size. The sizes are computed by summing recursively exact file sizes through directories. If a given directory has its name appended with '/', it is not listed, but the elements it contains are. If no files or directories are provided as arguments, the current directory is used as default.\n");
   fprintf(out, "\n");
   /*            01234567890123456789012345678901234567890123456789012345678901234567890123456789*/
   fprintf(out, "   -d, --ignore-dots          ignore files and directories starting with a '.'\n");