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: dk4socka09.ctr
12 */
13 
14 /**	@file dk4socka09.c The dk4socka09 module.
15 */
16 
17 
18 #include "dk4conf.h"
19 #include <libdk4sock/dk4sock.h>
20 #include <libdk4socka/dk4socka.h>
21 #include <libdk4base/dk4error.h>
22 #include <libdk4base/dk4mem.h>
23 
24 
25 
26 
27 
28 
29 
30 dk4_socket_set_t *
dk4socket_set_service_app(const dkChar * servicename,int backlog,int local,dk4_app_t * app)31 dk4socket_set_service_app(
32   const dkChar	*servicename,
33   int		 backlog,
34   int		 local,
35   dk4_app_t	*app
36 )
37 {
38   dkChar			 habuf[128];
39   dk4_sockaddr_storage_t	 sname;
40   dk4_er_t			 er;
41   const dkChar			*msgt[8];
42   const dkChar * const		*ltx	= NULL;
43   dk4_socket_set_t		*back	= NULL;
44   struct sockaddr		*so	= NULL;
45 #if VERSION_BEFORE_20150821
46   struct sockaddr_in		*in4	= NULL;
47 #endif
48 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
49 #if VERSION_BEFORE_20150821
50   struct sockaddr_in6		*in6	= NULL;
51 #endif
52 #endif
53   size_t			 i	= 0;	/* Traverse socket set */
54 #if DK4_HAVE_SOCKLEN_T
55   socklen_t			 slgt	= 0;
56 #else
57   int				 slgt	= 0;
58 #endif
59   int				 res	= 0;	/* Operation result */
60   int				 hat	= 0;	/* Have address text */
61 
62   if ((NULL != servicename) && (0 < backlog)) {
63     dk4error_init(&er);
64     back = dk4socket_set_service(servicename, backlog, local, &er);
65     if (NULL != back) {
66       if (0 != dk4app_log_do(app, DK4_LL_PROGRESS)) {
67 	ltx = dk4socket_log_texts(app);
68 	if (NULL != ltx) {
69           for (i = 0; i < back->szUsed; i++) {
70 	    hat = 0;
71 #if DK4_HAVE_SOCKLEN_T
72 	    slgt = (socklen_t)sizeof(sname);
73 #else
74 	    slgt = (int)sizeof(sname);
75 #endif
76 	    so = (struct sockaddr *)(&sname);
77 	    res = getsockname((back->pSockets)[i], so, &slgt);
78 	    if (0 == res) {
79 	      switch (so->sa_family) {
80 	        case AF_INET : {
81 	          if (sizeof(struct sockaddr_in) == slgt) {
82 #if VERSION_BEFORE_20150821
83 		    in4 = (struct sockaddr_in *)so;
84 #endif
85 		    res = dk4socket_addr_port_to_text(
86 		      habuf, DK4_SIZEOF(habuf,dkChar), AF_INET,
87 		      so, sizeof(struct sockaddr_in), NULL
88 		    );
89 		    if (DK4_SOCKET_RESULT_SUCCESS == res) {
90 		      hat = 1;
91 		    }
92 		  }
93 	        } break;
94 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
95 	        case AF_INET6 : {
96 	          if (sizeof(struct sockaddr_in6) == slgt) {
97 #if VERSION_BEFORE_20150821
98 		    in6 = (struct sockaddr_in6 *)so;
99 #endif
100 		    res = dk4socket_addr_port_to_text(
101 		      habuf, DK4_SIZEOF(habuf,dkChar), AF_INET6,
102 		      so, sizeof(struct sockaddr_in6), NULL
103 		    );
104 		    if (DK4_SOCKET_RESULT_SUCCESS == res) {
105 		      hat = 1;
106 		    }
107 		  }
108 	        } break;
109 #endif
110 	      }
111 	      if (0 != hat) {
112 	        msgt[0] = ltx[140];
113 		msgt[1] = habuf;
114 		msgt[2] = NULL;
115 		dk4app_log_msg(app, DK4_LL_PROGRESS, msgt, 2);
116 	      }
117 	    }
118 	  }
119 	}
120       }
121     } else {
122       dk4socket_log_simple_1(app, DK4_LL_ERROR, 139, &er);
123     }
124   }
125   return  back;
126 }
127 
128