| /* mkw32errmap.c - Generate mapping sources for Windows. |
| Copyright (C) 2010 g10 Code GmbH |
| |
| This file is part of libgpg-error. |
| |
| libgpg-error is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public License |
| as published by the Free Software Foundation; either version 2.1 of |
| the License, or (at your option) any later version. |
| |
| libgpg-error is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this program; if not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #ifdef RESOLVE_MACROS |
| # include <winerror.h> |
| #endif |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| static const char header_gpg_extra_errno_h[] = |
| "/* errno.h - WindowsCE errno.h substitute\n" |
| " Copyright (C) 2010 g10 Code GmbH\n" |
| "\n" |
| " This file is free software; as a special exception the author gives\n" |
| " unlimited permission to copy and/or distribute it, with or without\n" |
| " modifications, as long as this notice is preserved.\n" |
| "\n" |
| " This file is distributed in the hope that it will be useful, but\n" |
| " WITHOUT ANY WARRANTY, to the extent permitted by law; without even\n" |
| " the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n" |
| " PURPOSE.\n" |
| "\n" |
| " +++ Do not edit! File has been generated by mkw32errmap.c +++\n" |
| "\n" |
| " This file is intended to be used with ming32ce-gcc to implement an\n" |
| " errno substitute under WindowsCE. It must be included via gcc's\n" |
| " -idirafter option. The gpg-error-config script emits the\n" |
| " appropriate option snippet. The actual implementation of the errno\n" |
| " related functions are part of libgpg-error. A separate header file\n" |
| " is required because errno.h is often included before gpg-error.h.\n" |
| " */\n" |
| "\n" |
| "#ifndef _GPG_ERROR_EXTRA_ERRNO_H\n" |
| "#define _GPG_ERROR_EXTRA_ERRNO_H\n" |
| "\n" |
| "/* Due to peculiarities in W32 we can't implement ERRNO as an\n" |
| " writable lvalue. This also allows us to easily find places\n" |
| " where ERRNO is being written to. See also gpg_err_set_errno. */\n" |
| "int _gpg_w32ce_get_errno (void);\n" |
| "#define errno (_gpg_w32ce_get_errno ())\n" |
| "\n"; |
| static const char footer_gpg_extra_errno_h[] = |
| "\n" |
| "#endif /*_GPG_ERROR_EXTRA_ERRNO_H*/\n"; |
| |
| |
| /* The table below is used in two modes. First we run the host |
| preprocessor over it to generate a new include file. This include |
| file has the same content but the Windows error macros are |
| resolved. This is so that we don't need to include winerror.h into |
| the generated errno.h. The mkw32errmap_marker variable is only |
| here to have something to grep for after preprocessing. */ |
| static int mkw32errmap_marker; |
| struct table_s |
| { |
| int *dummy; |
| const char *name; |
| int w32code; |
| int w32code2; |
| }; |
| |
| struct table_s table[] = |
| { |
| #ifdef RESOLVE_MACROS |
| #define X(a,b,c) \ |
| {&mkw32errmap_marker, (a), (b), (c)} |
| X( "EPERM", ERROR_CANNOT_MAKE , 0 ), |
| X( "ENOENT", ERROR_FILE_NOT_FOUND , ERROR_PATH_NOT_FOUND ), |
| X( "EINTR", ERROR_INVALID_AT_INTERRUPT_TIME , 0 ), |
| X( "EIO", ERROR_IO_DEVICE , 0 ), |
| X( "ENXIO", ERROR_FILE_INVALID , 0 ), |
| X( "EBADF", ERROR_INVALID_HANDLE , 0 ), |
| X( "EAGAIN", ERROR_MORE_DATA , WSAEWOULDBLOCK ), |
| |
| X( "ENOMEM", ERROR_NOT_ENOUGH_MEMORY , 0 ), |
| X( "EACCES", ERROR_ACCESS_DENIED , 0 ), |
| X( "EFAULT", ERROR_PROCESS_ABORTED , 0 ), |
| X( "EBUSY", ERROR_BUSY , 0 ), |
| X( "EEXIST", ERROR_FILE_EXISTS , WSAEADDRINUSE ), |
| |
| X( "EXDEV", ERROR_NOT_SAME_DEVICE , 0 ), |
| X( "ENODEV", ERROR_BAD_DEVICE , ERROR_DEV_NOT_EXIST ), |
| |
| X( "ENOTDIR",ERROR_DIRECTORY , 0 ), |
| X( "EINVAL", ERROR_INVALID_PARAMETER , 0 ), |
| X( "ENFILE", ERROR_NO_MORE_FILES , 0 ), |
| X( "EMFILE", ERROR_TOO_MANY_OPEN_FILES , 0 ), |
| X( "ENOSPC", ERROR_DISK_FULL , 0 ), |
| X( "EROFS", ERROR_WRITE_PROTECT , 0 ), |
| X( "EPIPE", ERROR_BROKEN_PIPE , 0 ), |
| X( "ERANGE", ERROR_ARITHMETIC_OVERFLOW , 0 ), |
| X( "EDEADLOCK",ERROR_POSSIBLE_DEADLOCK , 0 ), |
| X( "ENAMETOOLONG", ERROR_FILENAME_EXCED_RANGE, 0 ), |
| X( "ENOLCK", ERROR_SHARING_BUFFER_EXCEEDED , 0 ), |
| X( "ENOSYS", ERROR_NOT_SUPPORTED , 0 ), |
| X( "ENOTEMPTY",ERROR_DIR_NOT_EMPTY , 0 ), |
| X( "ESPIPE", ERROR_SEEK_ON_DEVICE , 0 ), |
| #if 0 /* FIXME: Find appropriate mappings. */ |
| X( "EILSEQ", ), |
| X( "EDOM", ), |
| X( "EMLINK", ), |
| X( "ESRCH", ), /* No such process */ |
| X( "E2BIG", ), /* Arg list too long */ |
| X( "ENOEXEC", ), /* Exec format error */ |
| X( "ECHILD", ), /* No child processes */ |
| X( "EISDIR", ), /* Is a directory */ |
| X( "ENOTTY", ), /* Inappropriate I/O control operation */ |
| X( "EFBIG", ), /* File too large */ |
| #endif |
| #undef X |
| #else /*!RESOLVE_MACROS*/ |
| # include "mkw32errmap.tab.h" |
| #endif /*!RESOLVE_MACROS*/ |
| { NULL, 0 } |
| }; |
| |
| |
| |
| static int |
| compare_table (const void *a_v, const void *b_v) |
| { |
| const struct table_s *a = a_v; |
| const struct table_s *b = b_v; |
| |
| return (a->w32code - b->w32code); |
| } |
| |
| |
| int |
| main (int argc, char **argv) |
| { |
| int idx; |
| |
| for (idx=0; table[idx].name; idx++) |
| ; |
| qsort (table, idx, sizeof *table, compare_table); |
| |
| if (argc == 2 && !strcmp (argv[1], "--map")) |
| { |
| fputs ("static int\n" |
| "map_w32codes (int err)\n" |
| "{\n" |
| " switch (err)\n" |
| " {\n", stdout ); |
| for (idx=0; table[idx].name; idx++) |
| if (table[idx].w32code2) |
| printf (" case %d: return %d;\n", |
| table[idx].w32code2, table[idx].w32code); |
| fputs (" default: return err;\n" |
| " }\n" |
| "}\n", stdout); |
| } |
| else |
| { |
| fputs (header_gpg_extra_errno_h, stdout); |
| for (idx=0; table[idx].name; idx++) |
| printf ("#define %-12s %5d\n", table[idx].name, table[idx].w32code); |
| fputs (footer_gpg_extra_errno_h, stdout); |
| } |
| |
| return 0; |
| } |