]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libc/stdlib/set_constraint_handler_s.c
MFV: zlib: examples: define functions as static ones. (PR #855)
[FreeBSD/FreeBSD.git] / lib / libc / stdlib / set_constraint_handler_s.c
1 /*-
2  * Copyright (c) 2017 Juniper Networks.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  */
25
26 #include <sys/cdefs.h>
27 #include "namespace.h"
28 #include <sys/types.h>
29 #include <machine/atomic.h>
30 #include <errno.h>
31 #include <pthread.h>
32 #include <stddef.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <unistd.h>
36 #include "un-namespace.h"
37 #include "libc_private.h"
38
39 /*
40  * Rationale recommends allocating new memory each time.
41  */
42 static constraint_handler_t *_ch = NULL;
43 static pthread_mutex_t ch_lock = PTHREAD_MUTEX_INITIALIZER;
44
45 constraint_handler_t
46 set_constraint_handler_s(constraint_handler_t handler)
47 {
48         constraint_handler_t *new, *old, ret;
49
50         new = malloc(sizeof(constraint_handler_t));
51         if (new == NULL)
52                 return (NULL);
53         *new = handler;
54         if (__isthreaded)
55                 _pthread_mutex_lock(&ch_lock);
56         old = _ch;
57         _ch = new;
58         if (__isthreaded)
59                 _pthread_mutex_unlock(&ch_lock);
60         if (old == NULL) {
61                 ret = NULL;
62         } else {
63                 ret = *old;
64                 free(old);
65         }
66         return (ret);
67 }
68
69 void
70 __throw_constraint_handler_s(const char * restrict msg, errno_t error)
71 {
72         constraint_handler_t ch;
73
74         if (__isthreaded)
75                 _pthread_mutex_lock(&ch_lock);
76         ch = _ch != NULL ? *_ch : NULL;
77         if (__isthreaded)
78                 _pthread_mutex_unlock(&ch_lock);
79         if (ch != NULL)
80                 ch(msg, NULL, error);
81 }
82
83 void
84 abort_handler_s(const char * restrict msg, void * restrict ptr __unused,
85     errno_t error __unused)
86 {
87         static const char ahs[] = "abort_handler_s : ";
88
89         (void) _write(STDERR_FILENO, ahs, sizeof(ahs) - 1);
90         (void) _write(STDERR_FILENO, msg, strlen(msg));
91         (void) _write(STDERR_FILENO, "\n", 1);
92         abort();
93 }
94
95 void
96 ignore_handler_s(const char * restrict msg __unused,
97     void * restrict ptr __unused, errno_t error __unused)
98 {
99 }