Update TODO file.
[nbdkit/ericb.git] / src / tls.c
blob08e8638510353126a15ebb978013a8af0f2e596a
1 /* nbdkit
2 * Copyright (C) 2013 Red Hat Inc.
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * * Neither the name of Red Hat nor the names of its contributors may be
17 * used to endorse or promote products derived from this software without
18 * specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
34 #include <config.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <string.h>
39 #include <unistd.h>
40 #include <assert.h>
42 #include <pthread.h>
44 #include "nbdkit-plugin.h"
45 #include "internal.h"
47 /* Note currently all thread-local storage data is informational.
48 * It's mainly used for smart error and debug messages.
50 * The main thread does not have any associated TLS, *unless* it is
51 * serving a request (the '-s' option).
54 struct tls {
55 const char *name; /* Can be NULL. */
56 size_t instance_num; /* Can be 0. */
57 struct sockaddr addr;
58 socklen_t addrlen;
61 static pthread_key_t tls_key;
63 static void
64 free_tls (void *tlsv)
66 struct tls *tls = tlsv;
68 free (tls);
71 void
72 tls_init (void)
74 int err;
76 err = pthread_key_create (&tls_key, free_tls);
77 if (err != 0) {
78 fprintf (stderr, "%s: pthread_key_create: %s\n",
79 program_name, strerror (err));
80 exit (EXIT_FAILURE);
84 void
85 tls_new_server_thread (void)
87 struct tls *tls;
89 tls = calloc (1, sizeof *tls);
90 if (tls == NULL) {
91 perror ("malloc");
92 exit (EXIT_FAILURE);
94 pthread_setspecific (tls_key, tls);
97 void
98 tls_set_name (const char *name)
100 struct tls *tls = pthread_getspecific (tls_key);
102 if (tls)
103 tls->name = name;
106 void
107 tls_set_instance_num (size_t instance_num)
109 struct tls *tls = pthread_getspecific (tls_key);
111 if (tls)
112 tls->instance_num = instance_num;
115 void
116 tls_set_sockaddr (struct sockaddr *addr, socklen_t addrlen)
118 struct tls *tls = pthread_getspecific (tls_key);
120 if (tls) {
121 tls->addrlen = addrlen;
122 memcpy (&tls->addr, addr, addrlen);
126 const char *
127 tls_get_name (void)
129 struct tls *tls = pthread_getspecific (tls_key);
131 if (!tls)
132 return NULL;
134 return tls->name;
137 size_t
138 tls_get_instance_num (void)
140 struct tls *tls = pthread_getspecific (tls_key);
142 if (!tls)
143 return 0;
145 return tls->instance_num;