1 /*        $NetBSD: lib_strbuf.c,v 1.6 2024/08/18 20:47:13 christos Exp $        */
2 
3 /*
4  * lib_strbuf.c - init_lib() and library string storage
5  */
6 #ifdef HAVE_CONFIG_H
7 #include <config.h>
8 #endif
9 
10 #include <isc/mutex.h>
11 #include <isc/net.h>
12 #include <isc/result.h>
13 
14 #include "ntp_fp.h"
15 #include "ntp_stdlib.h"
16 #include "lib_strbuf.h"
17 
18 #define LIB_NUMBUF  10
19 
20 /*
21  * Storage declarations
22  */
23 static char                   lib_stringbuf_storage[LIB_NUMBUF][LIB_BUFLENGTH];
24 static char *                 lib_stringbuf[LIB_NUMBUF];
25 int                           lib_inited;
26 static isc_mutex_t  lib_mutex;
27 int                           ipv4_works;
28 int                           ipv6_works;
29 int                           debug;
30 
31 /*
32  * initialization routine.  Might be needed if the code is ROMized.
33  */
34 void
init_lib(void)35 init_lib(void)
36 {
37           u_int     u;
38 
39           if (lib_inited) {
40                     return;
41           }
42           ipv4_works = (ISC_R_SUCCESS == isc_net_probeipv4());
43           ipv6_works = (ISC_R_SUCCESS == isc_net_probeipv6());
44           init_systime();
45           /*
46            * Avoid -Wrestrict warnings by keeping a pointer to each buffer
47            * so the compiler can see copying from one buffer to another is
48            * not violating restrict qualifiers on, e.g. memcpy() args.
49            */
50           for (u = 0; u < COUNTOF(lib_stringbuf); u++) {
51                     lib_stringbuf[u] = lib_stringbuf_storage[u];
52           }
53           (void)isc_mutex_init(&lib_mutex);
54           lib_inited = TRUE;
55 }
56 
57 
58 char *
lib_getbuf(void)59 lib_getbuf(void)
60 {
61           static int          lib_nextbuf;
62           int                 mybuf;
63 
64           if (!lib_inited) {
65                     init_lib();
66           }
67           isc_mutex_lock(&lib_mutex);
68           mybuf = lib_nextbuf;
69           lib_nextbuf = (1 + mybuf) % COUNTOF(lib_stringbuf);
70           isc_mutex_unlock(&lib_mutex);
71           zero_mem(lib_stringbuf[mybuf], LIB_BUFLENGTH);
72 
73           return lib_stringbuf[mybuf];
74 }
75