Module Name: src Committed By: christos Date: Wed Apr 24 14:02:39 UTC 2024
Modified Files: src/usr.sbin/makefs: walk.c Log Message: make a separate sorting function and KNF (thanks rillig) To generate a diff of this commit: cvs rdiff -u -r1.36 -r1.37 src/usr.sbin/makefs/walk.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/makefs/walk.c diff -u src/usr.sbin/makefs/walk.c:1.36 src/usr.sbin/makefs/walk.c:1.37 --- src/usr.sbin/makefs/walk.c:1.36 Tue Apr 23 18:18:56 2024 +++ src/usr.sbin/makefs/walk.c Wed Apr 24 10:02:39 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: walk.c,v 1.36 2024/04/23 22:18:56 christos Exp $ */ +/* $NetBSD: walk.c,v 1.37 2024/04/24 14:02:39 christos Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -41,7 +41,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(__lint) -__RCSID("$NetBSD: walk.c,v 1.36 2024/04/23 22:18:56 christos Exp $"); +__RCSID("$NetBSD: walk.c,v 1.37 2024/04/24 14:02:39 christos Exp $"); #endif /* !__lint */ #include <sys/param.h> @@ -86,6 +86,37 @@ fsnode_cmp(const void *vleft, const void return strcmp(lname, rname); } +static fsnode * +fsnode_sort(fsnode *first, const char *root, const char *dir) +{ + fsnode **list, **listptr; + size_t num = 0; + + for (fsnode *tmp = first; tmp; tmp = tmp->next, num++) { + num++; + if (debug & DEBUG_DUMP_FSNODES_VERBOSE) + printf ("pre sort: %s %s %s\n", root, dir, tmp->name); + } + + list = listptr = ecalloc(num, sizeof(*list)); + for (fsnode *tmp = first; tmp; tmp = tmp->next) + *listptr++ = tmp; + + qsort (list, num, sizeof(*list), fsnode_cmp); + + for (size_t i = 0; i < num - 1; ++i) + list[i]->next = list[i + 1]; + list[num - 1]->next = NULL; + first = list[0]; + assert(strcmp(first->name, ".") == 0); + free(list); + if (debug & DEBUG_DUMP_FSNODES_VERBOSE) + for (fsnode *tmp = first; tmp; tmp = tmp->next) + printf("post sort: %s %s %s\n", root, dir, tmp->name); + + return first; +} + /* * walk_dir -- * build a tree of fsnodes from `root' and `dir', with a parent @@ -106,14 +137,11 @@ walk_dir(const char *root, const char *d char *name, *rp; int dot, len; - fsnode **list, **listptr; - int num = 0; - assert(root != NULL); assert(dir != NULL); len = snprintf(path, sizeof(path), "%s/%s", root, dir); - if (len >= (int)sizeof(path)) + if ((size_t)len >= sizeof(path)) errx(EXIT_FAILURE, "Pathname too long."); if (debug & DEBUG_WALK_DIR) printf("walk_dir: %s %p\n", path, parent); @@ -155,14 +183,16 @@ walk_dir(const char *root, const char *d } else { if (lstat(path, &stbuf) == -1) err(EXIT_FAILURE, "Can't lstat `%s'", path); - /* As symlink permission bits vary between filesystems - (ie. 0755 on FFS/NetBSD, 0777 for ext[234]/Linux), - force them to 0755. */ + /* + * Symlink permission bits vary between filesystems/OSs + * (ie. 0755 on FFS/NetBSD, 0777 for ext[234]/Linux), + * force them to 0755. + */ if (S_ISLNK(stbuf.st_mode)) { stbuf.st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO); stbuf.st_mode |= S_IRWXU - | S_IRGRP | S_IXGRP - | S_IROTH | S_IXOTH; + | S_IRGRP | S_IXGRP + | S_IROTH | S_IXOTH; } } #ifdef S_ISSOCK @@ -273,35 +303,7 @@ walk_dir(const char *root, const char *d if (closedir(dirp) == -1) err(EXIT_FAILURE, "Can't closedir `%s/%s'", root, dir); - /* - * Sort entries. - */ - /* Create a plain list: Count, alloc, add. */ - for (fsnode *tmp = first; tmp; tmp = tmp->next) { - num++; - if (debug & DEBUG_DUMP_FSNODES_VERBOSE) - printf ("pre sort: %s %s %s\n", root, dir, tmp->name); - } - list = listptr = ecalloc (num, sizeof (*list)); - for (fsnode *tmp = first; tmp; tmp = tmp->next) - *listptr++ = tmp; - /* Sort plain list. */ - qsort (list, num, sizeof (*list), &fsnode_cmp); - /* Rewire. */ - for (int i = 0; i < num - 1; ++i) - list[i]->next = list[i+1]; - list[num - 1]->next = NULL; - first = list[0]; - /* Check `first` to be ".". */ - assert (strcmp (first->name, ".") == 0); - /* Free. */ - free (list); - /* Dump sorted state. */ - if (debug & DEBUG_DUMP_FSNODES_VERBOSE) - for (fsnode *tmp = first; tmp; tmp = tmp->next) - printf ("post sort: %s %s %s\n", root, dir, tmp->name); - - return first; + return fsnode_sort(first, root, dir); } static fsnode *