Author: brooks
Date: Thu Mar 14 22:57:27 2013
New Revision: 248293
URL: http://svnweb.freebsd.org/changeset/base/248293

Log:
  MFC all change to makefs through r247052.  Key functional changes
  include:
  
  r239562:
  Add -p flag to create the image as a sparse file.
  
  r242501:
  If no contents keyword is specified, the default for files is
  the named file.
  
  r247041:
  Add a -D flag that causes duplicate entries in an mtree manifest to be
  treated as warnings rather than errors.
  
  r247042:
  Fix the -N option in manifest mode by using pwcache(3).  This also
  speeds up image creation appreciably.
  
  r247043:
  Allow '.' components in manifest paths.  They are always the first
  component of mtree -C and install -M output and are easily skipped.
  
  r247052:
  Support hardlinks in manifest files by the same logic as the treewalk
  code.

Modified:
  stable/9/usr.sbin/makefs/cd9660.c
  stable/9/usr.sbin/makefs/cd9660/cd9660_eltorito.c
  stable/9/usr.sbin/makefs/cd9660/cd9660_write.c
  stable/9/usr.sbin/makefs/cd9660/iso9660_rrip.c
  stable/9/usr.sbin/makefs/ffs.c
  stable/9/usr.sbin/makefs/ffs/ffs_alloc.c
  stable/9/usr.sbin/makefs/ffs/ffs_extern.h
  stable/9/usr.sbin/makefs/ffs/ffs_subr.c
  stable/9/usr.sbin/makefs/ffs/ufs_bmap.c
  stable/9/usr.sbin/makefs/makefs.8
  stable/9/usr.sbin/makefs/makefs.c
  stable/9/usr.sbin/makefs/makefs.h
  stable/9/usr.sbin/makefs/mtree.c
  stable/9/usr.sbin/makefs/walk.c
Directory Properties:
  stable/9/usr.sbin/makefs/   (props changed)

Modified: stable/9/usr.sbin/makefs/cd9660.c
==============================================================================
--- stable/9/usr.sbin/makefs/cd9660.c   Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/cd9660.c   Thu Mar 14 22:57:27 2013        
(r248293)
@@ -621,10 +621,6 @@ static void
 cd9660_finalize_PVD(void)
 {
        time_t tim;
-       unsigned char *temp;
-
-       /* Copy the root directory record */
-       temp = (unsigned char *) &diskStructure.primaryDescriptor;
 
        /* root should be a fixed size of 34 bytes since it has no name */
        memcpy(diskStructure.primaryDescriptor.root_directory_record,
@@ -1051,7 +1047,7 @@ static cd9660node *
 cd9660_rename_filename(cd9660node *iter, int num, int delete_chars)
 {
        int i = 0;
-       int numbts, dot, semi, digit, digits, temp, powers, multiplier, count;
+       int numbts, digit, digits, temp, powers, count;
        char *naming;
        int maxlength;
         char *tmp;
@@ -1073,7 +1069,6 @@ cd9660_rename_filename(cd9660node *iter,
                powers = 1;
                count = 0;
                digits = 1;
-               multiplier = 1;
                while (((int)(i / powers) ) >= 10) {
                        digits++;
                        powers = powers * 10;
@@ -1088,15 +1083,9 @@ cd9660_rename_filename(cd9660node *iter,
                }
                */
 
-               dot = -1;
-               semi = -1;
                while (count < maxlength) {
-                       if (*naming == '.')
-                               dot = count;
-                       else if (*naming == ';') {
-                               semi = count;
+                       if (*naming == ';')
                                break;
-                       }
                        naming++;
                        count++;
                }
@@ -1527,7 +1516,6 @@ cd9660_generate_path_table(void)
        cd9660node *last = dirNode;
        int pathTableSize = 0;  /* computed as we go */
        int counter = 1;        /* root gets a count of 0 */
-       int parentRecNum = 0;   /* root's parent is '0' */
 
        TAILQ_HEAD(cd9660_pt_head, ptq_entry) pt_head;
        TAILQ_INIT(&pt_head);
@@ -1557,10 +1545,6 @@ cd9660_generate_path_table(void)
                }
                last = dirNode;
 
-               parentRecNum = 1;
-               if (dirNode->parent != 0)
-                       parentRecNum = dirNode->parent->ptnumber;
-
                /* Push children onto queue */
                TAILQ_FOREACH(cn, &dirNode->cn_children, cn_next_child) {
                        /*

Modified: stable/9/usr.sbin/makefs/cd9660/cd9660_eltorito.c
==============================================================================
--- stable/9/usr.sbin/makefs/cd9660/cd9660_eltorito.c   Thu Mar 14 22:55:59 
2013        (r248292)
+++ stable/9/usr.sbin/makefs/cd9660/cd9660_eltorito.c   Thu Mar 14 22:57:27 
2013        (r248293)
@@ -610,7 +610,7 @@ cd9660_write_boot(FILE *fd)
                            e->entry_type);
                }
                /*
-                * It doesnt matter which one gets written
+                * It doesn't matter which one gets written
                 * since they are the same size
                 */
                fwrite(&(e->entry_data.VE), 1, 32, fd);

Modified: stable/9/usr.sbin/makefs/cd9660/cd9660_write.c
==============================================================================
--- stable/9/usr.sbin/makefs/cd9660/cd9660_write.c      Thu Mar 14 22:55:59 
2013        (r248292)
+++ stable/9/usr.sbin/makefs/cd9660/cd9660_write.c      Thu Mar 14 22:57:27 
2013        (r248293)
@@ -305,10 +305,10 @@ cd9660_write_file(FILE *fd, cd9660node *
                }
        } else {
                /*
-                * Here is a new revelation that ECMA didnt explain
+                * Here is a new revelation that ECMA didn't explain
                 * (at least not well).
                 * ALL . and .. records store the name "\0" and "\1"
-                * resepctively. So, for each directory, we have to
+                * respectively. So, for each directory, we have to
                 * make a new node.
                 *
                 * This is where it gets kinda messy, since we have to

Modified: stable/9/usr.sbin/makefs/cd9660/iso9660_rrip.c
==============================================================================
--- stable/9/usr.sbin/makefs/cd9660/iso9660_rrip.c      Thu Mar 14 22:55:59 
2013        (r248292)
+++ stable/9/usr.sbin/makefs/cd9660/iso9660_rrip.c      Thu Mar 14 22:57:27 
2013        (r248293)
@@ -298,7 +298,7 @@ cd9660_susp_initialize_node(cd9660node *
         * CE: is added for us where needed
         * ST: not sure if it is even required, but if so, should be
         *     handled by the CE code
-        * PD: isnt needed (though might be added for testing)
+        * PD: isn't needed (though might be added for testing)
         * SP: is stored ONLY on the . record of the root directory
         * ES: not sure
         */

Modified: stable/9/usr.sbin/makefs/ffs.c
==============================================================================
--- stable/9/usr.sbin/makefs/ffs.c      Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/ffs.c      Thu Mar 14 22:57:27 2013        
(r248293)
@@ -145,7 +145,7 @@ static  void        *ffs_build_dinode2(struct u
 
 int    sectorsize;             /* XXX: for buf.c::getblk() */
 
-       /* publically visible functions */
+       /* publicly visible functions */
 
 void
 ffs_prep_opts(fsinfo_t *fsopts)
@@ -493,13 +493,25 @@ ffs_create_image(const char *image, fsin
                bufsize = sfs.f_iosize;
 #endif
        bufrem = fsopts->size;
-       if (debug & DEBUG_FS_CREATE_IMAGE)
-               printf(
-                   "zero-ing image `%s', %lld sectors, using %d byte chunks\n",
-                   image, (long long)bufrem, bufsize);
-       if ((buf = calloc(1, bufsize)) == NULL) {
-               warn("Can't create buffer for sector");
-               return (-1);
+       if (fsopts->sparse) {
+               if (ftruncate(fsopts->fd, bufrem) == -1) {
+                       warn("sparse option disabled.\n");
+                       fsopts->sparse = 0;
+               }
+       }
+       if (fsopts->sparse) {
+               /* File truncated at bufrem. Remaining is 0 */
+               bufrem = 0;
+               buf = NULL;
+       } else {
+               if (debug & DEBUG_FS_CREATE_IMAGE)
+                       printf("zero-ing image `%s', %lld sectors, "
+                           "using %d byte chunks\n", image, (long long)bufrem,
+                           bufsize);
+               if ((buf = calloc(1, bufsize)) == NULL) {
+                       warn("Can't create buffer for sector");
+                       return (-1);
+               }
        }
        while (bufrem > 0) {
                i = write(fsopts->fd, buf, MIN(bufsize, bufrem));
@@ -511,7 +523,8 @@ ffs_create_image(const char *image, fsin
                }
                bufrem -= i;
        }
-       free(buf);
+       if (buf)
+               free(buf);
 
                /* make the file system */
        if (debug & DEBUG_FS_CREATE_IMAGE)

Modified: stable/9/usr.sbin/makefs/ffs/ffs_alloc.c
==============================================================================
--- stable/9/usr.sbin/makefs/ffs/ffs_alloc.c    Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/ffs/ffs_alloc.c    Thu Mar 14 22:57:27 2013        
(r248293)
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/time.h>
 
 #include <errno.h>
+#include <stdint.h>
 
 #include "makefs.h"
 
@@ -439,8 +440,8 @@ ffs_blkfree(struct inode *ip, daddr_t bn
        }
        cg = dtog(fs, bno);
        if (bno >= fs->fs_size) {
-               warnx("bad block %lld, ino %llu", (long long)bno,
-                   (unsigned long long)ip->i_number);
+               warnx("bad block %lld, ino %ju", (long long)bno,
+                   (uintmax_t)ip->i_number);
                return;
        }
        error = bread(ip->i_fd, ip->i_fs, fsbtodb(fs, cgtod(fs, cg)),

Modified: stable/9/usr.sbin/makefs/ffs/ffs_extern.h
==============================================================================
--- stable/9/usr.sbin/makefs/ffs/ffs_extern.h   Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/ffs/ffs_extern.h   Thu Mar 14 22:57:27 2013        
(r248293)
@@ -35,6 +35,8 @@
 
 #include "ffs/buf.h"
 
+struct inode;
+
 /*
  * Structure used to pass around logical block paths generated by
  * ufs_getlbns and used by truncate and bmap code.
@@ -42,12 +44,10 @@
 struct indir {
        daddr_t in_lbn;         /* Logical block number. */
        int     in_off;                 /* Offset in buffer. */
-       int     in_exists;              /* Flag if the block exists. */
 };
 
        /* ffs.c */
-void panic(const char *, ...)
-    __attribute__((__noreturn__,__format__(__printf__,1,2)));  
+_Noreturn void panic(const char *, ...) __printflike(1, 2);
 
        /* ffs_alloc.c */
 int ffs_alloc(struct inode *, daddr_t, daddr_t, int, daddr_t *);

Modified: stable/9/usr.sbin/makefs/ffs/ffs_subr.c
==============================================================================
--- stable/9/usr.sbin/makefs/ffs/ffs_subr.c     Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/ffs/ffs_subr.c     Thu Mar 14 22:57:27 2013        
(r248293)
@@ -38,11 +38,9 @@ __FBSDID("$FreeBSD$");
 
 #include <ufs/ufs/dinode.h>
 #include <ufs/ffs/fs.h>
+#include "ffs/ffs_extern.h"
 #include "ffs/ufs_bswap.h"
 
-void    panic __P((const char *, ...))
-    __attribute__((__noreturn__,__format__(__printf__,1,2)));
-
 /*
  * Update the frsum fields to reflect addition or deletion 
  * of some frags.
@@ -80,8 +78,8 @@ ffs_fragacct_swap(struct fs *fs, int fra
  * block operations
  *
  * check if a block is available
- *  returns true if all the correponding bits in the free map are 1
- *  returns false if any corresponding bit in the free map is 0 
+ *  returns true if all the corresponding bits in the free map are 1
+ *  returns false if any corresponding bit in the free map is 0
  */
 int
 ffs_isblock(fs, cp, h)

Modified: stable/9/usr.sbin/makefs/ffs/ufs_bmap.c
==============================================================================
--- stable/9/usr.sbin/makefs/ffs/ufs_bmap.c     Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/ffs/ufs_bmap.c     Thu Mar 14 22:57:27 2013        
(r248293)
@@ -117,7 +117,6 @@ ufs_getlbns(struct inode *ip, daddr_t bn
         */
        ap->in_lbn = metalbn;
        ap->in_off = off = NIADDR - i;
-       ap->in_exists = 0;
        ap++;
        for (++numlevels; i <= NIADDR; i++) {
                /* If searching for a meta-data block, quit when found. */
@@ -131,7 +130,6 @@ ufs_getlbns(struct inode *ip, daddr_t bn
                ++numlevels;
                ap->in_lbn = metalbn;
                ap->in_off = off;
-               ap->in_exists = 0;
                ++ap;
 
                metalbn -= -1 + (off << lbc);

Modified: stable/9/usr.sbin/makefs/makefs.8
==============================================================================
--- stable/9/usr.sbin/makefs/makefs.8   Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/makefs.8   Thu Mar 14 22:57:27 2013        
(r248293)
@@ -35,7 +35,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 30, 2012
+.Dd August 22, 2012
 .Dt MAKEFS 8
 .Os
 .Sh NAME
@@ -43,7 +43,7 @@
 .Nd create a file system image from a directory tree or a mtree manifest
 .Sh SYNOPSIS
 .Nm
-.Op Fl x
+.Op Fl Dpx
 .Op Fl B Ar byte-order
 .Op Fl b Ar free-blocks
 .Op Fl d Ar debug-mask
@@ -106,6 +106,8 @@ An optional
 suffix may be provided to indicate that
 .Ar free-blocks
 indicates a percentage of the calculated image size.
+.It Fl D
+Treat duplicate paths in an mtree manifest as warnings not error.
 .It Fl d Ar debug-mask
 Enable various levels of debugging, depending upon which bits are
 set in
@@ -188,6 +190,8 @@ Set file system specific options.
 .Ar fs-options
 is a comma separated list of options.
 Valid file system specific options are detailed below.
+.It Fl p
+Create the image as a sparse file.
 .It Fl S Ar sector-size
 Set the file system sector size to
 .Ar sector-size .

Modified: stable/9/usr.sbin/makefs/makefs.c
==============================================================================
--- stable/9/usr.sbin/makefs/makefs.c   Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/makefs.c   Thu Mar 14 22:57:27 2013        
(r248293)
@@ -73,6 +73,7 @@ static fstype_t fstypes[] = {
 };
 
 u_int          debug;
+int            dupsok;
 struct timespec        start_time;
 
 static fstype_t *get_fstype(const char *);
@@ -112,7 +113,7 @@ main(int argc, char *argv[])
        start_time.tv_sec = start.tv_sec;
        start_time.tv_nsec = start.tv_usec * 1000;
 
-       while ((ch = getopt(argc, argv, "B:b:d:f:F:M:m:N:o:s:S:t:x")) != -1) {
+       while ((ch = getopt(argc, argv, "B:b:Dd:f:F:M:m:N:o:ps:S:t:x")) != -1) {
                switch (ch) {
 
                case 'B':
@@ -148,6 +149,10 @@ main(int argc, char *argv[])
                        }
                        break;
 
+               case 'D':
+                       dupsok = 1;
+                       break;
+
                case 'd':
                        debug = strtoll(optarg, NULL, 0);
                        break;
@@ -199,6 +204,9 @@ main(int argc, char *argv[])
                        }
                        break;
                }
+               case 'p':
+                       fsoptions.sparse = 1;
+                       break;
 
                case 's':
                        fsoptions.minsize = fsoptions.maxsize =
@@ -346,7 +354,7 @@ usage(void)
        fprintf(stderr,
 "usage: %s [-t fs-type] [-o fs-options] [-d debug-mask] [-B endian]\n"
 "\t[-S sector-size] [-M minimum-size] [-m maximum-size] [-s image-size]\n"
-"\t[-b free-blocks] [-f free-files] [-F mtree-specfile] [-x]\n"
+"\t[-b free-blocks] [-f free-files] [-F mtree-specfile] [-px]\n"
 "\t[-N userdb-dir] image-file directory | manifest [extra-directory ...]\n",
            prog);
        exit(1);

Modified: stable/9/usr.sbin/makefs/makefs.h
==============================================================================
--- stable/9/usr.sbin/makefs/makefs.h   Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/makefs.h   Thu Mar 14 22:57:27 2013        
(r248293)
@@ -129,6 +129,7 @@ typedef struct {
        int     freeblockpc;    /* free block % */
        int     needswap;       /* non-zero if byte swapping needed */
        int     sectorsize;     /* sector size */
+       int     sparse;         /* sparse image, don't fill it with zeros */
 
        void    *fs_specific;   /* File system specific additions. */
 } fsinfo_t;
@@ -168,6 +169,7 @@ void                cd9660_makefs(const char *, const 
 
 
 extern u_int           debug;
+extern int             dupsok;
 extern struct timespec start_time;
 
 /*
@@ -278,6 +280,8 @@ extern      struct timespec start_time;
 struct fs;
 void   ffs_fragacct_swap(struct fs *, int, int32_t [], int, int);
 
+fsinode *link_check(fsinode *);
+
 /*
  * Declarations for compat routines.
  */

Modified: stable/9/usr.sbin/makefs/mtree.c
==============================================================================
--- stable/9/usr.sbin/makefs/mtree.c    Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/mtree.c    Thu Mar 14 22:57:27 2013        
(r248293)
@@ -135,6 +135,47 @@ mtree_warning(const char *fmt, ...)
        fputc('\n', stderr);
 }
 
+#ifndef MAKEFS_MAX_TREE_DEPTH
+# define MAKEFS_MAX_TREE_DEPTH (MAXPATHLEN/2)
+#endif
+
+/* construct path to node->name */
+static char *
+mtree_file_path(fsnode *node)
+{
+       fsnode *pnode;
+       struct sbuf *sb;
+       char *res, *rp[MAKEFS_MAX_TREE_DEPTH];
+       int depth;
+
+       depth = 0;
+       rp[depth] = node->name;
+       for (pnode = node->parent; pnode && depth < MAKEFS_MAX_TREE_DEPTH;
+            pnode = pnode->parent) {
+               if (strcmp(pnode->name, ".") == 0)
+                       break;
+               rp[++depth] = pnode->name;
+       }
+       
+       sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND);
+       if (sb == NULL) {
+               errno = ENOMEM;
+               return (NULL);
+       }
+       while (depth > 0) {
+               sbuf_cat(sb, rp[depth--]);
+               sbuf_putc(sb, '/');
+       }
+       sbuf_cat(sb, rp[depth]);
+       sbuf_finish(sb);
+       res = strdup(sbuf_data(sb));
+       sbuf_delete(sb);
+       if (res == NULL)
+               errno = ENOMEM;
+       return res;
+
+}
+
 /* mtree_resolve() sets errno to indicate why NULL was returned. */
 static char *
 mtree_resolve(const char *spec, int *istemp)
@@ -467,8 +508,8 @@ read_mtree_keywords(FILE *fp, fsnode *no
 {
        char keyword[PATH_MAX];
        char *name, *p, *value;
-       struct group *grent;
-       struct passwd *pwent;
+       gid_t gid;
+       uid_t uid;
        struct stat *st, sb;
        intmax_t num;
        u_long flset, flclr;
@@ -544,11 +585,10 @@ read_mtree_keywords(FILE *fp, fsnode *no
                                        error = ENOATTR;
                                        break;
                                }
-                               grent = getgrnam(value);
-                               if (grent != NULL)
-                                       st->st_gid = grent->gr_gid;
+                               if (gid_from_group(value, &gid) == 0)
+                                       st->st_gid = gid;
                                else
-                                       error = errno;
+                                       error = EINVAL;
                        } else
                                error = ENOSYS;
                        break;
@@ -657,11 +697,10 @@ read_mtree_keywords(FILE *fp, fsnode *no
                                        error = ENOATTR;
                                        break;
                                }
-                               pwent = getpwnam(value);
-                               if (pwent != NULL)
-                                       st->st_uid = pwent->pw_uid;
+                               if (uid_from_user(value, &uid) == 0)
+                                       st->st_uid = uid;
                                else
-                                       error = errno;
+                                       error = EINVAL;
                        } else
                                error = ENOSYS;
                        break;
@@ -706,6 +745,12 @@ read_mtree_keywords(FILE *fp, fsnode *no
                        return (0);
                }
                type = S_IFREG;
+       } else if (node->type != 0) {
+               type = node->type;
+               if (type == S_IFREG) {
+                       /* the named path is the default contents */
+                       node->contents = mtree_file_path(node);
+               }
        } else
                type = (node->symlink != NULL) ? S_IFLNK : S_IFDIR;
 
@@ -734,6 +779,24 @@ read_mtree_keywords(FILE *fp, fsnode *no
                return (0);
        }
 
+       /*
+         * Check for hardlinks. If the contents key is used, then the check
+         * will only trigger if the contents file is a link even if it is used
+         * by more than one file
+        */
+       if (sb.st_nlink > 1) {
+               fsinode *curino;
+
+               st->st_ino = sb.st_ino;
+               st->st_dev = sb.st_dev;
+               curino = link_check(node->inode);
+               if (curino != NULL) {
+                       free(node->inode);
+                       node->inode = curino;
+                       node->inode->nlink++;
+               }
+       }
+
        free(node->contents);
        node->contents = name;
        st->st_size = sb.st_size;
@@ -834,8 +897,14 @@ read_mtree_spec1(FILE *fp, bool def, con
 
                if (strcmp(name, node->name) == 0) {
                        if (def == true) {
-                               mtree_error("duplicate definition of %s",
-                                   name);
+                               if (!dupsok)
+                                       mtree_error(
+                                           "duplicate definition of %s",
+                                           name);
+                               else
+                                       mtree_warning(
+                                           "duplicate definition of %s",
+                                           name);
                                return (0);
                        }
 
@@ -923,15 +992,15 @@ read_mtree_spec(FILE *fp)
                do {
                        *cp++ = '\0';
 
-                       /* Disallow '.' and '..' as components. */
-                       if (IS_DOT(pathspec) || IS_DOTDOT(pathspec)) {
-                               mtree_error("absolute path cannot contain . "
-                                   "or .. components");
+                       /* Disallow '..' as a component. */
+                       if (IS_DOTDOT(pathspec)) {
+                               mtree_error("absolute path cannot contain "
+                                   ".. component");
                                goto out;
                        }
 
-                       /* Ignore multiple adjacent slashes. */
-                       if (pathspec[0] != '\0')
+                       /* Ignore multiple adjacent slashes and '.'. */
+                       if (pathspec[0] != '\0' && !IS_DOT(pathspec))
                                error = read_mtree_spec1(fp, false, pathspec);
                        memmove(pathspec, cp, strlen(cp) + 1);
                        cp = strchr(pathspec, '/');

Modified: stable/9/usr.sbin/makefs/walk.c
==============================================================================
--- stable/9/usr.sbin/makefs/walk.c     Thu Mar 14 22:55:59 2013        
(r248292)
+++ stable/9/usr.sbin/makefs/walk.c     Thu Mar 14 22:57:27 2013        
(r248293)
@@ -59,7 +59,6 @@ static        void     apply_specdir(const char *,
 static void     apply_specentry(const char *, NODE *, fsnode *);
 static fsnode  *create_fsnode(const char *, const char *, const char *,
                               struct stat *);
-static fsinode *link_check(fsinode *);
 
 
 /*
@@ -236,7 +235,7 @@ create_fsnode(const char *root, const ch
 /*
  * free_fsnodes --
  *     Removes node from tree and frees it and all of
- *   its decendents.
+ *   its descendants.
  */
 void
 free_fsnodes(fsnode *node)
@@ -644,7 +643,7 @@ inode_type(mode_t mode)
 /* This was borrowed from du.c and tweaked to keep an fsnode 
  * pointer instead. -- d...@netbsd.org
  */
-static fsinode *
+fsinode *
 link_check(fsinode *entry)
 {
        static struct entry {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to