/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4sock26.ctr */ /** @file dk4sock26.c The dk4sock26 module. */ #line 8 "dk4sock26.ctr" #include "dk4conf.h" #include "dk4types.h" #include "dk4error.h" #include "dk4mem.h" #include "dk4sock.h" #include "dk4str8.h" #include "dk4mai8dsz.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 28 "dk4sock26.ctr" #if TRACE_DEBUG static void dk4socket_c8_debug_allowed_peer(dk4_allowed_peer_t *peerptr) { FILE *fipo; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 unsigned char *ucptr; size_t i; size_t pass; #endif unsigned long ul1, ul2; fipo = dktrace_file(); if (NULL != fipo) { switch (peerptr->af) { case AF_INET : { ul1 = (peerptr->data).ipv4.ad.s_addr; ul2 = (peerptr->data).ipv4.ma.s_addr; ul1 = dk4socket_ntohl(ul1); ul2 = dk4socket_ntohl(ul2); fprintf( fipo, "Address/Mask: %lu.%lu.%lu.%lu/%lu.%lu.%lu.%lu\n", ((ul1 >> 24) & 0x000000FFUL), ((ul1 >> 16) & 0x000000FFUL), ((ul1 >> 8) & 0x000000FFUL), ((ul1 ) & 0x000000FFUL), ((ul2 >> 24) & 0x000000FFUL), ((ul2 >> 16) & 0x000000FFUL), ((ul2 >> 8) & 0x000000FFUL), ((ul2 ) & 0x000000FFUL) ); } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { fputs("Address/Mask: ", fipo); for (pass = 0; pass < 2; pass++) { if (0 != pass) { fputc('/', fipo); ucptr = &((peerptr->data).ipv6.ma.s6_addr[0]); } else { ucptr = &((peerptr->data).ipv6.ad.s6_addr[0]); } for (i = 0; i < 16; i++) { if ((0 != i) && (0 == (i % 2))) { fputc(':', fipo); } fprintf(fipo, "%02x", *(ucptr++)); } } fputc('\n', fipo); } break; #endif } } } #endif int dk4socket_c8_get_allowed_peer( dk4_allowed_peer_t *peerptr, const char *str, dk4_er_t *erp ) { char mycp[128]; IN_ADDR in4; IN_ADDR ma4; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 IN6_ADDR in6; IN6_ADDR ma6; #endif char *maptr; const char *endptr = NULL; size_t bitno = 0; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 size_t i = 0; #endif unsigned long nm4 = 0UL; int back = DK4_SOCKET_RESULT_FAILED; int af = AF_UNSPEC; int res = 0; #line 119 "dk4sock26.ctr" #if DK4_USE_ASSERT assert(NULL != peerptr); assert(NULL != str); #endif if ((NULL != peerptr) && (NULL != str)) { if (0 != dk4str8_cpy_s(mycp, sizeof(mycp), str, erp)) { maptr = dk4str8_chr(mycp, '/'); if (NULL != maptr) { *(maptr++) = '\0'; } back = dk4socket_c8_inet_pton( &in4, sizeof(in4), AF_INET, mycp, erp); if (DK4_SOCKET_RESULT_SUCCESS == back) { af = AF_INET; } #if DK4_HAVE_STRUCT_SOCKADDR_IN6 else { back = dk4socket_c8_inet_pton( &in6, sizeof(in6), AF_INET6, mycp, erp); if (DK4_SOCKET_RESULT_SUCCESS == back) { af = AF_INET6; } } #endif if (DK4_SOCKET_RESULT_SUCCESS == back) { back = DK4_SOCKET_RESULT_FAILED; if (NULL != maptr) { #line 138 "dk4sock26.ctr" res = dk4ma_input_c8_dec_size_t(&bitno, maptr, &endptr, 1, NULL); if (0 != res) { #line 140 "dk4sock26.ctr" /* Bit number was specified. */ switch (af) { case AF_INET : { if (0 != dk4socket_mask_bits(&nm4, bitno, erp)) { ma4.s_addr = dk4socket_htonl(nm4); DK4_MEMCPY(&((peerptr->data).ipv4.ad),&in4,sizeof(in4)); DK4_MEMCPY(&((peerptr->data).ipv4.ma),&ma4,sizeof(ma4)); peerptr->af = af; back = DK4_SOCKET_RESULT_SUCCESS; } else { #line 151 "dk4sock26.ctr" } } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { back = dk4socket_mask6_bits(&ma6, bitno, erp); if (DK4_SOCKET_RESULT_SUCCESS == back) { DK4_MEMCPY(&((peerptr->data).ipv6.ad),&in6,sizeof(in6)); DK4_MEMCPY(&((peerptr->data).ipv6.ma),&ma6,sizeof(ma6)); peerptr->af = af; } else { #line 161 "dk4sock26.ctr" } } break; #endif default : { /* Must not happen */ } break; } } else { #line 169 "dk4sock26.ctr" /* Not a bit number, probably an address. */ switch (af) { case AF_INET : { back = dk4socket_c8_inet_pton( &ma4, sizeof(ma4), AF_INET, maptr, erp ); if (DK4_SOCKET_RESULT_SUCCESS == back) { DK4_MEMCPY(&((peerptr->data).ipv4.ad),&in4,sizeof(in4)); DK4_MEMCPY(&((peerptr->data).ipv4.ma),&ma4,sizeof(ma4)); peerptr->af = af; } else { #line 181 "dk4sock26.ctr" } } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { back = dk4socket_c8_inet_pton( &ma6, sizeof(ma6), AF_INET6, maptr, erp ); if (DK4_SOCKET_RESULT_SUCCESS == back) { DK4_MEMCPY(&((peerptr->data).ipv6.ad),&in6,sizeof(in6)); DK4_MEMCPY(&((peerptr->data).ipv6.ma),&ma6,sizeof(ma6)); peerptr->af = af; } else { #line 193 "dk4sock26.ctr" } } break; #endif } } } else { #line 199 "dk4sock26.ctr" /* Host was specified */ switch (af) { case AF_INET : { ma4.s_addr = dk4socket_htonl(0xFFFFFFFFUL); DK4_MEMCPY(&((peerptr->data).ipv4.ad), &in4, sizeof(in4)); DK4_MEMCPY(&((peerptr->data).ipv4.ma), &ma4, sizeof(ma4)); peerptr->af = af; back = DK4_SOCKET_RESULT_SUCCESS; } break; #if DK4_HAVE_STRUCT_SOCKADDR_IN6 case AF_INET6 : { for (i = 0; i < 16; i++) { ma6.s6_addr[i] = 0xFF; } DK4_MEMCPY(&((peerptr->data).ipv6.ad), &in6, sizeof(in6)); DK4_MEMCPY(&((peerptr->data).ipv6.ma), &ma6, sizeof(ma6)); peerptr->af = af; back = DK4_SOCKET_RESULT_SUCCESS; } break; #endif default : { /* Must not happen */ } break; } } } else { #line 224 "dk4sock26.ctr" } } else { #line 226 "dk4sock26.ctr" } } else { #line 228 "dk4sock26.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #if TRACE_DEBUG if (DK4_SOCKET_RESULT_SUCCESS == back) { dk4socket_c8_debug_allowed_peer(peerptr); } #endif #line 236 "dk4sock26.ctr" return back; }