Synchronise with FreeBSD:
authorJeroen Ruigrok/asmodai <asmodai@dragonflybsd.org>
Sun, 18 Sep 2005 18:01:49 +0000 (18:01 +0000)
committerJeroen Ruigrok/asmodai <asmodai@dragonflybsd.org>
Sun, 18 Sep 2005 18:01:49 +0000 (18:01 +0000)
Bump Id where needed.

Constify parameters that do not get touched.

Do something sensible if both -h and -k are given.

If we are asked to print the total number of blocks, do so even if we
have no entries to print (either due to an empty directory or an
error).  This makes the -l and -s options more consistent, like
Solaris and (Debian) Linux.  To make this happen, tweak two
optimizations on the second call to display():

- Don't skip display() altogether, even if list == NULL.
- Don't skip the call to the printfn in display() if we
  need to print the total.

Small clean ups and casts.

bin/ls/extern.h
bin/ls/ls.c
bin/ls/print.c

index 5cd2ec1..f05f6cf 100644 (file)
@@ -28,7 +28,7 @@
  *
  *     from: @(#)extern.h      8.1 (Berkeley) 5/31/93
  * $FreeBSD: src/bin/ls/extern.h,v 1.22 2004/04/06 20:06:47 markm Exp $
- * $DragonFly: src/bin/ls/extern.h,v 1.5 2005/09/18 11:32:19 asmodai Exp $
+ * $DragonFly: src/bin/ls/extern.h,v 1.6 2005/09/18 18:01:49 asmodai Exp $
  */
 
 int     acccmp(const FTSENT *, const FTSENT *);
@@ -40,11 +40,11 @@ int  revnamecmp(const FTSENT *, const FTSENT *);
 int     statcmp(const FTSENT *, const FTSENT *);
 int     revstatcmp(const FTSENT *, const FTSENT *);
 
-void    printcol(DISPLAY *);
-void    printlong(DISPLAY *);
+void    printcol(const DISPLAY *);
+void    printlong(const DISPLAY *);
 int     printname(const char *);
-void    printscol(DISPLAY *);
-void    printstream(DISPLAY *);
+void    printscol(const DISPLAY *);
+void    printstream(const DISPLAY *);
 void    usage(void);
 size_t  len_octal(const char *, int);
 int     prn_octal(const char *);
index 58c706a..b7569df 100644 (file)
@@ -31,8 +31,8 @@
  *
  * @(#) Copyright (c) 1989, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)ls.c    8.5 (Berkeley) 4/2/94
- * $FreeBSD: src/bin/ls/ls.c,v 1.65 2002/08/25 13:01:45 charnier Exp $
- * $DragonFly: src/bin/ls/ls.c,v 1.13 2005/09/18 16:59:54 asmodai Exp $
+ * $FreeBSD: src/bin/ls/ls.c,v 1.78 2004/06/08 09:30:10 das Exp $
+ * $DragonFly: src/bin/ls/ls.c,v 1.14 2005/09/18 18:01:49 asmodai Exp $
  */
 
 #include <sys/types.h>
@@ -86,7 +86,7 @@ static void    display(const FTSENT *, FTSENT *);
 static int      mastercmp(const FTSENT **, const FTSENT **);
 static void     traverse(int, char **, int);
 
-static void (*printfcn)(DISPLAY *);
+static void (*printfcn)(const DISPLAY *);
 static int (*sortfcn)(const FTSENT *, const FTSENT *);
 
 long blocksize;                        /* block size units */
@@ -258,6 +258,7 @@ main(int argc, char *argv[])
                        f_inode = 1;
                        break;
                case 'k':
+                       f_humanval = 0;
                        f_kblocks = 1;
                        break;
                case 'm':
@@ -443,7 +444,13 @@ traverse(int argc, char *argv[], int options)
            fts_open(argv, options, f_nosort ? NULL : mastercmp)) == NULL)
                err(1, "fts_open");
 
-       display(NULL, fts_children(ftsp, 0));
+       /*
+        * We ignore errors from fts_children here since they will be
+        * replicated and signalled on the next call to fts_read() below.
+        */
+       chp = fts_children(ftsp, 0);
+       if (chp != NULL)
+               display(NULL, chp);
        if (f_listdir)
                return;
 
@@ -525,16 +532,6 @@ display(const FTSENT *p, FTSENT *list)
        char ngroup[STRBUF_SIZEOF(uid_t) + 1];
        char nuser[STRBUF_SIZEOF(gid_t) + 1];
 
-       /*
-        * If list is NULL there are two possibilities: that the parent
-        * directory p has no children, or that fts_children() returned an
-        * error.  We ignore the error case since it will be replicated
-        * on the next call to fts_read() on the post-order visit to the
-        * directory p, and will be signaled in traverse().
-        */
-       if (list == NULL)
-               return;
-
        needstats = f_inode || f_longform || f_size;
        flen = 0;
        btotal = 0;
@@ -732,7 +729,13 @@ display(const FTSENT *p, FTSENT *list)
                ++entries;
        }
 
-       if (!entries)
+       /*
+        * If there are no entries to display, we normally stop right
+        * here.  However, we must continue if we have to display the
+        * total block count.  In this case, we display the total only
+        * on the second (p != NULL) pass.
+        */
+       if (!entries && (!(f_longform || f_size) || p == NULL))
                return;
 
        d.list = list;
index 636dc53..9ff176e 100644 (file)
@@ -31,7 +31,7 @@
  *
  * @(#)print.c 8.4 (Berkeley) 4/17/94
  * $FreeBSD: src/bin/ls/print.c,v 1.63 2002/11/06 01:18:12 tjr Exp $
- * $DragonFly: src/bin/ls/print.c,v 1.12 2005/09/18 11:36:08 asmodai Exp $
+ * $DragonFly: src/bin/ls/print.c,v 1.13 2005/09/18 18:01:49 asmodai Exp $
  */
 
 #include <sys/param.h>
@@ -56,7 +56,7 @@
 #include "ls.h"
 #include "extern.h"
 
-static int     printaname(FTSENT *, u_long, u_long);
+static int     printaname(const FTSENT *, u_long, u_long);
 static void    printlink(const FTSENT *);
 static void    printtime(time_t);
 static int     printtype(u_int);
@@ -118,7 +118,7 @@ static struct {
 #endif
 
 void
-printscol(DISPLAY *dp)
+printscol(const DISPLAY *dp)
 {
        FTSENT *p;
 
@@ -145,7 +145,7 @@ printname(const char *name)
 }
 
 void
-printlong(DISPLAY *dp)
+printlong(const DISPLAY *dp)
 {
        struct stat *sp;
        FTSENT *p;
@@ -213,7 +213,7 @@ printlong(DISPLAY *dp)
 }
 
 void
-printstream(DISPLAY *dp)
+printstream(const DISPLAY *dp)
 {
        FTSENT *p;
        int chcnt;
@@ -237,7 +237,7 @@ printstream(DISPLAY *dp)
 }
                
 void
-printcol(DISPLAY *dp)
+printcol(const DISPLAY *dp)
 {
        static FTSENT **array;
        static int lastentries = -1;
@@ -334,7 +334,7 @@ printcol(DISPLAY *dp)
  * return # of characters printed, no trailing characters.
  */
 static int
-printaname(FTSENT *p, u_long inodefield, u_long sizefield)
+printaname(const FTSENT *p, u_long inodefield, u_long sizefield)
 {
        struct stat *sp;
        int chcnt;
@@ -439,7 +439,7 @@ putch(int c)
 static int
 writech(int c)
 {
-       char tmp = c;
+       char tmp = (char)c;
 
        write(STDOUT_FILENO, &tmp, 1);
        return 0;
@@ -500,6 +500,7 @@ colortype(mode_t mode)
        case S_IFCHR:
                printcolor(C_CHR);
                return (1);
+       default:;
        }
        if (mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
                if (mode & S_ISUID)