From cc1b289394f993fa1a75b845553eea44e85e5051 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sun, 17 Mar 2013 16:32:35 -0500 Subject: [PATCH 1/1] Add untracked files programs/imagex-win32.{c,h} --- programs/imagex-win32.c | 96 +++++++++++++++++++++++++++++++++++++++++ programs/imagex-win32.h | 27 ++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 programs/imagex-win32.c create mode 100644 programs/imagex-win32.h diff --git a/programs/imagex-win32.c b/programs/imagex-win32.c new file mode 100644 index 00000000..3c449a77 --- /dev/null +++ b/programs/imagex-win32.c @@ -0,0 +1,96 @@ + +/* Replacements for functions needed specifically by the 'imagex' program in + * Windows native builds */ + +#ifndef __WIN32__ +# error "This file contains Windows code" +#endif + +#include "imagex-win32.h" +#include +#include +#include +#include + + +/* Replacement for glob() in Windows native builds. */ +int glob(const char *pattern, int flags, + int (*errfunc)(const char *epath, int eerrno), + glob_t *pglob) +{ + WIN32_FIND_DATA dat; + DWORD err; + HANDLE hFind; + int ret; + size_t nspaces; + + /* This function does not support all functionality of the POSIX glob(), + * so make sure the parameters are consistent with supported + * functionality. */ + assert(errfunc == NULL); + assert((flags & GLOB_ERR) == GLOB_ERR); + assert((flags & ~(GLOB_NOSORT | GLOB_ERR)) == 0); + + hFind = FindFirstFileA(pattern, &dat); + if (hFind == INVALID_HANDLE_VALUE) { + err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) { + errno = 0; + return GLOB_NOMATCH; + } else { + /* The other possible error codes for FindFirstFile() + * are undocumented. */ + errno = EIO; + return GLOB_ABORTED; + } + } + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + nspaces = 0; + do { + char *filename; + if (pglob->gl_pathc == nspaces) { + size_t new_nspaces; + char **pathv; + + new_nspaces = nspaces * 2 + 1; + pathv = realloc(pglob->gl_pathv, + new_nspaces * sizeof(pglob->gl_pathv[0])); + if (!pathv) + goto oom; + pglob->gl_pathv = pathv; + nspaces = new_nspaces; + } + filename = strdup(dat.cFileName); + if (!filename) + goto oom; + pglob->gl_pathv[pglob->gl_pathc++] = filename; + } while (FindNextFileA(hFind, &dat)); + err = GetLastError(); + CloseHandle(hFind); + if (err == ERROR_NO_MORE_FILES) { + errno = 0; + return 0; + } else { + /* Other possible error codes for FindNextFile() are + * undocumented */ + errno = EIO; + ret = GLOB_ABORTED; + goto fail_globfree; + } +oom: + CloseHandle(hFind); + errno = ENOMEM; + ret = GLOB_NOSPACE; +fail_globfree: + globfree(pglob); + return ret; +} + +void globfree(glob_t *pglob) +{ + size_t i; + for (i = 0; i < pglob->gl_pathc; i++) + free(pglob->gl_pathv[i]); + free(pglob->gl_pathv[i]); +} diff --git a/programs/imagex-win32.h b/programs/imagex-win32.h new file mode 100644 index 00000000..58441e83 --- /dev/null +++ b/programs/imagex-win32.h @@ -0,0 +1,27 @@ +#ifndef _IMAGEX_WIN32_H +#define _IMAGEX_WIN32_H + +#include + +typedef struct { + size_t gl_pathc; + char **gl_pathv; + size_t gl_offs; +} glob_t; + +/* WARNING: this is a reduced functionality replacement */ +extern int glob(const char *pattern, int flags, + int (*errfunc)(const char *epath, int eerrno), + glob_t *pglob); + +extern void globfree(glob_t *pglob); + +#define GLOB_ERR 0x1 /* Return on read errors. */ +#define GLOB_NOSORT 0x2 /* Don't sort the names. */ + +/* Error returns from `glob'. */ +#define GLOB_NOSPACE 1 /* Ran out of memory. */ +#define GLOB_ABORTED 2 /* Read error. */ +#define GLOB_NOMATCH 3 /* No matches found. */ + +#endif -- 2.43.0