diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2018-12-17 17:10:18 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2018-12-17 17:10:18 -0500 |
commit | e95ec269efdfbd97b5d0ee85dda38e7bae498181 (patch) | |
tree | 0dda13650a3438feece9bfde6e9e75ed2c2fb269 | |
parent | f5ba88ebfed936cfdee3a2ab3d6f690d291e9627 (diff) | |
download | bfs-e95ec269efdfbd97b5d0ee85dda38e7bae498181.tar.xz |
bftw: Move bftw_typeflag conversion out of util
Turns out incomplete enum types are a GNU C extension.
-rw-r--r-- | bftw.c | 101 | ||||
-rw-r--r-- | bftw.h | 5 | ||||
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | printf.c | 2 | ||||
-rw-r--r-- | util.c | 99 | ||||
-rw-r--r-- | util.h | 10 |
6 files changed, 107 insertions, 112 deletions
@@ -652,12 +652,109 @@ static struct bftw_dir *bftw_queue_pop(struct bftw_queue *queue) { return dir; } +enum bftw_typeflag bftw_mode_typeflag(mode_t mode) { + switch (mode & S_IFMT) { +#ifdef S_IFBLK + case S_IFBLK: + return BFTW_BLK; +#endif +#ifdef S_IFCHR + case S_IFCHR: + return BFTW_CHR; +#endif +#ifdef S_IFDIR + case S_IFDIR: + return BFTW_DIR; +#endif +#ifdef S_IFDOOR + case S_IFDOOR: + return BFTW_DOOR; +#endif +#ifdef S_IFIFO + case S_IFIFO: + return BFTW_FIFO; +#endif +#ifdef S_IFLNK + case S_IFLNK: + return BFTW_LNK; +#endif +#ifdef S_IFPORT + case S_IFPORT: + return BFTW_PORT; +#endif +#ifdef S_IFREG + case S_IFREG: + return BFTW_REG; +#endif +#ifdef S_IFSOCK + case S_IFSOCK: + return BFTW_SOCK; +#endif +#ifdef S_IFWHT + case S_IFWHT: + return BFTW_WHT; +#endif + + default: + return BFTW_UNKNOWN; + } +} + +static enum bftw_typeflag bftw_dirent_typeflag(const struct dirent *de) { +#if defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) + switch (de->d_type) { +#ifdef DT_BLK + case DT_BLK: + return BFTW_BLK; +#endif +#ifdef DT_CHR + case DT_CHR: + return BFTW_CHR; +#endif +#ifdef DT_DIR + case DT_DIR: + return BFTW_DIR; +#endif +#ifdef DT_DOOR + case DT_DOOR: + return BFTW_DOOR; +#endif +#ifdef DT_FIFO + case DT_FIFO: + return BFTW_FIFO; +#endif +#ifdef DT_LNK + case DT_LNK: + return BFTW_LNK; +#endif +#ifdef DT_PORT + case DT_PORT: + return BFTW_PORT; +#endif +#ifdef DT_REG + case DT_REG: + return BFTW_REG; +#endif +#ifdef DT_SOCK + case DT_SOCK: + return BFTW_SOCK; +#endif +#ifdef DT_WHT + case DT_WHT: + return BFTW_WHT; +#endif + } +#endif + + return BFTW_UNKNOWN; +} + /** Call stat() and use the results. */ static int bftw_stat(struct BFTW *ftwbuf, struct bfs_stat *sb) { int ret = bfs_stat(ftwbuf->at_fd, ftwbuf->at_path, ftwbuf->at_flags, BFS_STAT_BROKEN_OK, sb); if (ret == 0) { ftwbuf->statbuf = sb; - ftwbuf->typeflag = mode_to_typeflag(sb->mode); + ftwbuf->typeflag = bftw_mode_typeflag(sb->mode); } return ret; } @@ -809,7 +906,7 @@ static void bftw_prepare_visit(struct bftw_state *state) { ftwbuf->typeflag = BFTW_ERROR; return; } else if (de) { - ftwbuf->typeflag = dirent_to_typeflag(de); + ftwbuf->typeflag = bftw_dirent_typeflag(de); } else if (ftwbuf->depth > 0) { ftwbuf->typeflag = BFTW_DIR; } else { @@ -51,6 +51,11 @@ enum bftw_typeflag { }; /** + * Convert a bfs_stat() mode to a bftw() typeflag. + */ +enum bftw_typeflag bftw_mode_typeflag(mode_t mode); + +/** * Possible visit occurrences. */ enum bftw_visit { @@ -919,7 +919,7 @@ bool eval_xtype(const struct expr *expr, struct eval_state *state) { const struct bfs_stat *statbuf = eval_xstat(state); if (statbuf) { - return mode_to_typeflag(statbuf->mode) & expr->idata; + return bftw_mode_typeflag(statbuf->mode) & expr->idata; } else if (!follow && is_nonexistence_error(errno)) { // Broken symlink return eval_type(expr, state); @@ -405,7 +405,7 @@ static int bfs_printf_Y(FILE *file, const struct bfs_printf_directive *directive struct bfs_stat sb; if (bfs_stat(ftwbuf->at_fd, ftwbuf->at_path, 0, 0, &sb) == 0) { - type = bfs_printf_type(mode_to_typeflag(sb.mode)); + type = bfs_printf_type(bftw_mode_typeflag(sb.mode)); } else { switch (errno) { case ELOOP: @@ -173,7 +173,7 @@ int xlocaltime(const time_t *timep, struct tm *result) { void format_mode(mode_t mode, char str[11]) { strcpy(str, "----------"); - switch (mode_to_typeflag(mode)) { + switch (bftw_mode_typeflag(mode)) { case BFTW_BLK: str[0] = 'b'; break; @@ -275,103 +275,6 @@ bool is_nonexistence_error(int error) { return error == ENOENT || errno == ENOTDIR; } -enum bftw_typeflag mode_to_typeflag(mode_t mode) { - switch (mode & S_IFMT) { -#ifdef S_IFBLK - case S_IFBLK: - return BFTW_BLK; -#endif -#ifdef S_IFCHR - case S_IFCHR: - return BFTW_CHR; -#endif -#ifdef S_IFDIR - case S_IFDIR: - return BFTW_DIR; -#endif -#ifdef S_IFDOOR - case S_IFDOOR: - return BFTW_DOOR; -#endif -#ifdef S_IFIFO - case S_IFIFO: - return BFTW_FIFO; -#endif -#ifdef S_IFLNK - case S_IFLNK: - return BFTW_LNK; -#endif -#ifdef S_IFPORT - case S_IFPORT: - return BFTW_PORT; -#endif -#ifdef S_IFREG - case S_IFREG: - return BFTW_REG; -#endif -#ifdef S_IFSOCK - case S_IFSOCK: - return BFTW_SOCK; -#endif -#ifdef S_IFWHT - case S_IFWHT: - return BFTW_WHT; -#endif - - default: - return BFTW_UNKNOWN; - } -} - -enum bftw_typeflag dirent_to_typeflag(const struct dirent *de) { -#if defined(_DIRENT_HAVE_D_TYPE) || defined(DT_UNKNOWN) - switch (de->d_type) { -#ifdef DT_BLK - case DT_BLK: - return BFTW_BLK; -#endif -#ifdef DT_CHR - case DT_CHR: - return BFTW_CHR; -#endif -#ifdef DT_DIR - case DT_DIR: - return BFTW_DIR; -#endif -#ifdef DT_DOOR - case DT_DOOR: - return BFTW_DOOR; -#endif -#ifdef DT_FIFO - case DT_FIFO: - return BFTW_FIFO; -#endif -#ifdef DT_LNK - case DT_LNK: - return BFTW_LNK; -#endif -#ifdef DT_PORT - case DT_PORT: - return BFTW_PORT; -#endif -#ifdef DT_REG - case DT_REG: - return BFTW_REG; -#endif -#ifdef DT_SOCK - case DT_SOCK: - return BFTW_SOCK; -#endif -#ifdef DT_WHT - case DT_WHT: - return BFTW_WHT; -#endif - } -#endif - - return BFTW_UNKNOWN; -} - /** Read a line from standard input. */ static char *xgetline() { char *line = dstralloc(0); @@ -166,16 +166,6 @@ int xfaccessat(int fd, const char *path, int amode); bool is_nonexistence_error(int error); /** - * Convert a bfs_stat() mode to a bftw() typeflag. - */ -enum bftw_typeflag mode_to_typeflag(mode_t mode); - -/** - * Convert a directory entry to a bftw() typeflag. - */ -enum bftw_typeflag dirent_to_typeflag(const struct dirent *de); - -/** * Process a yes/no prompt. * * @return 1 for yes, 0 for no, and -1 for unknown. |