]> granicus.if.org Git - zziplib/blob - zzip/err.c
patches from Mike Frysinger
[zziplib] / zzip / err.c
1 /*\r
2  * Author: \r
3  *      Guido Draheim <guidod@gmx.de>\r
4  *      Tomi Ollila <Tomi.Ollila@iki.fi>\r
5  *\r
6  *      Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim\r
7  *          All rights reserved,\r
8  *          use under the restrictions of the\r
9  *          Lesser GNU General Public License\r
10  *          or alternatively the restrictions \r
11  *          of the Mozilla Public License 1.1\r
12  */\r
13 \r
14 #include <zzip/lib.h>                                    /* exported... */\r
15 #include <zlib.h>\r
16 \r
17 #include <string.h>\r
18 #include <errno.h>\r
19 \r
20 #include <zzip/file.h>\r
21 \r
22 static struct errlistentry { int code; const char* mesg; } \r
23 errlist[] = \r
24 {\r
25     { ZZIP_NO_ERROR,        "No error" },\r
26     { ZZIP_OUTOFMEM,        \r
27       "could not get temporary memory for internal structures" },\r
28     { ZZIP_DIR_OPEN,        "Failed to open zip-file %s" },\r
29     { ZZIP_DIR_STAT,        "Failed to fstat zip-file %s" },\r
30     { ZZIP_DIR_SEEK,        "Failed to lseek zip-file %s" },\r
31     { ZZIP_DIR_READ,        "Failed to read zip-file %s"},  \r
32     { ZZIP_DIR_TOO_SHORT,   "zip-file %s too short" },\r
33     { ZZIP_DIR_EDH_MISSING, "zip-file central directory not found" },\r
34     { ZZIP_DIRSIZE,         "Directory size too big..." },\r
35     { ZZIP_ENOENT,          "No such file found in zip-file %s" },\r
36     { ZZIP_UNSUPP_COMPR,    "Unsupported compression format" },\r
37     { ZZIP_CORRUPTED,       "Zipfile corrupted" }, \r
38     { ZZIP_UNDEF,           "Some undefined error occurred" },\r
39     { ZZIP_DIR_LARGEFILE,   "Directory is largefile variant" },\r
40     { 0, 0 },\r
41 };\r
42 \r
43 #define errlistSIZE (sizeof(errlist)/sizeof(*errlist))\r
44 \r
45 /**\r
46  * returns the static string for the given error code. The\r
47  * error code can be either a normal system error (a\r
48  * positive error code will flag this), it can be => libz\r
49  * error code (a small negative error code will flag this)\r
50  * or it can be an error code from => libzzip, which is an\r
51  * negative value lower than => ZZIP_ERROR\r
52  */\r
53 zzip_char_t* \r
54 zzip_strerror(int errcode)\r
55 {\r
56   if (errcode < ZZIP_ERROR && errcode > ZZIP_ERROR-32)\r
57   {\r
58       struct errlistentry* err = errlist;\r
59       for (; err->mesg ; err++)\r
60       {\r
61           if (err->code == errcode) \r
62               return err->mesg; \r
63       }\r
64       errcode = EINVAL;\r
65   }\r
66 \r
67   if (errcode < 0)\r
68   {\r
69       if (errcode == -1)\r
70           return strerror(errcode);\r
71       else\r
72           return zError(errcode);\r
73   }\r
74   \r
75   return strerror (errcode);\r
76 }\r
77 \r
78 /** => zzip_strerror\r
79  * This function fetches the errorcode from the => DIR-handle and \r
80  * runs it through => zzip_strerror to obtain the static string\r
81  * describing the error.\r
82  */\r
83 zzip_char_t* \r
84 zzip_strerror_of(ZZIP_DIR* dir)\r
85 {\r
86     if (! dir) return strerror (errno);\r
87     return zzip_strerror(dir->errcode);\r
88 }\r
89 \r
90 static struct errnolistentry { int code; int e_no; } \r
91 errnolist[] =\r
92 {\r
93     { Z_STREAM_ERROR, EPIPE },\r
94     { Z_DATA_ERROR, ESPIPE },\r
95     { Z_MEM_ERROR, ENOMEM },\r
96     { Z_BUF_ERROR, EMFILE },\r
97     { Z_VERSION_ERROR, ENOEXEC },\r
98       \r
99     { ZZIP_DIR_OPEN, ENOTDIR },\r
100     { ZZIP_DIR_STAT, EREMOTE },\r
101     { ZZIP_DIR_SEEK, ESPIPE },\r
102 #  ifdef ESTRPIPE\r
103     { ZZIP_DIR_READ, ESTRPIPE},  \r
104 #  else\r
105     { ZZIP_DIR_READ, EPIPE},  \r
106 #  endif\r
107     { ZZIP_DIR_TOO_SHORT, ENOEXEC },\r
108 #  ifdef ENOMEDIUM\r
109     { ZZIP_DIR_EDH_MISSING, ENOMEDIUM },\r
110 #  else\r
111     { ZZIP_DIR_EDH_MISSING, EIO },\r
112 #  endif\r
113     { ZZIP_DIRSIZE, EFBIG },\r
114     { ZZIP_OUTOFMEM, ENOMEM },\r
115     { ZZIP_ENOENT, ENOENT },\r
116 #  ifdef EPFNOSUPPORT\r
117     { ZZIP_UNSUPP_COMPR, EPFNOSUPPORT },\r
118 #  else\r
119     { ZZIP_UNSUPP_COMPR, EACCES },\r
120 #  endif \r
121 # ifdef EILSEQ\r
122     { ZZIP_CORRUPTED, EILSEQ }, \r
123 # else\r
124     { ZZIP_CORRUPTED, ELOOP }, \r
125 # endif\r
126     { ZZIP_UNDEF, EINVAL },\r
127     { 0, 0 },\r
128 };    \r
129 \r
130 /**\r
131  * map the error code to a system error code. This is used\r
132  * for the drop-in replacement functions to return a value\r
133  * that can be interpreted correctly by code sections that\r
134  * are unaware of the fact they their => open(2) call had been\r
135  * diverted to a file inside a zip-archive.\r
136  */\r
137 int\r
138 zzip_errno(int errcode)\r
139 {\r
140     if (errcode >= -1) return errno;\r
141     \r
142     {   struct errnolistentry* err = errnolist;\r
143         for (; err->code ; err++)\r
144         {\r
145             if (err->code == errcode) \r
146                 return err->e_no; \r
147         }\r
148     }\r
149     return EINVAL;\r
150 }\r
151 \r
152 /* \r
153  * Local variables:\r
154  * c-file-style: "stroustrup"\r
155  * End:\r
156  */\r