1 /* This file is part of Netwib. Read and honor its license.
2 */
3 
4 /*-------------------------------------------------------------*/
netwib_priv_err_purge(void)5 netwib_err netwib_priv_err_purge(void)
6 {
7   netwib_er(netwib_priv_errmsg_reinit());
8 
9   errno = 0;
10 #if defined NETWIBDEF_SYSNAME_Unix
11  #if NETWIBDEF_HAVEVAR_HERRNO==1
12   h_errno = 0;
13  #endif
14 #elif defined NETWIBDEF_SYSNAME_Windows
15   WSASetLastError(0);
16   SetLastError(0);
17 #else
18 #error "Unknown value for NETWIBDEF_SYSNAME"
19 #endif
20 
21   return(NETWIB_ERR_OK);
22 }
23 
24 /*-------------------------------------------------------------*/
netwib_priv_err_text(netwib_err error,netwib_conststring * pc,netwib_conststring * pcfu)25 static netwib_err netwib_priv_err_text(netwib_err error,
26                                        netwib_conststring *pc,
27                                        netwib_conststring *pcfu)
28 {
29 
30   *pc = NULL;
31   *pcfu = NULL;
32 
33   switch(error) {
34 
35   /**/
36   case NETWIB_ERR_OK:
37     *pc = "ok";
38     break;
39 
40   /**/
41   case NETWIB_ERR_DATAEND:
42     *pc = "definitive end of data";
43     break;
44   case NETWIB_ERR_DATANOTAVAIL:
45     *pc = "there is no data available";
46     break;
47   case NETWIB_ERR_DATANOSPACE:
48     *pc = "no sufficient space to store data";
49     break;
50   case NETWIB_ERR_DATAOTHERTYPE:
51     *pc = "data is present but does not have the expected type";
52     break;
53   case NETWIB_ERR_DATAMISSING:
54     *pc = "more data is needed";
55     break;
56   case NETWIB_ERR_NOTFOUND:
57     *pc = "not found";
58     break;
59   case NETWIB_ERR_NOTCONVERTED:
60     *pc = "not converted";
61     break;
62   case NETWIB_ERR_ROUTELOCALDEV:
63     *pc = "the destination is a local device";
64     break;
65   case NETWIB_ERR_ROUTENOTFOUND:
66     *pc = "no route found to destination";
67     break;
68   case NETWIB_ERR_ROUTENOTETHER:
69     *pc = "Ethernet is not used to reach destination";
70     break;
71   case NETWIB_ERR_PLEASETRYNEXT:
72     *pc = "please, try next io";
73     break;
74   case NETWIB_ERR_PLEASECONSTRUCT:
75     *pc = "please, construct it";
76     break;
77   case NETWIB_ERR_PLEASELOOPTIME:
78     *pc = "please, loop to reach time";
79     break;
80 
81   /**/
82   case NETWIB_ERR_PAINVALIDTYPE:
83     *pc = "invalid type";
84     break;
85   case NETWIB_ERR_PAINVALIDPOS:
86     *pc = "invalid position";
87     break;
88   case NETWIB_ERR_PAINVALIDRANGE:
89     *pc = "invalid range";
90     break;
91   case NETWIB_ERR_PAINVALIDDEFAULT:
92     *pc = "invalid default value";
93     break;
94   case NETWIB_ERR_PANULLPTR:
95     *pc = "a NULL pointer is not allowed";
96     break;
97   case NETWIB_ERR_PANULLPTRSIZE:
98     *pc = "pointer is NULL, but size isn't zero";
99     break;
100   case NETWIB_ERR_PATOOLOW:
101     *pc = "parameter is too low";
102     break;
103   case NETWIB_ERR_PATOOHIGH:
104     *pc = "parameter is too high";
105     break;
106   case NETWIB_ERR_PAHEXACHAR:
107     *pc = "an hexa string must not contain a character different from A-Fa-f0-9";
108     break;
109   case NETWIB_ERR_PAHEXAODD:
110     *pc = "the byte number in the hexa string is odd";
111     break;
112   case NETWIB_ERR_PAMIXED:
113     *pc = "the mixed string doesn't finish by '";
114     break;
115   case NETWIB_ERR_PABASE64CHAR:
116     *pc = "all characters in a base64 must be in A-Za-z0-9+/=";
117     break;
118   case NETWIB_ERR_PABASE64X4:
119     *pc = "with base64, the byte number must be a multiple of 4";
120     break;
121   case NETWIB_ERR_PABASE64LO:
122     *pc = "base64 string is badly structured";
123     break;
124   case NETWIB_ERR_PAFMT:
125     *pc = "the format is incorrect";
126     break;
127   case NETWIB_ERR_PAINT:
128     *pc = "the string is not an integer";
129     break;
130   case NETWIB_ERR_PARINGFULL:
131     *pc = "the ring cannot have more than 0x7FFFFFFF elements";
132     break;
133   case NETWIB_ERR_PATLVINVALID:
134     *pc = "invalid TLV";
135     break;
136   case NETWIB_ERR_PATIMEDIFFNEG:
137     *pc = "time difference is negative";
138     break;
139   case NETWIB_ERR_PAPATHROOTDOTDOT:
140     *pc = "too many .. in the path : go up /";
141     break;
142   case NETWIB_ERR_PAPATHNOTCANON:
143     *pc = "the path could not be canonized";
144     break;
145   case NETWIB_ERR_PAPATHCANTINIT:
146     *pc = "it's not possible to init a path from the two given pathnames";
147     break;
148   case NETWIB_ERR_PAFILE2G:
149     *pc = "file size greater than 2Gbytes";
150     break;
151   case NETWIB_ERR_PAFILENOTREG:
152     *pc = "file is not regular";
153     break;
154   case NETWIB_ERR_PAINDEXNODATA:
155     *pc = "index does not point to data (index is just rewinded, or item was deleted)";
156     break;
157   case NETWIB_ERR_PATOOBIGFORHDR:
158     *pc = "a parameter is too big to go in the physical header";
159     break;
160   case NETWIB_ERR_PAIP4OPTSNOTX4:
161     *pc = "the ip options size is not a multiple of 4";
162     break;
163   case NETWIB_ERR_PAIP4OPTSMAX10:
164     *pc = "you cannot have more than 10 lines of ip options";
165     break;
166   case NETWIB_ERR_PAIP6EXTSNOTX4:
167     *pc = "the ip extensions size is not a multiple of 4";
168     break;
169   case NETWIB_ERR_PATCPOPTSNOTX4:
170     *pc = "the tcp options size is not a multiple of 4";
171     break;
172   case NETWIB_ERR_PATCPOPTSMAX10:
173     *pc = "you cannot have more than 10 lines of tcp options";
174     break;
175   case NETWIB_ERR_PAIPTYPE:
176     *pc = "bad IP type";
177     break;
178   case NETWIB_ERR_PAIPTYPENOT4:
179     *pc = "IP type is not IPv4";
180     break;
181   case NETWIB_ERR_PAIPTYPENOT6:
182     *pc = "IP type is not IPv6";
183     break;
184 
185   /**/
186   case NETWIB_ERR_LOINTERNALERROR:
187     *pc = "internal error : contact Laurent";
188     break;
189   case NETWIB_ERR_LONOTIMPLEMENTED:
190     *pc = "not implemented";
191     break;
192   case NETWIB_ERR_LONOTSUPPORTED:
193     *pc = "not supported";
194     break;
195   case NETWIB_ERR_LOERROROKKO:
196     *pc = "NETWIB_ERR_OK is returned by the function, but this should not happen";
197     break;
198   case NETWIB_ERR_LOOBJINITALREADYINIT:
199     *pc = "already initialized";
200     break;
201   case NETWIB_ERR_LOOBJUSENOTINITIALIZED:
202     *pc = "use of an object not initialized";
203     break;
204   case NETWIB_ERR_LOOBJUSECLOSED:
205     *pc = "use of a closed object";
206     break;
207   case NETWIB_ERR_LOOBJUSECORRUPT:
208     *pc = "use of a corrupted object";
209     break;
210   case NETWIB_ERR_LOOBJCLOSENOTINITIALIZED:
211     *pc = "closing an object not initialized";
212     break;
213   case NETWIB_ERR_LOOBJCLOSEALREADYCLOSED:
214     *pc = "already closed";
215     break;
216   case NETWIB_ERR_LOOBJCLOSECORRUPT:
217     *pc = "closing a corrupted object";
218     break;
219   case NETWIB_ERR_LOOBJREADNOTSUPPORTED:
220     *pc = "reading is not supported";
221     break;
222   case NETWIB_ERR_LOOBJREADNOTALLOWED:
223     *pc = "reading is not allowed";
224     break;
225   case NETWIB_ERR_LOOBJWRITENOTSUPPORTED:
226     *pc = "writing is not supported";
227     break;
228   case NETWIB_ERR_LOOBJWRITENOTALLOWED:
229     *pc = "writing is not allowed";
230     break;
231   case NETWIB_ERR_LOOBJRDWRCONFLICT:
232     *pc = "reading and writing return different values";
233     break;
234   case NETWIB_ERR_LOCANTEXEC:
235     *pc = "cannot execute";
236     break;
237   case NETWIB_ERR_LOUDPSERREADBEFWRITE:
238     *pc = "it is not possible to write before reading on a udp server";
239     break;
240 
241   /* functions */
242   case NETWIB_ERR_FUACCEPT: *pcfu = "accept"; break;
243   case NETWIB_ERR_FUBIND: *pcfu = "bind"; break;
244   case NETWIB_ERR_FUCHDIR: *pcfu = "chdir"; break;
245   case NETWIB_ERR_FUCHMOD: *pcfu = "chmod"; break;
246   case NETWIB_ERR_FUCHOWN: *pcfu = "chown"; break;
247   case NETWIB_ERR_FUCLOCKGETTIME: *pcfu = "chsize"; break;
248   case NETWIB_ERR_FUCLOSEDIR: *pcfu = "closedir"; break;
249   case NETWIB_ERR_FUCLOSEHANDLE: *pcfu = "CloseHandle"; break;
250   case NETWIB_ERR_FUCLOSE: *pcfu = "close"; break;
251   case NETWIB_ERR_FUCONNECT: *pcfu = "connect"; break;
252   case NETWIB_ERR_FUCREATEEVENT: *pcfu = "CreateEvent"; break;
253   case NETWIB_ERR_FUCREATEFILE: *pcfu = "CreateFile"; break;
254   case NETWIB_ERR_FUCREATEMUTEX: *pcfu = "CreateMutex"; break;
255   case NETWIB_ERR_FUCREATEPIPE: *pcfu = "CreatePipe"; break;
256   case NETWIB_ERR_FUCREATETHREAD: *pcfu = "CreateThread"; break;
257   case NETWIB_ERR_FUDUP2: *pcfu = "dup2"; break;
258   case NETWIB_ERR_FUDUPLICATEHANDLE: *pcfu = "DuplicateHandle"; break;
259   case NETWIB_ERR_FUEXECLE: *pcfu = "execle"; break;
260   case NETWIB_ERR_FUFCLOSE: *pcfu = "fclose"; break;
261   case NETWIB_ERR_FUFCNTL: *pcfu = "fcntl"; break;
262   case NETWIB_ERR_FUFFLUSH: *pcfu = "fflush"; break;
263   case NETWIB_ERR_FUFILENO: *pcfu = "fileno"; break;
264   case NETWIB_ERR_FUFINDCLOSE: *pcfu = "findclose"; break;
265   case NETWIB_ERR_FUFOPEN: *pcfu = "fopen"; break;
266   case NETWIB_ERR_FUFORK: *pcfu = "fork"; break;
267   case NETWIB_ERR_FUFREELIBRARY: *pcfu = "FreeLibrary"; break;
268   case NETWIB_ERR_FUFREAD: *pcfu = "fread"; break;
269   case NETWIB_ERR_FUFSYNC: *pcfu = "fsync"; break;
270   case NETWIB_ERR_FUFTRUNCATE: *pcfu = "ftruncate"; break;
271   case NETWIB_ERR_FUFWRITE: *pcfu = "fwrite"; break;
272   case NETWIB_ERR_FUGENERATECONSOLECTRLEVENT: *pcfu = "GenerateConsoleCtrlEvent"; break;
273   case NETWIB_ERR_FUGETCONSOLEMODE: *pcfu = "GetConsoleMode"; break;
274   case NETWIB_ERR_FUGETEXITCODEPROCESS: *pcfu = "GetExitCodeProcess"; break;
275   case NETWIB_ERR_FUGETEXITCODETHREAD: *pcfu = "GetExitCodeThread"; break;
276   case NETWIB_ERR_FUGETGRGIDR: *pcfu = "getgrgid_r"; break;
277   case NETWIB_ERR_FUGETGRNAMR: *pcfu = "getgrnam_r"; break;
278   case NETWIB_ERR_FUGETIFTABLE: *pcfu = "GetIfTable"; break;
279   case NETWIB_ERR_FUGETIPADDRTABLE: *pcfu = "GetIpAddrTable"; break;
280   case NETWIB_ERR_FUGETIPFORWARDTABLE: *pcfu = "GetIpForwardTable"; break;
281   case NETWIB_ERR_FUGETIPNETTABLE: *pcfu = "GetIpNetTable"; break;
282   case NETWIB_ERR_FUGETMSG: *pcfu = "getmsg"; break;
283   case NETWIB_ERR_FUGETPEERNAME: *pcfu = "getpeername"; break;
284   case NETWIB_ERR_FUGETPROCADDRESS: *pcfu = "GetProcAddress"; break;
285   case NETWIB_ERR_FUGETRLIMIT: *pcfu = "getrlimit"; break;
286   case NETWIB_ERR_FUGETPWNAMR: *pcfu = "getpwnam_r"; break;
287   case NETWIB_ERR_FUGETPWUID: *pcfu = "getpwuid"; break;
288   case NETWIB_ERR_FUGETSOCKNAME: *pcfu = "getsockname"; break;
289   case NETWIB_ERR_FUGETTIMEOFDAY: *pcfu = "gettimeofday"; break;
290   case NETWIB_ERR_FUGETUID: *pcfu = "getuid"; break;
291   case NETWIB_ERR_FUGLOBALALLOC: *pcfu = "GlobalAlloc"; break;
292   case NETWIB_ERR_FUGLOBALFREE: *pcfu = "GlobalFree"; break;
293   case NETWIB_ERR_FUIOCTL: *pcfu = "ioctl"; break;
294   case NETWIB_ERR_FUKILL: *pcfu = "kill"; break;
295   case NETWIB_ERR_FULIBNETINIT: *pcfu = "libnet_init"; break;
296   case NETWIB_ERR_FULIBNETCLOSELINKINT: *pcfu = "libnet_close_link_interface"; break;
297   case NETWIB_ERR_FULIBNETCLOSERAWSOCK: *pcfu = "libnet_close_raw_sock"; break;
298   case NETWIB_ERR_FULIBNETOPENRAWSOCK: *pcfu = "libnet_open_raw_sock"; break;
299   case NETWIB_ERR_FULIBNETWRITEIP: *pcfu = "libnet_write_ip"; break;
300   case NETWIB_ERR_FULIBNETWRITELINK: *pcfu = "libnet_write_link"; break;
301   case NETWIB_ERR_FULIBNETWRITELL: *pcfu = "libnet_write_link_layer"; break;
302   case NETWIB_ERR_FULIBNETWRITERAWIPV4: *pcfu = "libnet_write_raw_ipv4"; break;
303   case NETWIB_ERR_FULIBNETWRITERAWIPV6: *pcfu = "libnet_write_raw_ipv6"; break;
304   case NETWIB_ERR_FULISTEN: *pcfu = "listen"; break;
305   case NETWIB_ERR_FULOADLIBRARY: *pcfu = "LoadLibrary"; break;
306   case NETWIB_ERR_FULOCALTIMER: *pcfu = "localtime_r"; break;
307   case NETWIB_ERR_FULSEEK: *pcfu = "lseek"; break;
308   case NETWIB_ERR_FULSTAT: *pcfu = "lstat"; break;
309   case NETWIB_ERR_FUMALLOC: *pcfu = "malloc"; break;
310   case NETWIB_ERR_FUMKDIR: *pcfu = "mkdir"; break;
311   case NETWIB_ERR_FUMPROTECT: *pcfu = "mprotect"; break;
312   case NETWIB_ERR_FUNANOSLEEP: *pcfu = "nanosleep"; break;
313   case NETWIB_ERR_FUOPEN: *pcfu = "open"; break;
314   case NETWIB_ERR_FUOPENDIR: *pcfu = "opendir"; break;
315   case NETWIB_ERR_FUOPENPROCESS: *pcfu = "OpenProcess"; break;
316   case NETWIB_ERR_FUOPENPTY: *pcfu = "openpty"; break;
317   case NETWIB_ERR_FUPACKETALLOCATEPACKET: *pcfu = "PacketAllocatePacket"; break;
318   case NETWIB_ERR_FUPACKETGETNETTYPE: *pcfu = "PacketGetNetType"; break;
319   case NETWIB_ERR_FUPACKETOPENADAPTER: *pcfu = "PacketOpenAdapter"; break;
320   case NETWIB_ERR_FUPACKETREQUEST: *pcfu = "PacketRequest"; break;
321   case NETWIB_ERR_FUPACKETSENDPACKET: *pcfu = "PacketSendPacket"; break;
322   case NETWIB_ERR_FUPACKETSETBUFF: *pcfu = "PacketSetBuff"; break;
323   case NETWIB_ERR_FUPCAPCOMPILE: *pcfu = "pcap_compile"; break;
324   case NETWIB_ERR_FUPCAPDUMPOPEN: *pcfu = "pcap_dump_open"; break;
325   case NETWIB_ERR_FUPCAPFINDALLDEVS: *pcfu = "pcap_findalldevs"; break;
326   case NETWIB_ERR_FUPCAPGETEVENT: *pcfu = "pcap_getevent"; break;
327   case NETWIB_ERR_FUPCAPOPENDEAD: *pcfu = "pcap_open_dead"; break;
328   case NETWIB_ERR_FUPCAPOPENOFFLINE: *pcfu = "pcap_open_offline"; break;
329   case NETWIB_ERR_FUPCAPSETFILTER: *pcfu = "pcap_setfilter"; break;
330   case NETWIB_ERR_FUPEEKCONSOLEINPUT: *pcfu = "PeekConsoleInput"; break;
331   case NETWIB_ERR_FUPIPE: *pcfu = "pipe"; break;
332   case NETWIB_ERR_FUPOLL: *pcfu = "poll"; break;
333   case NETWIB_ERR_FUPTHREADATTRINIT: *pcfu = "pthread_attr_init"; break;
334   case NETWIB_ERR_FUPTHREADATTRDESTROY: *pcfu = "pthread_attr_destroy"; break;
335   case NETWIB_ERR_FUPTHREADATTRSETDETACHSTATE: *pcfu = "pthread_attr_setdetachstate"; break;
336   case NETWIB_ERR_FUPTHREADCONDINIT: *pcfu = "pthread_cond_init"; break;
337   case NETWIB_ERR_FUPTHREADCONDBROADCAST: *pcfu = "pthread_cond_broadcast"; break;
338   case NETWIB_ERR_FUPTHREADCONDDESTROY: *pcfu = "pthread_cond_destroy"; break;
339   case NETWIB_ERR_FUPTHREADCONDTIMEDWAIT: *pcfu = "pthread_cond_timedwait"; break;
340   case NETWIB_ERR_FUPTHREADCONDWAIT: *pcfu = "pthread_cond_wait"; break;
341   case NETWIB_ERR_FUPTHREADCREATE: *pcfu = "pthread_create"; break;
342   case NETWIB_ERR_FUPTHREADDELAYNP: *pcfu = "pthread_delay_np"; break;
343   case NETWIB_ERR_FUPTHREADGETEXPIRATIONNP: *pcfu = "pthread_get_expiration_np"; break;
344   case NETWIB_ERR_FUPTHREADGETSPECIFIC: *pcfu = "pthread_getspecific"; break;
345   case NETWIB_ERR_FUPTHREADJOIN: *pcfu = "pthread_join"; break;
346   case NETWIB_ERR_FUPTHREADKEYCREATE: *pcfu = "pthread_key_create"; break;
347   case NETWIB_ERR_FUPTHREADKEYDELETE: *pcfu = "pthread_key_delete"; break;
348   case NETWIB_ERR_FUPTHREADMUTEXINIT: *pcfu = "pthread_mutex_init"; break;
349   case NETWIB_ERR_FUPTHREADMUTEXDESTROY: *pcfu = "pthread_mutex_destroy"; break;
350   case NETWIB_ERR_FUPTHREADMUTEXLOCK: *pcfu = "pthread_mutex_lock"; break;
351   case NETWIB_ERR_FUPTHREADMUTEXTIMEDLOCK: *pcfu = "pthread_mutex_timedlock"; break;
352   case NETWIB_ERR_FUPTHREADMUTEXTRYLOCK: *pcfu = "pthread_mutex_trylock"; break;
353   case NETWIB_ERR_FUPTHREADMUTEXUNLOCK: *pcfu = "pthread_mutex_unlock"; break;
354   case NETWIB_ERR_FUPTHREADRWLOCKINIT: *pcfu = "pthread_rwlock_init"; break;
355   case NETWIB_ERR_FUPTHREADRWLOCKDESTROY: *pcfu = "pthread_rwlock_destroy"; break;
356   case NETWIB_ERR_FUPTHREADRWLOCKRDLOCK: *pcfu = "pthread_rwlock_rdlock"; break;
357   case NETWIB_ERR_FUPTHREADRWLOCKWRLOCK: *pcfu = "pthread_rwlock_wrlock"; break;
358   case NETWIB_ERR_FUPTHREADRWLOCKTIMEDRDLOCK: *pcfu = "pthread_rwlock_timedrdlock"; break;
359   case NETWIB_ERR_FUPTHREADRWLOCKTIMEDWRLOCK: *pcfu = "pthread_rwlock_timedwrlock"; break;
360   case NETWIB_ERR_FUPTHREADRWLOCKTRYRDLOCK: *pcfu = "pthread_rwlock_tryrdlock"; break;
361   case NETWIB_ERR_FUPTHREADRWLOCKTRYWRLOCK: *pcfu = "pthread_rwlock_trywrlock"; break;
362   case NETWIB_ERR_FUPTHREADRWLOCKUNLOCK: *pcfu = "pthread_rwlock_unlock"; break;
363   case NETWIB_ERR_FUPTHREADSETSPECIFIC: *pcfu = "pthread_setspecific"; break;
364   case NETWIB_ERR_FUPUTMSG: *pcfu = "putmsg"; break;
365   case NETWIB_ERR_FUREADDIRR: *pcfu = "readdir_r"; break;
366   case NETWIB_ERR_FUREADLINK: *pcfu = "readlink"; break;
367   case NETWIB_ERR_FUREAD: *pcfu = "read"; break;
368   case NETWIB_ERR_FUREALLOC: *pcfu = "realloc"; break;
369   case NETWIB_ERR_FURECV: *pcfu = "recv"; break;
370   case NETWIB_ERR_FURECVFROM: *pcfu = "recvfrom"; break;
371   case NETWIB_ERR_FUREGCLOSEKEY: *pcfu = "RegCloseEx"; break;
372   case NETWIB_ERR_FUREGCOMP: *pcfu = "regcomp"; break;
373   case NETWIB_ERR_FUREGENUMKEY: *pcfu = "RegEnumKey"; break;
374   case NETWIB_ERR_FUREGENUMVALUE: *pcfu = "RegEnumValue"; break;
375   case NETWIB_ERR_FUREGOPENKEYEX: *pcfu = "RegOpenKeyEx"; break;
376   case NETWIB_ERR_FUREGQUERYINFOKEY: *pcfu = "RegQueryInfoKey"; break;
377   case NETWIB_ERR_FUREGQUERYVALUEEX: *pcfu = "RegQueryValueEx"; break;
378   case NETWIB_ERR_FURELEASEMUTEX: *pcfu = "ReleaseMutex"; break;
379   case NETWIB_ERR_FURENAME: *pcfu = "rename"; break;
380   case NETWIB_ERR_FURESETEVENT: *pcfu = "ResetEvent"; break;
381   case NETWIB_ERR_FURMDIR: *pcfu = "rmdir"; break;
382   case NETWIB_ERR_FUSELECT: *pcfu = "select"; break;
383   case NETWIB_ERR_FUSEND: *pcfu = "send"; break;
384   case NETWIB_ERR_FUSENDTO: *pcfu = "sendto"; break;
385   case NETWIB_ERR_FUSETEVENT: *pcfu = "SetEvent"; break;
386   case NETWIB_ERR_FUSETGID: *pcfu = "setgid"; break;
387   case NETWIB_ERR_FUSETGROUPS: *pcfu = "setgroups"; break;
388   case NETWIB_ERR_FUSETSID: *pcfu = "setsid"; break;
389   case NETWIB_ERR_FUSETUID: *pcfu = "setuid"; break;
390   case NETWIB_ERR_FUSETSOCKOPT: *pcfu = "setsockopt"; break;
391   case NETWIB_ERR_FUSIGNAL: *pcfu = "signal"; break;
392   case NETWIB_ERR_FUSNMPEXTENSIONINIT: *pcfu = "SnmpExtensionInit"; break;
393   case NETWIB_ERR_FUSNMPEXTENSIONQUERY: *pcfu = "SnmpExtensionQuery"; break;
394   case NETWIB_ERR_FUSOCKET: *pcfu = "socket"; break;
395   case NETWIB_ERR_FUSYMLINK: *pcfu = "symlink"; break;
396   case NETWIB_ERR_FUSYSCTL: *pcfu = "sysctl"; break;
397   case NETWIB_ERR_FUTCGETATTR: *pcfu = "tcgetattr"; break;
398   case NETWIB_ERR_FUTCSETATTR: *pcfu = "tcsetattr"; break;
399   case NETWIB_ERR_FUTERMINATEPROCESS: *pcfu = "TerminateProcess"; break;
400   case NETWIB_ERR_FUTLSALLOC: *pcfu = "PeekNamedPipe"; break;
401   case NETWIB_ERR_FUTLSFREE: *pcfu = "TlsFree"; break;
402   case NETWIB_ERR_FUTLSSETVALUE: *pcfu = "TlsSetValue"; break;
403   case NETWIB_ERR_FUUNLINK: *pcfu = "unlink"; break;
404   case NETWIB_ERR_FUVIRTUALALLOC: *pcfu = "VirtualAlloc"; break;
405   case NETWIB_ERR_FUVIRTUALFREE: *pcfu = "VirtualFree"; break;
406   case NETWIB_ERR_FUVIRTUALPROTECT: *pcfu = "VirtualProtect"; break;
407   case NETWIB_ERR_FUWAITFORSINGLEOBJECT: *pcfu = "WaitForSingleObject"; break;
408   case NETWIB_ERR_FUWAITPID: *pcfu = "waitpid"; break;
409   case NETWIB_ERR_FUWRITEFILE: *pcfu = "WriteFile"; break;
410   case NETWIB_ERR_FUWRITE: *pcfu = "write"; break;
411   case NETWIB_ERR_FUWSACLEANUP: *pcfu = "WSACleanup"; break;
412   case NETWIB_ERR_FUWSASTARTUP: *pcfu = "WSAStartup"; break;
413   }
414 
415   return(NETWIB_ERR_OK);
416 }
417 
418 /*-------------------------------------------------------------*/
netwib_priv_err_append_herrno(netwib_uint32 varherrno,netwib_buf * pbuf)419 static netwib_err netwib_priv_err_append_herrno(netwib_uint32 varherrno,
420                                                 netwib_buf *pbuf)
421 {
422   netwib_er(netwib_buf_append_fmt(pbuf, " hint: h_errno = %{uint32}",
423                                   varherrno));
424 
425 #if defined NETWIBDEF_SYSNAME_Unix
426  #if NETWIBDEF_HAVEFUNC_HSTRERROR==1
427   netwib_er(netwib_buf_append_string(" = ", pbuf));
428   netwib_er(netwib_buf_append_string(hstrerror(varherrno), pbuf));
429  #endif
430 #elif defined NETWIBDEF_SYSNAME_Windows
431   /* there is no portable way to get Winsock error messages,
432      so we do it here */
433   {
434     netwib_conststring pc;
435     pc = NULL;
436     switch (varherrno) {
437       case WSAEINTR:
438         pc = "Interrupted system call";
439         break;
440       case WSAEBADF:
441         pc = "Bad file number";
442         break;
443       case WSAEACCES:
444         pc = "Permission denied";
445         break;
446       case WSAEFAULT:
447         pc = "Bad address";
448         break;
449       case WSAEINVAL:
450         pc = "Invalid argument";
451         break;
452       case WSAEMFILE:
453         pc = "Too many open sockets";
454         break;
455       case WSAEWOULDBLOCK:
456         pc = "Operation would block";
457         break;
458       case WSAEINPROGRESS:
459         pc = "Operation now in progress";
460         break;
461       case WSAEALREADY:
462         pc = "Operation already in progress";
463         break;
464       case WSAENOTSOCK:
465         pc = "Socket operation on non-socket";
466         break;
467       case WSAEDESTADDRREQ:
468         pc = "Destination address required";
469         break;
470       case WSAEMSGSIZE:
471         pc = "Message too long";
472         break;
473       case WSAEPROTOTYPE:
474         pc = "Protocol wrong type for socket";
475         break;
476       case WSAENOPROTOOPT:
477         pc = "Bad protocol option";
478         break;
479       case WSAEPROTONOSUPPORT:
480         pc = "Protocol not supported";
481         break;
482       case WSAESOCKTNOSUPPORT:
483         pc = "Socket type not supported";
484         break;
485       case WSAEOPNOTSUPP:
486         pc = "Operation not supported on socket";
487         break;
488       case WSAEPFNOSUPPORT:
489         pc = "Protocol family not supported";
490         break;
491       case WSAEAFNOSUPPORT:
492         pc = "Address family not supported";
493         break;
494       case WSAEADDRINUSE:
495         pc = "Address already in use";
496         break;
497       case WSAEADDRNOTAVAIL:
498         pc = "Can't assign requested address";
499         break;
500       case WSAENETDOWN:
501         pc = "Network is down";
502         break;
503       case WSAENETUNREACH:
504         pc = "Network is unreachable";
505         break;
506       case WSAENETRESET:
507         pc = "Net connection reset";
508         break;
509       case WSAECONNABORTED:
510         pc = "Software caused connection abort";
511         break;
512       case WSAECONNRESET:
513         pc = "Connection reset by peer";
514         break;
515       case WSAENOBUFS:
516         pc = "No buffer space available";
517         break;
518       case WSAEISCONN:
519         pc = "Socket is already connected";
520         break;
521       case WSAENOTCONN:
522         pc = "Socket is not connected";
523         break;
524       case WSAESHUTDOWN:
525         pc = "Can't send after socket shutdown";
526         break;
527       case WSAETOOMANYREFS:
528         pc = "Too many references, can't splice";
529         break;
530       case WSAETIMEDOUT:
531         pc = "Connection timed out";
532         break;
533       case WSAECONNREFUSED:
534         pc = "Connection refused";
535         break;
536       case WSAELOOP:
537         pc = "Too many levels of symbolic links";
538         break;
539       case WSAENAMETOOLONG:
540         pc = "File name too long";
541         break;
542       case WSAEHOSTDOWN:
543         pc = "Host is down";
544         break;
545       case WSAEHOSTUNREACH:
546         pc = "No route to host";
547         break;
548       case WSAENOTEMPTY:
549         pc = "Directory not empty";
550         break;
551       case WSAEPROCLIM:
552         pc = "Too many processes";
553         break;
554       case WSAEUSERS:
555         pc = "Too many users";
556         break;
557       case WSAEDQUOT:
558         pc = "Disc quota exceeded";
559         break;
560       case WSAESTALE:
561         pc = "Stale NFS file handle";
562         break;
563       case WSAEREMOTE:
564         pc = "Too many levels of remote in path";
565         break;
566       case WSASYSNOTREADY:
567         pc = "Network system is unavailable";
568         break;
569       case WSAVERNOTSUPPORTED:
570         pc = "Winsock DLL version out of range";
571         break;
572       case WSANOTINITIALISED:
573         pc = "WSAStartup not yet called";
574         break;
575       case WSAEDISCON:
576         pc = "Graceful shutdown in progress";
577         break;
578       case WSAHOST_NOT_FOUND:
579         pc = "Host not found";
580         break;
581       case WSATRY_AGAIN:
582         pc = "Non-Authoritative Host not found";
583         break;
584       case WSANO_RECOVERY:
585         pc = "Non-Recoverable errors: FORMERR, REFUSED, NOTIMP";
586         break;
587       case WSANO_DATA:
588         pc = "No host data of that type was found";
589         break;
590     }
591     if (pc != NULL) {
592       netwib_er(netwib_buf_append_string(" = ", pbuf));
593       netwib_er(netwib_buf_append_string(pc, pbuf));
594     }
595   }
596 #else
597 #error "Unknown value for NETWIBDEF_SYSNAME"
598 #endif
599 
600   netwib_er(netwib_buf_append_string("\n", pbuf));
601 
602   return(NETWIB_ERR_OK);
603 }
604 
605 /*-------------------------------------------------------------*/
netwib_priv_err_syserrors(netwib_uint32 * perrno,netwib_uint32 * pherrno,netwib_uint32 * pgetlasterror)606 netwib_err netwib_priv_err_syserrors(netwib_uint32 *perrno,
607                                      netwib_uint32 *pherrno,
608                                      netwib_uint32 *pgetlasterror)
609 {
610 
611   *perrno = errno;
612 #if NETWIBDEF_HAVEVAR_HERRNO==1
613   *pherrno = h_errno;
614 #else
615   *pherrno = 0;
616 #endif
617 #if defined NETWIBDEF_SYSNAME_Unix
618   *pgetlasterror = 0;
619 #elif defined NETWIBDEF_SYSNAME_Windows
620   *pgetlasterror = GetLastError();
621   /* we do not use WSAGetLastError, because it is equivalent to h_errno */
622 #else
623 #error "Unknown value for NETWIBDEF_SYSNAME"
624 #endif
625 
626   return(NETWIB_ERR_OK);
627 }
628 
629 /*-------------------------------------------------------------*/
netwib_priv_err_append_err2(netwib_buf * pbuf)630 static netwib_err netwib_priv_err_append_err2(netwib_buf *pbuf)
631 {
632   netwib_string pc;
633   netwib_priv_glovars_t *ptr = &netwib_priv_glovars;
634 
635   netwib_er(netwib_buf_ref_string(&(ptr->errmsg), &pc));
636   if (pc[0] != '\0') {
637     netwib_er(netwib_buf_append_string(" hint: ", pbuf));
638     netwib_er(netwib_buf_append_string(pc, pbuf));
639     netwib_er(netwib_buf_append_string("\n", pbuf));
640   }
641 
642   return(NETWIB_ERR_OK);
643 }
netwib_priv_err_append_err(netwib_err error,netwib_uint32 varerrno,netwib_uint32 varherrno,netwib_uint32 vargetlasterror,netwib_err_encodetype encodetype,netwib_buf * pbuf)644 netwib_err netwib_priv_err_append_err(netwib_err error,
645                                       netwib_uint32 varerrno,
646                                       netwib_uint32 varherrno,
647                                       netwib_uint32 vargetlasterror,
648                                       netwib_err_encodetype encodetype,
649                                       netwib_buf *pbuf)
650 {
651   netwib_conststring perrstr, perrstrfu;
652   netwib_bool canuseglo;
653   netwib_err ret;
654 
655   /* "Error xyz : " */
656   if (encodetype == NETWIB_ERR_ENCODETYPE_NUMTEXT ||
657       encodetype == NETWIB_ERR_ENCODETYPE_FULL) {
658     netwib_er(netwib_buf_append_fmt(pbuf, "Error %{uint32} : ", error));
659   }
660 
661   /* error string */
662   netwib_er(netwib_priv_err_text(error, &perrstr, &perrstrfu));
663   if (perrstr == NULL) {
664     if (perrstrfu == NULL) {
665       netwib_er(netwib_buf_append_string("unknown error", pbuf));
666     } else {
667       netwib_er(netwib_buf_append_string("error in ", pbuf));
668       netwib_er(netwib_buf_append_string(perrstrfu, pbuf));
669       netwib_er(netwib_buf_append_string("()", pbuf));
670     }
671   } else {
672     netwib_er(netwib_buf_append_string(perrstr, pbuf));
673   }
674 
675   if (encodetype != NETWIB_ERR_ENCODETYPE_FULL) {
676     /* stop here */
677     return(NETWIB_ERR_OK);
678   }
679   netwib_er(netwib_buf_append_string("\n", pbuf));
680 
681   /* errno */
682   if (varerrno) {
683     netwib_er(netwib_buf_append_fmt(pbuf, " hint: errno = %{uint32} = %s\n",
684                                     varerrno, strerror(varerrno)));
685   }
686 
687   /* GetLastError */
688 #if defined NETWIBDEF_SYSNAME_Unix
689   vargetlasterror = 0;
690 #elif defined NETWIBDEF_SYSNAME_Windows
691   if (vargetlasterror) {
692     LPVOID lpMsgBuf;
693     int bytenum;
694 
695     /* display error number */
696     netwib_er(netwib_buf_append_fmt(pbuf, " hint: GetLastError = %{uint32}",
697                                   vargetlasterror));
698     /* try to get error string */
699     bytenum = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
700                             FORMAT_MESSAGE_FROM_SYSTEM,
701                             NULL, vargetlasterror,
702                             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
703                             (LPTSTR) & lpMsgBuf, 0, NULL);
704     if (bytenum) {
705       netwib_er(netwib_buf_append_string(" = ", pbuf));
706       netwib_er(netwib_buf_append_string((char *)lpMsgBuf, pbuf));
707       /* use LocalFree, because it's not allocated in netwib */
708       LocalFree(lpMsgBuf);
709     } else {
710       netwib_er(netwib_buf_append_string("\n", pbuf));
711     }
712   }
713 #else
714 #error "Unknown value for NETWIBDEF_SYSNAME"
715 #endif
716 
717   /* h_errno */
718   if (varherrno) {
719     netwib_er(netwib_priv_err_append_herrno(varherrno, pbuf));
720   }
721 
722   /* global error message */
723   netwib_er(netwib_priv_glovars_canuse(&canuseglo));
724   if (canuseglo) {
725     netwib_er(netwib_priv_glovars_rdlock());
726     ret = netwib_priv_err_append_err2(pbuf);
727     netwib_er(netwib_priv_glovars_rdunlock());
728     if (ret != NETWIB_ERR_OK) {
729       return(ret);
730     }
731   }
732 
733   /* backtrace */
734 #if NETWIB_DEBUG_ERROR_BT==1
735   if (error != NETWIB_ERR_OK) {
736     netwib_string str;
737     netwib_er(netwib_debug_backtrace_string(&str));
738     netwib_er(netwib_buf_append_string(" backtrace: ", pbuf));
739     netwib_er(netwib_buf_append_string(str, pbuf));
740     netwib_er(netwib_buf_append_string("\n", pbuf));
741     netwib_er(netwib_debug_string_close(&str));
742   }
743 #endif
744 
745   /*get threadid */
746 #if NETWIB_DEBUG_ERROR_THREADID==1
747   {
748     netwib_uint32 threadid;
749 
750     netwib_er(netwib_debug_thread_id(&threadid));
751     netwib_er(netwib_buf_append_fmt(pbuf, " thread: %{uint32}\n", threadid));
752   }
753 #endif
754 
755   return(NETWIB_ERR_OK);
756 }
757