FreeCalypso > hg > freecalypso-tools
diff ffstools/tiffs-mkfs/input.c @ 705:12ae93940467
tiffs-mkfs program written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 20 May 2020 06:55:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ffstools/tiffs-mkfs/input.c Wed May 20 06:55:58 2020 +0000 @@ -0,0 +1,112 @@ +#include <sys/types.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <dirent.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <unistd.h> +#include "struct.h" +#include "globals.h" + +void +read_dir_level(dto, srcpath, depth) + struct tree_object *dto; + char *srcpath; +{ + DIR *rdd; + struct dirent *dirent; + char hostpath_child[MAXPATHLEN]; + struct stat hst; + struct tree_object *cto; + unsigned nchildren; + + dto->is_dir = 1; + rdd = opendir(srcpath); + if (!rdd) { + perror(srcpath); + exit(1); + } + nchildren = 0; + while (dirent = readdir(rdd)) { + if (dirent->d_name[0] == '.') + continue; + if (strlen(dirent->d_name) > MAX_FN_COMPONENT) { + fprintf(stderr, + "error: \"%s\" in %s exceeds the FFS component name limit\n", + dirent->d_name, srcpath); + exit(1); + } + if (nchildren >= MAX_DIR_ENTRIES) { + fprintf(stderr, "error: %s has too many children\n", + srcpath); + exit(1); + } + cto = malloc(sizeof(struct tree_object)); + if (!cto) { + perror("malloc of struct tree_object"); + exit(1); + } + strcpy(cto->name, dirent->d_name); + dto->u.d.children[nchildren++] = cto; + if (strlen(srcpath) + strlen(dirent->d_name) + 2 > + sizeof hostpath_child) { + fprintf(stderr, + "error: host side pathname buffer overflow\n"); + exit(1); + } + sprintf(hostpath_child, "%s/%s", srcpath, dirent->d_name); + if (lstat(hostpath_child, &hst) < 0) { + perror(hostpath_child); + exit(1); + } + switch (hst.st_mode & S_IFMT) { + case S_IFREG: + cto->is_dir = 0; + strcpy(cto->u.f.host_pathname, hostpath_child); + break; + case S_IFDIR: + if (depth >= MAX_DIR_NEST-1) { + fprintf(stderr, + "error: directory nesting too deep at %s\n", + hostpath_child); + exit(1); + } + read_dir_level(cto, hostpath_child, depth + 1); + break; + default: + fprintf(stderr, + "error: %s is neither a regular file nor a directory\n", + hostpath_child); + exit(1); + } + } + closedir(rdd); + dto->u.d.nchildren = nchildren; +} + +static int +compare_func(p1, p2) + struct tree_object **p1, **p2; +{ + return strcmp((*p1)->name, (*p2)->name); +} + +void +sort_dir_level(dto) + struct tree_object *dto; +{ + unsigned n; + struct tree_object *cto; + + if (dto->u.d.nchildren > 1) + qsort(dto->u.d.children, dto->u.d.nchildren, + sizeof(struct tree_object *), compare_func); + for (n = 0; n < dto->u.d.nchildren; n++) { + cto = dto->u.d.children[n]; + if (cto->is_dir) + sort_dir_level(cto); + } +}