1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5 
6 /*
7 	WARNING: This file was generated by the dkct program (see
8 	http://dktools.sourceforge.net/ for details).
9 	Changes you make here will be lost if dkct is run again!
10 	You should modify the original source and run dkct on it.
11 	Original source: dk4socka01.ctr
12 */
13 
14 /**	@file dk4socka01.c The dk4socka01 module.
15 */
16 
17 
18 
19 #include "dk4conf.h"
20 #include <libdk4sock/dk4sock.h>
21 #include <libdk4socka/dk4socka.h>
22 #include <libdk4base/dk4mem.h>
23 #include <libdk4maiodd/dk4maodd.h>
24 #include <libdk4maiodh/dk4maodh.h>
25 
26 #if DK4_HAVE_ERRNO_H
27 #ifndef ERRNO_H_INCLUDED
28 #include <errno.h>
29 #define	ERRNO_H_INCLUDED 1
30 #endif
31 #endif
32 
33 #if DK4_HAVE_STRING_H
34 #ifndef STRING_H_INCLUDED
35 #include <string.h>
36 #define	STRING_H_INCLUDED 1
37 #endif
38 #endif
39 
40 
41 
42 
43 
44 
45 /**	Constant text keywords, not localized.
46 */
47 static const dkChar * const	dk4socket_app_kwnl[] = {
48 /* 0 */
49 dkT("dk4sock.str"),
50 
51 /* 1 */
52 dkT("\n\t"),
53 
54 /* 2 */
55 dkT(": "),
56 
57 /* 3 */
58 dkT("WSAStartup"),
59 
60 /* 4 */
61 dkT("WSACleanup"),
62 
63 /* 5 */
64 dkT("socket"),
65 
66 /* 6 */
67 dkT("close"),
68 
69 /* 7 */
70 dkT("closesocket"),
71 
72 /* 8 */
73 dkT("bind"),
74 
75 /* 9 */
76 dkT("listen"),
77 
78 /* 10 */
79 dkT("accept"),
80 
81 /* 11 */
82 dkT("connect"),
83 
84 /* 12 */
85 dkT("setsockopt"),
86 
87 /* 13 */
88 dkT("ioctlsocket"),
89 
90 /* 14 */
91 dkT("fcntl"),
92 
93 /* 15 */
94 dkT("select"),
95 
96 /* 16 */
97 dkT("getsockopt"),
98 
99 /* 17 */
100 dkT("getaddrinfo"),
101 
102 /* 18 */
103 dkT("getnameinfo"),
104 
105 /* 19 */
106 dkT("gethostbyname"),
107 
108 /* 20 */
109 dkT("getservbyname"),
110 
111 /* 21 */
112 dkT("GetAddrInfoW"),
113 
114 /* 22 */
115 dkT("inet_ntop"),
116 
117 /* 23 */
118 dkT("shutdown"),
119 
120 /* 24 */
121 dkT("send/sendto"),
122 
123 /* 25 */
124 dkT("recv/recvfrom"),
125 
126 /* 26 */
127 dkT("inet_pton"),
128 
129 NULL
130 
131 };
132 
133 
134 
135 /**	Constant text keywords, replaced by localized version if found.
136 */
137 static const dkChar * const	dk4socket_app_kw_def[] = {
138 /* 0 */
139 dkT("Failed to initialize Winsock subsystem!"),
140 
141 /* 1 */
142 dkT("Failed to shut down Winsock subsystem!"),
143 
144 /* 2 */
145 dkT("Failed to create socket!"),
146 
147 /* 3 */
148 dkT("Failed to close socket!"),
149 
150 /* 4 */
151 dkT("Failed to bind local address!"),
152 
153 /* 5 */
154 dkT("Failed to listen for incoming connection requests!"),
155 
156 /* 6 */
157 dkT("Failed to accept incoming connection request!"),
158 
159 /* 7 */
160 dkT("Failed to connect to remote address!"),
161 
162 /* 8 */
163 dkT("Failed to modify ``reusable'' option for socket!"),
164 
165 /* 9 */
166 dkT("Failed to modify ``non-blocking'' option for socket!"),
167 
168 /* 10 */
169 dkT("Failed to retrieve remote address(es)!"),
170 
171 /* 11 */
172 dkT("Failed to retrieve local address(es)!"),
173 
174 /* 12 */
175 dkT("Failed to retrieve remote host address!"),
176 
177 /* 13 */
178 dkT("Failed to retrieve port number for remote service!"),
179 
180 /* 14 */
181 dkT("Failed to retrieve port number for local service!"),
182 
183 /* 15 */
184 dkT("Failed to convert text to ASCII!"),
185 
186 /* 16 */
187 dkT("\""),
188 
189 /* 17 */
190 dkT("\"!"),
191 
192 /* 18 */
193 dkT("Failed to obtain local address(es)!"),
194 
195 /* 19 */
196 dkT("Port/service: "),
197 
198 /* 20 */
199 dkT("Failed to obtain remote address(es)!"),
200 
201 /* 21 */
202 dkT("Host: "),
203 
204 /* 22 */
205 dkT("Port/service: "),
206 
207 /* 23 */
208 dkT("Service/port not found: \""),
209 
210 /* 24 */
211 dkT("\"!"),
212 
213 /* 25 */
214 dkT("Failed to convert service/port to ASCII: \""),
215 
216 /* 26 */
217 dkT("\"!"),
218 
219 /* 27 */
220 dkT("No matching pair of local/remote addresses found!"),
221 
222 /* 28 */
223 dkT("Illegal local port number!"),
224 
225 /* 29 */
226 dkT("Illegal remote port number!"),
227 
228 /* 30 */
229 dkT("Connection established."),
230 
231 /* 31 */
232 dkT("Illegal address length in gethostbyname() result!"),
233 
234 /* 32 */
235 dkT("Illegal address family in gethostbyname() result!"),
236 
237 /* 33 */
238 dkT("Remote host not found: \""),
239 
240 /* 34 */
241 dkT("\"!"),
242 
243 /* 35 */
244 dkT("Non-ASCII characters in host name: \n\t\""),
245 
246 /* 36 */
247 dkT("\"!"),
248 
249 /* 37 */
250 dkT("errno="),
251 
252 /* 38 */
253 dkT(" (0x"),
254 
255 /* 39 */
256 dkT(")"),
257 
258 /* 40 */
259 dkT("WSAGetLastError()="),
260 
261 /* 41 */
262 dkT("Failed to create TCP connection!"),
263 
264 /* 42 */
265 dkT("Local:  "),
266 
267 /* 43 */
268 dkT("Remote: "),
269 
270 /* 44 */
271 dkT("Timeout while attempting to connect."),
272 
273 /* 45 */
274 dkT("Invalid arguments passed to function, probably a bug."),
275 
276 /* 46 */
277 dkT("No matching local/remote address pair available!"),
278 
279 /* 47 */
280 dkT("Network subsystem not yet ready."),
281 
282 /* 48 */
283 dkT("Winsock version not supported!"),
284 
285 /* 49 */
286 dkT("Blocking Winsock operation in progress!"),
287 
288 /* 50 */
289 dkT("Process limit for Winsock reached!"),
290 
291 /* 51 */
292 dkT("Invalid parameters passed to function!"),
293 
294 /* 52 */
295 dkT("Winsock not initialized!"),
296 
297 /* 53 */
298 dkT("Network subsystem has failed!"),
299 
300 /* 54 */
301 dkT("Address family not supported!"),
302 
303 /* 55 */
304 dkT("No more socket/file descriptors available"),
305 
306 /* 56 */
307 dkT("No buffer space available!"),
308 
309 /* 57 */
310 dkT("Protocol not supported!"),
311 
312 /* 58 */
313 dkT("Wrong protocol type for socket!"),
314 
315 /* 59 */
316 dkT("Service provider failed to initialize!"),
317 
318 /* 60 */
319 dkT("Socket type not supported by address family!"),
320 
321 /* 61 */
322 dkT("Unusable service provider version!"),
323 
324 /* 62 */
325 dkT("Invalid/incomplete procedure table from service provider!"),
326 
327 /* 63 */
328 dkT("Insufficient permissions!"),
329 
330 /* 64 */
331 dkT("Address already in use!"),
332 
333 /* 65 */
334 dkT("Address not available!"),
335 
336 /* 66 */
337 dkT("File descriptor is not a socket!"),
338 
339 /* 67 */
340 dkT("Host has no addresses in specified address family!"),
341 
342 /* 68 */
343 dkT("Temporary problem on name server, try again later!"),
344 
345 /* 69 */
346 dkT("Illegal flag combination!"),
347 
348 /* 70 */
349 dkT("Name server failure!"),
350 
351 /* 71 */
352 dkT("Address family not supported!"),
353 
354 /* 72 */
355 dkT("Out of memory!"),
356 
357 /* 73 */
358 dkT("No network address found for host!"),
359 
360 /* 74 */
361 dkT("No such name or number!"),
362 
363 /* 75 */
364 dkT("Service not available through specified socket type!"),
365 
366 /* 76 */
367 dkT("Unsupported socket type or inconsistent arguments!"),
368 
369 /* 77 */
370 dkT("System error, check errno!"),
371 
372 /* 78 */
373 dkT("Argument buffer overflow!"),
374 
375 /* 79 */
376 dkT("Resource temporarily locked, try again later!"),
377 
378 /* 80 */
379 dkT("Attempt already in progress!"),
380 
381 /* 81 */
382 dkT("Not a file descriptor!"),
383 
384 /* 82 */
385 dkT("No-one listening on remote address!"),
386 
387 /* 83 */
388 dkT("Connection reset by peer!"),
389 
390 /* 84 */
391 dkT("Operation would result in deadlock!"),
392 
393 /* 85 */
394 dkT("Destination address required!"),
395 
396 /* 86 */
397 dkT("Timeout values too large!"),
398 
399 /* 87 */
400 dkT("Operation is in progress."),
401 
402 /* 88 */
403 dkT("Operation interrupted by signal!"),
404 
405 /* 89 */
406 dkT("Socket is already connected!"),
407 
408 /* 90 */
409 dkT("I/O error occured!"),
410 
411 /* 91 */
412 dkT("Symbolic link loop detected!"),
413 
414 /* 92 */
415 dkT("No more file descriptors available for process!"),
416 
417 /* 93 */
418 dkT("Address or path name too long!"),
419 
420 /* 94 */
421 dkT("Network unreachable!"),
422 
423 /* 95 */
424 dkT("No more file descriptors available on system!"),
425 
426 /* 96 */
427 dkT("File or path component does not exist or is empty!"),
428 
429 /* 97 */
430 dkT("Failed to set a lock!"),
431 
432 /* 98 */
433 dkT("Attempt to retrieve or modify unsupported option!"),
434 
435 /* 99 */
436 dkT("Path component is not a directory!"),
437 
438 /* 100 */
439 dkT("Provided buffer size is too small!"),
440 
441 /* 101 */
442 dkT("Operation not supported by socket type or protocol!"),
443 
444 /* 102 */
445 dkT("File system is mounted read-only!"),
446 
447 /* 103 */
448 dkT("Timed out!"),
449 
450 /* 104 */
451 dkT("Numeric overflow in file size/position calculation!"),
452 
453 /* 105 */
454 dkT("Connection closed due to timeout or other failure!"),
455 
456 /* 106 */
457 dkT("Host unreachable!"),
458 
459 /* 107 */
460 dkT("Blocking Winsock operation interrupted by WSACancelBlockingCall()!"),
461 
462 /* 108 */
463 dkT("Socket is in listening state!"),
464 
465 /* 109 */
466 dkT("No local address bound yet!"),
467 
468 /* 110 */
469 dkT("Socket is not in listening state!"),
470 
471 /* 111 */
472 dkT("Invalid shutdown parameter"),
473 
474 /* 112 */
475 dkT("Message size too large!"),
476 
477 /* 113 */
478 dkT("Connection closed, failures in keep-alive tests!"),
479 
480 /* 114 */
481 dkT("Not connected!"),
482 
483 /* 115 */
484 dkT("Failed to initialize socket provider!"),
485 
486 /* 116 */
487 dkT("Socket already shut down!"),
488 
489 /* 117 */
490 dkT("Operation would block!"),
491 
492 /* 118 */
493 dkT("Host not found (authorative answer)!"),
494 
495 /* 119 */
496 dkT("Service provider returned invalid/incomplete procedure table!"),
497 
498 /* 120 */
499 dkT("Invalid service provider version!"),
500 
501 /* 121 */
502 dkT("Protocol error!"),
503 
504 /* 122 */
505 dkT("Insufficient stream resources!"),
506 
507 /* 123 */
508 dkT("Protocol family not supported!"),
509 
510 /* 124 */
511 dkT("Connection to remote machine no longer active!"),
512 
513 /* 125 */
514 dkT("Server exited before completing connection!"),
515 
516 /* 126 */
517 dkT("Protocol family and type not found in network configuration!"),
518 
519 /* 127 */
520 dkT("Stale NFS file handle!"),
521 
522 /* 128 */
523 dkT("Failed to shut down socket!"),
524 
525 /* 129 */
526 dkT("Failed to bind local address\n\t\""),
527 
528 /* 130 */
529 dkT("\"!"),
530 
531 /* 131 */
532 dkT("Failed to connect to remote address\n\t\""),
533 
534 /* 132 */
535 dkT("\"!"),
536 
537 /* 133 */
538 dkT("Send operation completed partially, only "),
539 
540 /* 134 */
541 dkT(" of "),
542 
543 /* 135 */
544 dkT(" bytes!"),
545 
546 /* 136 */
547 dkT("Send operation completed partially!"),
548 
549 /* 137 */
550 dkT("Send operation failed!"),
551 
552 /* 138 */
553 dkT("Failed to receive data!"),
554 
555 /* 139 */
556 dkT("Failed to create listener sockets!"),
557 
558 /* 140 */
559 dkT("Listening: "),
560 
561 /* 141 */
562 dkT("Failed to obtain allowed peer from string:\n\t\""),
563 
564 /* 142 */
565 dkT("\"!"),
566 
567 NULL
568 
569 };
570 
571 
572 /**	Number of elements in the dk4socket_app_kw_def array.
573 */
574 static const size_t	dk4socket_sz_kw_def =
575 sizeof(dk4socket_app_kw_def)/sizeof(DK4_PCDKCHAR);
576 
577 
578 
579 size_t
dk4socket_log_num_texts(void)580 dk4socket_log_num_texts(void)
581 {
582   return (dk4socket_sz_kw_def);
583 }
584 
585 
586 
587 const dkChar * const	*
dk4socket_log_texts(dk4_app_t * app)588 dk4socket_log_texts(dk4_app_t *app)
589 {
590   const dkChar * const	*back	= dk4socket_app_kw_def;
591 
592   if (NULL != app) {
593     back = dk4app_string_table(app,dk4socket_app_kwnl[0],dk4socket_app_kw_def);
594   }
595   return back;
596 }
597 
598 
599 
600 void
dk4socket_log_fctname_msg(const dkChar ** fctname,const dkChar ** msgtext,dk4_app_t * app,dk4_er_t * erp)601 dk4socket_log_fctname_msg(
602   const dkChar	**fctname,
603   const dkChar	**msgtext,
604   dk4_app_t	 *app,
605   dk4_er_t	 *erp
606 )
607 {
608   const dkChar * const	*msgtexts = dk4socket_app_kw_def;
609   const dkChar		*mytext	  = NULL;
610   if ((NULL != app) && (NULL != erp)) {
611     msgtexts =
612     dk4app_string_table(app, dk4socket_app_kwnl[0], dk4socket_app_kw_def);
613     if (NULL != fctname) {
614       switch (erp->ec) {
615         case DK4_E_SOCKET_GETADDRINFO : {
616 #if DK4_CHAR_SIZE > 1
617 	  *fctname = dk4socket_app_kwnl[21];
618 #else
619 	  *fctname = dk4socket_app_kwnl[17];
620 #endif
621 	} break;
622 	case DK4_E_SOCKET_GETADDRLOC : {
623 #if DK4_CHAR_SIZE > 1
624 	  *fctname = dk4socket_app_kwnl[21];
625 #else
626 	  *fctname = dk4socket_app_kwnl[17];
627 #endif
628 	} break;
629 	case DK4_E_SOCKET_UP : {
630 	  *fctname = dk4socket_app_kwnl[3];
631 	} break;
632 	case DK4_E_SOCKET_DOWN : {
633 	  *fctname = dk4socket_app_kwnl[4];
634 	} break;
635 	case DK4_E_SOCKET_SOCKET : {
636 	  *fctname = dk4socket_app_kwnl[5];
637 	} break;
638 	case DK4_E_SOCKET_CLOSE : {
639 #if DK4_ON_WINDOWS
640 	  *fctname = dk4socket_app_kwnl[7];
641 #else
642 	  *fctname = dk4socket_app_kwnl[6];
643 #endif
644 	} break;
645 	case DK4_E_SOCKET_BIND : {
646 	  *fctname = dk4socket_app_kwnl[8];
647 	} break;
648 	case DK4_E_SOCKET_CONNECT : {
649 	  *fctname = dk4socket_app_kwnl[11];
650 	} break;
651 	case DK4_E_SOCKET_LISTEN : {
652 	  *fctname = dk4socket_app_kwnl[9];
653 	} break;
654 	case DK4_E_SOCKET_ACCEPT : {
655 	  *fctname = dk4socket_app_kwnl[10];
656 	} break;
657 	case DK4_E_SOCKET_SHUTDOWN : {
658 	  *fctname = dk4socket_app_kwnl[23];
659 	} break;
660 	case DK4_E_SOCKET_SEND : {
661 	  *fctname = dk4socket_app_kwnl[24];
662 	} break;
663 	case DK4_E_SOCKET_RECV : {
664 	  *fctname = dk4socket_app_kwnl[25];
665 	} break;
666 	case DK4_E_SOCKET_SELECT : {
667 	  *fctname = dk4socket_app_kwnl[15];
668 	} break;
669 	case DK4_E_SOCKET_SETSOCKOPT : {
670 	  *fctname = dk4socket_app_kwnl[12];
671 	} break;
672 	case DK4_E_SOCKET_GETSOCKOPT : {
673 	  *fctname = dk4socket_app_kwnl[16];
674 	} break;
675 	case DK4_E_SOCKET_IOCTLSOCKET : {
676 	  *fctname = dk4socket_app_kwnl[13];
677 	} break;
678 	case DK4_E_SOCKET_FCNTL : {
679 	  *fctname = dk4socket_app_kwnl[14];
680 	} break;
681 	case DK4_E_SOCKET_GETSERVBYNAME : {
682 	  *fctname = dk4socket_app_kwnl[20];
683 	} break;
684 	case DK4_E_SOCKET_GETHOSTBYNAME : {
685 	  *fctname = dk4socket_app_kwnl[19];
686 	} break;
687 	case DK4_E_SOCKET_INET_NTOP : {
688 	  *fctname = dk4socket_app_kwnl[22];
689 	} break;
690 	case DK4_E_SOCKET_INET_PTON : {
691 	  *fctname = dk4socket_app_kwnl[26];
692 	} break;
693 	default : {
694 	  *fctname = NULL;
695 	} break;
696       }
697     }
698     if (NULL != msgtext) {
699 #if (DK4_CHAR_SIZE == 1) && (!DK4_ON_WINDOWS)
700       switch (erp->ec) {
701         case DK4_E_SOCKET_GETADDRINFO :
702 	case DK4_E_SOCKET_GETADDRLOC :
703 	{
704 #if DK4_HAVE_GETADDRINFO
705 	  mytext = gai_strerror((erp->dt).iDetails1);
706 #endif
707 	} break;
708 	case DK4_E_SOCKET_UP :
709 	case DK4_E_SOCKET_DOWN :
710 	case DK4_E_SOCKET_SOCKET :
711 	case DK4_E_SOCKET_CLOSE :
712 	case DK4_E_SOCKET_BIND :
713 	case DK4_E_SOCKET_CONNECT :
714 	case DK4_E_SOCKET_LISTEN :
715 	case DK4_E_SOCKET_ACCEPT :
716 	case DK4_E_SOCKET_SHUTDOWN :
717 	case DK4_E_SOCKET_SEND :
718 	case DK4_E_SOCKET_RECV :
719 	case DK4_E_SOCKET_SELECT :
720 	case DK4_E_SOCKET_SETSOCKOPT :
721 	case DK4_E_SOCKET_GETSOCKOPT :
722 	case DK4_E_SOCKET_IOCTLSOCKET :
723 	case DK4_E_SOCKET_FCNTL :
724 	case DK4_E_SOCKET_INET_NTOP :
725 	case DK4_E_SOCKET_INET_PTON :
726 	{
727 	  mytext = strerror((erp->dt).iDetails1);
728 	} break;
729       }
730 #endif
731       if (NULL == mytext) {
732 
733         switch (erp->ec) {
734 #if DK4_ON_WINDOWS
735 	  /* +++++ Windows +++++ */
736           case DK4_E_SOCKET_GETADDRINFO :
737 	  case DK4_E_SOCKET_GETADDRLOC :
738 	  {
739 	    switch (erp->dt.iDetails1) {
740 	      case EAI_AGAIN : {
741 	        /* Temporary problem in name resolution */
742 		mytext = msgtexts[68];
743 	      } break;
744 	      case EAI_BADFLAGS : {
745 	        /* Incorrect flag combination */
746 		mytext = msgtexts[69];
747 	      } break;
748 	      case EAI_FAIL : {
749 	        /* Nonrecoverable failure in name resolution */
750 		mytext = msgtexts[70];
751 	      } break;
752 	      case EAI_FAMILY : {
753 	        /* Unsupported address family */
754 		mytext = msgtexts[71];
755 	      } break;
756 	      case EAI_MEMORY: {
757 	        /* Not enough memory available */
758 		mytext = msgtexts[72];
759 	      } break;
760 	      case EAI_NONAME : {
761 	        /* No address found for host */
762 		mytext = msgtexts[74];
763 	      } break;
764 	      case EAI_SERVICE : {
765 	        /* Service type not supported for specified socket type */
766 		mytext = msgtexts[75];
767 	      } break;
768 	      case EAI_SOCKTYPE : {
769 	        /* Socket type not supported */
770 		mytext = msgtexts[76];
771 	      } break;
772 	    }
773 	  } break;
774 	  case DK4_E_SOCKET_UP :
775 	  case DK4_E_SOCKET_DOWN :
776 	  case DK4_E_SOCKET_SOCKET :
777 	  case DK4_E_SOCKET_CLOSE :
778 	  case DK4_E_SOCKET_BIND :
779 	  case DK4_E_SOCKET_CONNECT :
780 	  case DK4_E_SOCKET_LISTEN :
781 	  case DK4_E_SOCKET_ACCEPT :
782 	  case DK4_E_SOCKET_SHUTDOWN :
783 	  case DK4_E_SOCKET_SEND :
784 	  case DK4_E_SOCKET_RECV :
785 	  case DK4_E_SOCKET_SELECT :
786 	  case DK4_E_SOCKET_SETSOCKOPT :
787 	  case DK4_E_SOCKET_GETSOCKOPT :
788 	  case DK4_E_SOCKET_IOCTLSOCKET :
789 	  case DK4_E_SOCKET_FCNTL :
790 	  case DK4_E_SOCKET_GETSERVBYNAME :
791 	  case DK4_E_SOCKET_GETHOSTBYNAME :
792 	  case DK4_E_SOCKET_INET_NTOP :
793 	  case DK4_E_SOCKET_INET_PTON :
794 	  {
795 	    switch (erp->dt.iDetails1) {
796 	      case ERROR_INVALID_PARAMETER : {
797 	        /* inet_ntop: Buffer not present or too small */
798 		mytext = msgtexts[100];
799 	      } break;
800 	      case WSAEACCES : {
801 	        /* bind: Insufficient permissions */
802 		/* connect, send, sendto */
803 	        mytext = msgtexts[63];
804 	      } break;
805 	      case WSAEADDRINUSE : {
806 	        /* bind: Address is already in use */
807 		/* connect, listen */
808 		mytext = msgtexts[64];
809 	      } break;
810 	      case WSAEADDRNOTAVAIL : {
811 	        /* bind: Address is not valid in context, not a local address*/
812 		/* connect: Invalid remote address */
813 		/* sendto */
814 		mytext = msgtexts[65];
815 	      } break;
816 	      case WSAEAFNOSUPPORT : {
817 	        /* socket: Addres family is not supported */
818 		/* connect, sendto, inet_ntop, inet_pton */
819 		mytext = msgtexts[54];
820 	      } break;
821 	      case WSAEALREADY : {
822 	        /* connect: Non-blocking connect already running for socket */
823 		mytext = msgtexts[80];
824 	      } break;
825 	      case WSAECONNABORTED : {
826 	        /* send: Timeout or other failure, close the socket */
827 		/* sendto, recv, shutdown */
828 		mytext = msgtexts[105];
829 	      } break;
830 	      case WSAECONNREFUSED : {
831 	        /* connect: Connect attempt forcefully rejected */
832 		mytext = msgtexts[82];
833 	      } break;
834 	      case WSAECONNRESET : {
835 	        /* accept: Connection request followed by termination request */
836 		/* send, sendto, recv, recvfrom, shutdown */
837 		mytext = msgtexts[83];
838 	      } break;
839 	      case WSAEDESTADDRREQ : {
840 	        /* sendto: Destination address required */
841 		mytext = msgtexts[85];
842 	      } break;
843 	      case WSAEFAULT : {
844 	        /* WSAStartup: Invalid data pointer */
845 		/* bind, connect, accept, select, ioctlsocket, gethostbyname */
846 		/* send, sendto, recv, recvfrom, inet_pton */
847 		mytext = msgtexts[51];
848 	      } break;
849 	      case WSAEHOSTUNREACH : {
850 	        /* connect: Host unreachable */
851 		/* send, sendto */
852 		mytext = msgtexts[106];
853 	      } break;
854 	      case WSAEINPROGRESS : {
855 	        /* WSAStartup: Blocking Winsock 1.1 operation in progress */
856 		/* WSACleanup, socket, bind, connect, listen, select */
857 		/* ioctlsocket, closesocket, gethostbyname, getservbyname */
858 		/* send, sendto, recv, recvfrom, shutdown */
859 		mytext = msgtexts[49];
860 	      } break;
861 	      case WSAEINTR : {
862 	        /* connect: Blocking call cancelled by WSACancelBlockingCall */
863 		/* accept, select, closesocket, gethostbyname, getservbyname */
864 		/* send, sendto, recv, recvfrom */
865 		mytext = msgtexts[107];
866 	      } break;
867 	      case WSAEINVAL : {
868 	        /* socket: Invalid argument supplied */
869 		/* bind, select, send, sendto, recv, recvfrom */
870 		/* connect: The socket is in listening state */
871 		/* listen: Socket not yet bound */
872 		/* accept: Not listening */
873 		/* shutdown: Invalid shutdown parameter */
874 		switch (erp->ec) {
875 		  case DK4_E_SOCKET_CONNECT : {
876 		    mytext = msgtexts[108];
877 		  } break;
878 		  case DK4_E_SOCKET_LISTEN : {
879 		    mytext = msgtexts[109];
880 		  } break;
881 		  case DK4_E_SOCKET_ACCEPT : {
882 		    mytext = msgtexts[110];
883 		  } break;
884 		  case DK4_E_SOCKET_SHUTDOWN : {
885 		    mytext = msgtexts[111];
886 		  } break;
887 		  default : {
888 		    mytext = msgtexts[51];
889 		  } break;
890 		}
891 	      } break;
892 	      case WSAEINVALIDPROCTABLE : {
893 	        /* socket: Service provider returned invalid procedure table */
894 		mytext = msgtexts[119];
895 	      } break;
896 	      case WSAEINVALIDPROVIDER : {
897 	        /* socket: Invalid provider version */
898 		mytext = msgtexts[120];
899 	      } break;
900 	      case WSAEISCONN : {
901 	        /* connect: Socket already connected */
902 		/* listen */
903 		/* recvfrom */
904 		mytext = msgtexts[89];
905 	      } break;
906 	      case WSAEMFILE : {
907 	        /* socket: No more file descriptors available */
908 		/* listen, accept */
909 		mytext = msgtexts[92];
910 	      } break;
911 	      case WSAEMSGSIZE : {
912 	        /* send: Message size too large */
913 		/* sendto, recv, recvfrom */
914 		mytext = msgtexts[112];
915 	      } break;
916 	      case WSAENETDOWN : {
917 	        /* WSACleanup: Network subsystem has failed */
918 		/* socket, bind, connect, listen, accept, select, ioctlsocket */
919 		/* closesocket, gethostbyname, getservbyname, send, sendto */
920 		/* recv, recvfrom, shutdown */
921 		mytext = msgtexts[53];
922 	      } break;
923 	      case WSAENETRESET : {
924 	        /* send: Connection closed while keep-alive tests */
925 		/* sendto, recv, recvfrom */
926 		mytext = msgtexts[113];
927 	      } break;
928 	      case WSAENETUNREACH : {
929 	        /* connect: Network unreachable */
930 		/* sendto */
931 		mytext = msgtexts[94];
932 	      } break;
933 	      case WSAENOBUFS : {
934 	        /* socket: No buffer space available */
935 		/* bind, connect, listen, accept, send, sendto */
936 		mytext = msgtexts[56];
937 	      } break;
938 	      case WSAENOTCONN : {
939 	        /* send: Not connected */
940 		/* recv, shutdown */
941 		mytext = msgtexts[114];
942 	      } break;
943 	      case WSAENOTSOCK : {
944 	        /* bind: file descriptor is not a socket */
945 		/* connect, listen, connect, select, ioctlsocket */
946 		/* closesocket, send, sendto, recv, recvfrom, shutdown */
947 		mytext = msgtexts[66];
948 	      } break;
949 	      case WSAEOPNOTSUPP : {
950 	        /* listen: Not supported by socket type */
951 		/* accept, send, sendto, recv, recvfrom */
952 		mytext = msgtexts[101];
953 	      } break;
954 	      case WSAEPROCLIM : {
955 	        /* WSAStartup: Limit of processes using Winsock is reached */
956 		mytext = msgtexts[50];
957 	      } break;
958 	      case WSAEPROTONOSUPPORT : {
959 	        /* socket: Unsupported protocol */
960 		mytext = msgtexts[57];
961 	      } break;
962 	      case WSAEPROTOTYPE : {
963 	        /* socket: Specified protocol invalid for socket */
964 		mytext = msgtexts[58];
965 	      } break;
966 	      case WSAEPROVIDERFAILEDINIT : {
967 	        /* socket: Failed to initialize socket provider */
968 		mytext = msgtexts[115];
969 	      } break;
970 	      case WSAESHUTDOWN : {
971 	        /* send: Socket was shut down */
972 		/* sendto, recv, recvfrom */
973 		mytext = msgtexts[116];
974 	      } break;
975 	      case WSAESOCKTNOSUPPORT : {
976 	        /* socket: Socket type not supported by address family */
977 		mytext = msgtexts[60];
978 	      } break;
979 	      case WSAETIMEDOUT : {
980 	        /* connect: Timeout */
981 		/* send, sendto, recv, recvfrom */
982 		mytext = msgtexts[103];
983 	      } break;
984 	      case WSAEWOULDBLOCK : {
985 	        /* connect: Connection not finished on non-blocking socket */
986 		/* accept: Non-blocking, not connection attempts are present */
987 		/* closesocket, send, sendto, recv, recvfrom */
988 		mytext = msgtexts[117];
989 	      } break;
990 	      case WSAHOST_NOT_FOUND : {
991 	        /* gethostbyname: Host not found (authorative answer) */
992 		/* getservbyname */
993 		mytext = msgtexts[118];
994 	      } break;
995 	      case WSANO_DATA : {
996 	        /* gethostbyname: Host name is valid, but no data found */
997 		/* getservbyname */
998 		mytext = msgtexts[73];
999 	      } break;
1000 	      case WSANO_RECOVERY : {
1001 	        /* gethostbyname: Unrecoverable error */
1002 		/* getservbyname */
1003 		mytext = msgtexts[70];
1004 	      } break;
1005 	      case WSANOTINITIALISED : {
1006 	        /* WSACleanup: Winsock not initialized */
1007 		/* socket, bind, connect, listen, accept, select, ioctlsocket */
1008 		/* closesocket, gethostbyname, getservbyname, send, sendto */
1009 		/* recv, recvfrom, shutdown */
1010 		mytext = msgtexts[52];
1011 	      } break;
1012 	      case WSASYSNOTREADY : {
1013 	        /* WSAStartup: Underlying subsystem not yet read */
1014 		mytext = msgtexts[47];
1015 	      } break;
1016 	      case WSATRY_AGAIN : {
1017 	        /* gethostbyname: Host not found (non-authorative, or server
1018 		failure */
1019 		/* getservbyname */
1020 		mytext = msgtexts[68];
1021 	      } break;
1022 	      case WSAVERNOTSUPPORTED : {
1023 	        /* WSAStartup: The requested version is not supported */
1024 		mytext = msgtexts[48];
1025 	      } break;
1026 	    }
1027 	  } break;
1028 	  /* ----- Windows ----- */
1029 #else
1030 	  /* +++++ non-Windows +++++ */
1031 
1032           case DK4_E_SOCKET_GETADDRINFO :
1033 	  case DK4_E_SOCKET_GETADDRLOC :
1034 	  {
1035 	    switch (erp->dt.iDetails1) {
1036 #ifdef EAI_ADDRFAMILY
1037 	      case EAI_ADDRFAMILY : {
1038 	        mytext = msgtexts[67];
1039 	      } break;
1040 #endif
1041 #ifdef EAI_AGAIN
1042 	      case EAI_AGAIN : {
1043 	        mytext = msgtexts[68];
1044 	      } break;
1045 #endif
1046 #ifdef EAI_BADFLAGS
1047 	      case EAI_BADFLAGS : {
1048 	        mytext = msgtexts[69];
1049 	      } break;
1050 #endif
1051 #ifdef EAI_FAIL
1052 	      case EAI_FAIL : {
1053 	        mytext = msgtexts[70];
1054 	      } break;
1055 #endif
1056 #ifdef EAI_FAMILY
1057 	      case EAI_FAMILY : {
1058 	        mytext = msgtexts[71];
1059 	      } break;
1060 #endif
1061 #ifdef EAI_MEMORY
1062 	      case EAI_MEMORY : {
1063 	        mytext = msgtexts[72];
1064 	      } break;
1065 #endif
1066 #ifdef EAI_NODATA
1067 	      case EAI_NODATA : {
1068 	        mytext = msgtexts[73];
1069 	      } break;
1070 #endif
1071 #ifdef EAI_NONAME
1072 	      case EAI_NONAME : {
1073 	        mytext = msgtexts[74];
1074 	      } break;
1075 #endif
1076 #ifdef EAI_OVERFLOW
1077 	      case EAI_OVERFLOW : {
1078 	        mytext = msgtexts[78];
1079 	      } break;
1080 #endif
1081 #ifdef EAI_SERVICE
1082 	      case EAI_SERVICE : {
1083 	        mytext = msgtexts[75];
1084 	      } break;
1085 #endif
1086 #ifdef EAI_SOCKTYPE
1087 	      case EAI_SOCKTYPE : {
1088 	        mytext = msgtexts[76];
1089 	      } break;
1090 #endif
1091 #ifdef EAI_SYSTEM
1092 	      case EAI_SYSTEM : {
1093 	        mytext = msgtexts[77];
1094 	      } break;
1095 #endif
1096 	    }
1097 	  } break;
1098 	  case DK4_E_SOCKET_GETHOSTBYNAME : {
1099 	    switch (erp->dt.iDetails1) {
1100 #ifdef HOST_NOT_FOUND
1101 	      case HOST_NOT_FOUND : {
1102 	        mytext = msgtexts[73];
1103 	      } break;
1104 #endif
1105 #ifdef NO_ADDRESS
1106 	      case NO_ADDRESS : {
1107 	        mytext = msgtexts[73];
1108 	      } break;
1109 #endif
1110 #if defined(NO_DATA) && ((!defined(NO_ADDRESS)) || (NO_DATA != NO_ADDRESS))
1111 	      case NO_DATA : {
1112 	        mytext = msgtexts[73];
1113 	      } break;
1114 #endif
1115 #ifdef NO_RECOVERY
1116 	      case NO_RECOVERY : {
1117 	        mytext = msgtexts[70];
1118 	      } break;
1119 #endif
1120 #ifdef TRY_AGAIN
1121 	      case TRY_AGAIN : {
1122 	        mytext = msgtexts[68];
1123 	      } break;
1124 #endif
1125 	    }
1126 	  } break;
1127 	  case DK4_E_SOCKET_UP :
1128 	  case DK4_E_SOCKET_DOWN :
1129 	  case DK4_E_SOCKET_SOCKET :
1130 	  case DK4_E_SOCKET_CLOSE :
1131 	  case DK4_E_SOCKET_BIND :
1132 	  case DK4_E_SOCKET_CONNECT :
1133 	  case DK4_E_SOCKET_LISTEN :
1134 	  case DK4_E_SOCKET_ACCEPT :
1135 	  case DK4_E_SOCKET_SELECT :
1136 	  case DK4_E_SOCKET_SETSOCKOPT :
1137 	  case DK4_E_SOCKET_GETSOCKOPT :
1138 	  case DK4_E_SOCKET_IOCTLSOCKET :
1139 	  case DK4_E_SOCKET_FCNTL :
1140 	  case DK4_E_SOCKET_INET_NTOP :
1141 	  case DK4_E_SOCKET_INET_PTON :
1142 	  {
1143 	    switch (erp->dt.iDetails1) {
1144 #ifdef EACCES
1145 	      case EACCES : {
1146 	        /* socket: Insufficient permissions */
1147 		/* bind, connect, listen, send */
1148 	        mytext = msgtexts[63];
1149 	      } break;
1150 #endif
1151 #ifdef EADDRINUSE
1152 	      case EADDRINUSE : {
1153 	        /* bind: Address already in used */
1154 		/* connect */
1155 		/* listen */
1156 	        mytext = msgtexts[64];
1157 	      } break;
1158 #endif
1159 #ifdef EADDRNOTAVAIL
1160 	      case EADDRNOTAVAIL : {
1161 	        /* bind: nonexistent interface or address is not local */
1162 		/* connect */
1163 	        mytext = msgtexts[65];
1164 	      } break;
1165 #endif
1166 #ifdef EAFNOSUPPORT
1167 	      case EAFNOSUPPORT : {
1168 	        /* socket: Address family not supported */
1169 		/* bind: Mismatch address and address family */
1170 		/* connect, sendto, inet_pton */
1171 	        mytext = msgtexts[54];
1172 	      } break;
1173 #endif
1174 #ifdef EAGAIN
1175 	      case EAGAIN : {
1176 	        /* accept: Socket non-blocking, no incoming requests */
1177 		/* send, recv */
1178 	        mytext = msgtexts[79];
1179 	      } break;
1180 #endif
1181 #ifdef EALREADY
1182 	      case EALREADY : {
1183 	        /* connect: Already connected */
1184 	        mytext = msgtexts[80];
1185 	      } break;
1186 #endif
1187 #ifdef EBADF
1188 	      case EBADF : {
1189 	        /* close: Not a file descriptr */
1190 		/* shutdown, bind, connect */
1191 		/* listen, accept, send, recv */
1192 	        mytext = msgtexts[81];
1193 	      } break;
1194 #endif
1195 #ifdef ECONNABORTED
1196 	      case ECONNABORTED : {
1197 	        /* accept: Connection attempt aborted */
1198 		mytext = msgtexts[105];
1199 	      } break;
1200 #endif
1201 #ifdef ECONNREFUSED
1202 	      case ECONNREFUSED : {
1203 	        /* connect: No-one listening on remote address */
1204 		/* recv */
1205 	        mytext = msgtexts[82];
1206 	      } break;
1207 #endif
1208 #ifdef ECONNRESET
1209 	      case ECONNRESET : {
1210 	        /* connect: Remote host denied connection */
1211 		/* send, recv */
1212 	        mytext = msgtexts[83];
1213 	      } break;
1214 #endif
1215 #ifdef EDEADLK
1216 	      case EDEADLK : {
1217 	        mytext = msgtexts[84];
1218 	      } break;
1219 #endif
1220 #ifdef EDESTADDRREQ
1221 	      case EDESTADDRREQ : {
1222 	        /* bind: Address is a NULL pointer */
1223 		/* listen: Socket not yet bound */
1224 		/* send */
1225 	        mytext = msgtexts[85];
1226 	      } break;
1227 #endif
1228 #ifdef EDOM
1229 	      case EDOM : {
1230 	        mytext = msgtexts[86];
1231 	      } break;
1232 #endif
1233 #ifdef EFAULT
1234 	      case EFAULT : {
1235 	        /* bind: Pointer to outside usable address space */
1236 		/* connect, accept, send, recv */
1237 	        mytext = msgtexts[51];
1238 	      } break;
1239 #endif
1240 #ifdef EHOSTUNREACH
1241 	      case EHOSTUNREACH : {
1242 	        /* connect: Remote host unreachable */
1243 		/* send */
1244 	        mytext = msgtexts[106];
1245 	      } break;
1246 #endif
1247 #ifdef EINPROGRESS
1248 	      case EINPROGRESS : {
1249 	        /* connect: Socket is non-blocking, operation would block */
1250 	        mytext = msgtexts[87];
1251 	      } break;
1252 #endif
1253 #ifdef EINTR
1254 	      case EINTR : {
1255 	        /* close: Interrupted by signal */
1256 		/* connect, accept, send, recv */
1257 	        mytext = msgtexts[88];
1258 	      } break;
1259 #endif
1260 #ifdef EINVAL
1261 	      case EINVAL : {
1262 	        /* socket: unknown protocol, illegal protocol family or flags */
1263 		/* shutdown: Invalid argument */
1264 		/* bind: Socket already bound */
1265 		/* bind: wrong address length */
1266 		/* bind: Socket already shut down */
1267 		/* connect: Wrong address length or address family */
1268 		/* listen: Socket already connected */
1269 		/* listen: Socket already shut down */
1270 		/* accept: Socket not listening, or illegal socket value */
1271 		/* accept: Invalid flags */
1272 		/* send: Invalid arguments , recv */
1273 	        mytext = msgtexts[51];
1274 	      } break;
1275 #endif
1276 #ifdef EISCONN
1277 	      case EISCONN : {
1278 	        /* bind: Socket already connected */
1279 		/* connect, send */
1280 	        mytext = msgtexts[89];
1281 	      } break;
1282 #endif
1283 #ifdef EISDIR
1284 	      case EISDIR : {
1285 	        /* bind: Address is a NULL pointer */
1286 	        mytext = msgtexts[85];
1287 	      } break;
1288 #endif
1289 #ifdef EIO
1290 	      case EIO : {
1291 	        /* close: I/O error */
1292 		/* connect, send */
1293 	        mytext = msgtexts[90];
1294 	      } break;
1295 #endif
1296 #ifdef ELOOP
1297 	      case ELOOP : {
1298 	        /* bind: Too many symbolic links or symlink loop */
1299 		/* connect, send */
1300 	        mytext = msgtexts[91];
1301 	      } break;
1302 #endif
1303 #ifdef EMFILE
1304 	      case EMFILE : {
1305 	        /* socket: Process file table overflow */
1306 		/* accept */
1307 	        mytext = msgtexts[92];
1308 	      } break;
1309 #endif
1310 #ifdef EMSGSIZE
1311 	      case EMSGSIZE : {
1312 	        /* send: Message size too large */
1313 		mytext = msgtexts[112];
1314 	      } break;
1315 #endif
1316 #ifdef ENAMETOOLONG
1317 	      case ENAMETOOLONG : {
1318 	        /* bind: Address is too long */
1319 		/* connect, send */
1320 	        mytext = msgtexts[93];
1321 	      } break;
1322 #endif
1323 #ifdef ENETDOWN
1324 	      case ENETDOWN : {
1325 	        /* connect: Local network interface is down */
1326 		/* send */
1327 	        mytext = msgtexts[53];
1328 	      } break;
1329 #endif
1330 #ifdef ENETUNREACH
1331 	      case ENETUNREACH : {
1332 	        /* connect: Network is unreachable */
1333 		/* send */
1334 	        mytext = msgtexts[94];
1335 	      } break;
1336 #endif
1337 #ifdef ENFILE
1338 	      case ENFILE : {
1339 	        /* socket: System file table overflow */
1340 		/* accept */
1341 	        mytext = msgtexts[95];
1342 	      } break;
1343 #endif
1344 #ifdef ENOBUFS
1345 	      case ENOBUFS : {
1346 	        /* socket: No memory for buffers */
1347 		/* shutdown: Insufficient resources */
1348 		/* connect, listen, accept, send */
1349 	        mytext = msgtexts[56];
1350 	      } break;
1351 #endif
1352 #ifdef ENODEV
1353 	      case ENODEV : {
1354 	        /* accept: Protocol family and type not in network config */
1355 	        mytext = msgtexts[126];
1356 	      } break;
1357 #endif
1358 #ifdef ENOENT
1359 	      case ENOENT : {
1360 	        /* bind: File does not exist */
1361 		/* connect, send */
1362 	        mytext = msgtexts[96];
1363 	      } break;
1364 #endif
1365 #ifdef ENOLCK
1366 	      case ENOLCK : {
1367 	        mytext = msgtexts[97];
1368 	      } break;
1369 #endif
1370 #ifdef ENOLINK
1371 	      case ENOLINK : {
1372 	        /* close: Connection to remote machine no longer active */
1373 	        mytext = msgtexts[124];
1374 	      } break;
1375 #endif
1376 #ifdef ENOMEM
1377 	      case ENOMEM : {
1378 	        /* socket: Not enough memory available */
1379 		/* bind, accept, send, recv */
1380 	        mytext = msgtexts[72];
1381 	      } break;
1382 #endif
1383 #ifdef ENOPROTOOPT
1384 	      case ENOPROTOOPT : {
1385 	        mytext = msgtexts[98];
1386 	      } break;
1387 #endif
1388 #ifdef ENOSR
1389 	      case ENOSR : {
1390 	        /* socket: Insufficient stream resources */
1391 		/* bind, connect, accept, send, recv, shutdown */
1392 	        mytext = msgtexts[122];
1393 	      } break;
1394 #endif
1395 #ifdef ENOTCONN
1396 	      case ENOTCONN : {
1397 	        /* shutdown: Not connected */
1398 		/* send, recv */
1399 		mytext = msgtexts[114];
1400 	      } break;
1401 #endif
1402 #ifdef ENOTDIR
1403 	      case ENOTDIR : {
1404 	        /* bind: Component or path prefix is not a directory */
1405 		/* connect, send */
1406 	        mytext = msgtexts[99];
1407 	      } break;
1408 #endif
1409 #ifdef ENOTSOCK
1410 	      case ENOTSOCK : {
1411 	        /* shutdown: Not a socket */
1412 		/* bind, connect, listen, accept, send, recv */
1413 	        mytext = msgtexts[66];
1414 	      } break;
1415 #endif
1416 #ifdef ENOSPC
1417 	      case ENOSPC : {
1418 	        /* inet_pton: Insufficient buffer size */
1419 		/* close: Not enough space on device */
1420 	        mytext = msgtexts[100];
1421 	      } break;
1422 #endif
1423 #ifdef ENXIO
1424 	      case ENXIO : {
1425 	        /* connect: Server exited before completing connection */
1426 	        mytext = msgtexts[125];
1427 	      } break;
1428 #endif
1429 #ifdef EOPNOTSUPP
1430 	      case EOPNOTSUPP : {
1431 	        /* bind: Operation not supported by socket type */
1432 		/* connect: Socket is listening */
1433 		/* listen: Socket can not listen */
1434 		/* accept: Not a stream socket */
1435 		/* send: Illegal flags, recv  */
1436 	        mytext = msgtexts[101];
1437 	      } break;
1438 #endif
1439 #ifdef EPERM
1440 	      case EPERM : {
1441 	        /* connect: Insufficient permissions */
1442 		/* accept: Firewall rules forbid connection */
1443 	        mytext = msgtexts[63];
1444 	      } break;
1445 #endif
1446 #ifdef EPFNOSUPPORT
1447 	      case EPFNOSUPPORT : {
1448 	        /* socket: Protocol family not supported */
1449 	        mytext = msgtexts[123];
1450 	      } break;
1451 #endif
1452 #ifdef EPIPE
1453 	      case EPIPE : {
1454 	        mytext = msgtexts[116];
1455 	      } break;
1456 #endif
1457 #ifdef EPROTONOSUPPORT
1458 	      case EPROTONOSUPPORT : {
1459 	        /* socket: Protocol type not supported in this domain */
1460 	        mytext = msgtexts[57];
1461 	      } break;
1462 #endif
1463 #ifdef EPROTO
1464 	      case EPROTO : {
1465 	        /* accept: Protocol error */
1466 		mytext = msgtexts[121];
1467 	      } break;
1468 #endif
1469 #ifdef EPROTOTYPE
1470 	      case EPROTOTYPE : {
1471 	        /* socket: Socket type not supported by protocol */
1472 		/* connect: Remote type is different address family as local */
1473 	        mytext = msgtexts[58];
1474 	      } break;
1475 #endif
1476 #ifdef EROFS
1477 	      case EROFS : {
1478 	        /* bind: File system is mounted read-only */
1479 	        mytext = msgtexts[102];
1480 	      } break;
1481 #endif
1482 #ifdef ESTALE
1483 	      case ESTALE : {
1484 	        /* recv: Stale NFS file handle */
1485 	        mytext = msgtexts[127];
1486 	      } break;
1487 #endif
1488 #ifdef ETIMEDOUT
1489 	      case ETIMEDOUT : {
1490 	        /* connect: Timed out */
1491 		/* recv */
1492 	        mytext = msgtexts[103];
1493 	      } break;
1494 #endif
1495 #ifdef EOVERFLOW
1496 	      case EOVERFLOW : {
1497 	        mytext = msgtexts[104];
1498 	      } break;
1499 #endif
1500 #if defined(EWOULDBLOCK) && ((!defined(EAGAIN)) || (EWOULDBLOCK != EAGAIN))
1501 	      case EWOULDBLOCK : {
1502 	        /* accept: Socket non-blocking, no incoming requests */
1503 		/* send, recv */
1504 		mytext = msgtexts[79];
1505 	      } break;
1506 #endif
1507 	    }
1508 	  } break;
1509 	  /* ----- non-Windows ----- */
1510 #endif
1511 	}
1512       }
1513       *msgtext = mytext;
1514     }
1515   }
1516 }
1517 
1518 
1519 
1520 void
dk4socket_log_simple_1(dk4_app_t * app,int ll,size_t imain,dk4_er_t * erp)1521 dk4socket_log_simple_1(
1522   dk4_app_t	*app,
1523   int		 ll,
1524   size_t	 imain,
1525   dk4_er_t	*erp
1526 )
1527 {
1528   dkChar		 b1[16*sizeof(dk4_um_t)];	/* decimal */
1529   dkChar		 b2[16*sizeof(dk4_um_t)];	/* hexadecimal */
1530   const dkChar		*fctn	= NULL;	/* Function name */
1531   const dkChar		*errt	= NULL;	/* Error text */
1532   const dkChar		*msgt[16];	/* Message components */
1533   const dkChar * const	*msga;		/* Localized texts array */
1534   size_t		 used	= 0;	/* Number of used components */
1535   int			 res	= 0;	/* Conversion result */
1536 
1537   if (0 != dk4app_log_do(app, ll)) {
1538     msga = dk4app_string_table(app,dk4socket_app_kwnl[0],dk4socket_app_kw_def);
1539     if (dk4socket_sz_kw_def > imain) {
1540       msgt[used++] = msga[imain];
1541       dk4socket_log_fctname_msg(&fctn, &errt, app, erp);
1542       if (NULL != fctn) {
1543         if (NULL != errt) {
1544 	  msgt[used++] = dk4socket_app_kwnl[1];
1545 	  msgt[used++] = fctn;
1546 	  msgt[used++] = dk4socket_app_kwnl[2];
1547 	  msgt[used++] = errt;
1548 	} else {
1549 	  res = dk4ma_write_decimal_signed(
1550 	    b1, DK4_SIZEOF(b1,dkChar), (dk4_um_t)(erp->dt.iDetails1), 0, NULL
1551 	  );
1552 	  if (0 != res) {
1553 	    res = dk4ma_write_hex_signed(
1554 	      b2, DK4_SIZEOF(b2,dkChar), (dk4_im_t)(erp->dt.iDetails1), 8, NULL
1555 	    );
1556 	    if (0 != res) {
1557 	      msgt[used++] = dk4socket_app_kwnl[1];
1558 	      msgt[used++] = fctn;
1559 	      msgt[used++] = dk4socket_app_kwnl[2];
1560 #if DK4_ON_WINDOWS
1561 	      msgt[used++] = msga[40];
1562 #else
1563 	      msgt[used++] = msga[37];
1564 #endif
1565 	      msgt[used++] = b1;
1566 	      msgt[used++] = msga[38];
1567 	      msgt[used++] = b2;
1568 	      msgt[used++] = msga[39];
1569 	    }
1570 	  }
1571 	}
1572       } else {
1573         if (NULL != errt) {
1574 	  msgt[used++] = dk4socket_app_kwnl[1];
1575 	  msgt[used++] = errt;
1576 	} else {
1577 	}
1578       }
1579       dk4app_log_msg(app, ll, msgt, used);
1580     }
1581   }
1582 }
1583 
1584 
1585 
1586 void
dk4socket_log_simple_3(dk4_app_t * app,int ll,size_t i1,size_t i2,const dkChar * ctext,dk4_er_t * erp)1587 dk4socket_log_simple_3(
1588   dk4_app_t	*app,
1589   int		 ll,
1590   size_t	 i1,
1591   size_t	 i2,
1592   const	dkChar	*ctext,
1593   dk4_er_t	*erp
1594 )
1595 {
1596   dkChar		 b1[16*sizeof(dk4_um_t)];	/* decimal */
1597   dkChar		 b2[16*sizeof(dk4_um_t)];	/* hexadecimal */
1598   const dkChar		*fctn	= NULL;	/* Function name */
1599   const dkChar		*errt	= NULL;	/* Error text */
1600   const dkChar		*msgt[16];	/* Message components */
1601   const dkChar * const	*msga;		/* Localized texts array */
1602   size_t		 used	= 0;	/* Number of used components */
1603   int			 res	= 0;	/* Conversion result */
1604 
1605   if (0 != dk4app_log_do(app, ll)) {
1606     msga = dk4app_string_table(app,dk4socket_app_kwnl[0],dk4socket_app_kw_def);
1607     if ((dk4socket_sz_kw_def > i1) && (dk4socket_sz_kw_def > i2)) {
1608       msgt[used++] = msga[i1];
1609       if (NULL != ctext) { msgt[used++] = ctext; }
1610       msgt[used++] = msga[i2];
1611       dk4socket_log_fctname_msg(&fctn, &errt, app, erp);
1612       if (NULL != fctn) {
1613         if (NULL != errt) {
1614 	  msgt[used++] = dk4socket_app_kwnl[1];
1615 	  msgt[used++] = fctn;
1616 	  msgt[used++] = dk4socket_app_kwnl[2];
1617 	  msgt[used++] = errt;
1618 	} else {
1619 	  res = dk4ma_write_decimal_signed(
1620 	    b1, DK4_SIZEOF(b1,dkChar), (dk4_um_t)(erp->dt.iDetails1), 0, NULL
1621 	  );
1622 	  if (0 != res) {
1623 	    res = dk4ma_write_hex_signed(
1624 	      b2, DK4_SIZEOF(b2,dkChar), (dk4_im_t)(erp->dt.iDetails1), 8, NULL
1625 	    );
1626 	    if (0 != res) {
1627 	      msgt[used++] = dk4socket_app_kwnl[1];
1628 	      msgt[used++] = fctn;
1629 	      msgt[used++] = dk4socket_app_kwnl[2];
1630 #if DK4_ON_WINDOWS
1631 	      msgt[used++] = msga[40];
1632 #else
1633 	      msgt[used++] = msga[37];
1634 #endif
1635 	      msgt[used++] = b1;
1636 	      msgt[used++] = msga[38];
1637 	      msgt[used++] = b2;
1638 	      msgt[used++] = msga[39];
1639 	    }
1640 	  }
1641 	}
1642       } else {
1643         if (NULL != errt) {
1644 	  msgt[used++] = dk4socket_app_kwnl[1];
1645 	  msgt[used++] = errt;
1646 	} else {
1647 	}
1648       }
1649       dk4app_log_msg(app, ll, msgt, used);
1650     }
1651   }
1652 }
1653 
1654 
1655 
1656 void
dk4socket_log_simple_5(dk4_app_t * app,int ll,size_t i1,size_t i2,size_t i3,const dkChar * ct1,const dkChar * ct2,dk4_er_t * erp)1657 dk4socket_log_simple_5(
1658   dk4_app_t	*app,
1659   int		 ll,
1660   size_t	 i1,
1661   size_t	 i2,
1662   size_t	 i3,
1663   const	dkChar	*ct1,
1664   const	dkChar	*ct2,
1665   dk4_er_t	*erp
1666 )
1667 {
1668   dkChar		 b1[16*sizeof(dk4_um_t)];	/* decimal */
1669   dkChar		 b2[16*sizeof(dk4_um_t)];	/* hexadecimal */
1670   const dkChar		*fctn	= NULL;	/* Function name */
1671   const dkChar		*errt	= NULL;	/* Error text */
1672   const dkChar		*msgt[16];	/* Message components */
1673   const dkChar * const	*msga;		/* Localized texts array */
1674   size_t		 used	= 0;	/* Number of used components */
1675   int			 res	= 0;	/* Conversion result */
1676 
1677   if (0 != dk4app_log_do(app, ll)) {
1678     msga = dk4app_string_table(app,dk4socket_app_kwnl[0],dk4socket_app_kw_def);
1679     if ((dk4socket_sz_kw_def > i1) && (dk4socket_sz_kw_def > i2)) {
1680       msgt[used++] = msga[i1];
1681       if (NULL != ct1) { msgt[used++] = ct1; }
1682       msgt[used++] = msga[i2];
1683       if (NULL != ct2) { msgt[used++] = ct2; }
1684       msgt[used++] = msga[i3];
1685       dk4socket_log_fctname_msg(&fctn, &errt, app, erp);
1686       if (NULL != fctn) {
1687         if (NULL != errt) {
1688 	  msgt[used++] = dk4socket_app_kwnl[1];
1689 	  msgt[used++] = fctn;
1690 	  msgt[used++] = dk4socket_app_kwnl[2];
1691 	  msgt[used++] = errt;
1692 	} else {
1693 	  res = dk4ma_write_decimal_signed(
1694 	    b1, DK4_SIZEOF(b1,dkChar), (dk4_um_t)(erp->dt.iDetails1), 0, NULL
1695 	  );
1696 	  if (0 != res) {
1697 	    res = dk4ma_write_hex_signed(
1698 	      b2, DK4_SIZEOF(b2,dkChar), (dk4_im_t)(erp->dt.iDetails1), 8, NULL
1699 	    );
1700 	    if (0 != res) {
1701 	      msgt[used++] = dk4socket_app_kwnl[1];
1702 	      msgt[used++] = fctn;
1703 	      msgt[used++] = dk4socket_app_kwnl[2];
1704 #if DK4_ON_WINDOWS
1705 	      msgt[used++] = msga[40];
1706 #else
1707 	      msgt[used++] = msga[37];
1708 #endif
1709 	      msgt[used++] = b1;
1710 	      msgt[used++] = msga[38];
1711 	      msgt[used++] = b2;
1712 	      msgt[used++] = msga[39];
1713 	    }
1714 	  }
1715 	}
1716       } else {
1717         if (NULL != errt) {
1718 	  msgt[used++] = dk4socket_app_kwnl[1];
1719 	  msgt[used++] = errt;
1720 	} else {
1721 	}
1722       }
1723       dk4app_log_msg(app, ll, msgt, used);
1724     }
1725   }
1726 }
1727 
1728