1*c9989395Sjsing /* $OpenBSD: tls13_error.c,v 1.1 2020/01/20 13:10:37 jsing Exp $ */
2*c9989395Sjsing /*
3*c9989395Sjsing * Copyright (c) 2014,2019 Joel Sing <jsing@openbsd.org>
4*c9989395Sjsing *
5*c9989395Sjsing * Permission to use, copy, modify, and distribute this software for any
6*c9989395Sjsing * purpose with or without fee is hereby granted, provided that the above
7*c9989395Sjsing * copyright notice and this permission notice appear in all copies.
8*c9989395Sjsing *
9*c9989395Sjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*c9989395Sjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*c9989395Sjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*c9989395Sjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*c9989395Sjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*c9989395Sjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*c9989395Sjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*c9989395Sjsing */
17*c9989395Sjsing
18*c9989395Sjsing #include <errno.h>
19*c9989395Sjsing
20*c9989395Sjsing #include "tls13_internal.h"
21*c9989395Sjsing
22*c9989395Sjsing void
tls13_error_clear(struct tls13_error * error)23*c9989395Sjsing tls13_error_clear(struct tls13_error *error)
24*c9989395Sjsing {
25*c9989395Sjsing error->code = 0;
26*c9989395Sjsing error->subcode = 0;
27*c9989395Sjsing error->errnum = 0;
28*c9989395Sjsing error->file = NULL;
29*c9989395Sjsing error->line = 0;
30*c9989395Sjsing free(error->msg);
31*c9989395Sjsing error->msg = NULL;
32*c9989395Sjsing }
33*c9989395Sjsing
34*c9989395Sjsing static int
tls13_error_vset(struct tls13_error * error,int code,int subcode,int errnum,const char * file,int line,const char * fmt,va_list ap)35*c9989395Sjsing tls13_error_vset(struct tls13_error *error, int code, int subcode, int errnum,
36*c9989395Sjsing const char *file, int line, const char *fmt, va_list ap)
37*c9989395Sjsing {
38*c9989395Sjsing char *errmsg = NULL;
39*c9989395Sjsing int rv = -1;
40*c9989395Sjsing
41*c9989395Sjsing tls13_error_clear(error);
42*c9989395Sjsing
43*c9989395Sjsing error->code = code;
44*c9989395Sjsing error->subcode = subcode;
45*c9989395Sjsing error->errnum = errnum;
46*c9989395Sjsing error->file = file;
47*c9989395Sjsing error->line = line;
48*c9989395Sjsing
49*c9989395Sjsing if (vasprintf(&errmsg, fmt, ap) == -1) {
50*c9989395Sjsing errmsg = NULL;
51*c9989395Sjsing goto err;
52*c9989395Sjsing }
53*c9989395Sjsing
54*c9989395Sjsing if (errnum == -1) {
55*c9989395Sjsing error->msg = errmsg;
56*c9989395Sjsing return 0;
57*c9989395Sjsing }
58*c9989395Sjsing
59*c9989395Sjsing if (asprintf(&error->msg, "%s: %s", errmsg, strerror(errnum)) == -1) {
60*c9989395Sjsing error->msg = NULL;
61*c9989395Sjsing goto err;
62*c9989395Sjsing }
63*c9989395Sjsing rv = 0;
64*c9989395Sjsing
65*c9989395Sjsing err:
66*c9989395Sjsing free(errmsg);
67*c9989395Sjsing
68*c9989395Sjsing return rv;
69*c9989395Sjsing }
70*c9989395Sjsing
71*c9989395Sjsing int
tls13_error_set(struct tls13_error * error,int code,int subcode,const char * file,int line,const char * fmt,...)72*c9989395Sjsing tls13_error_set(struct tls13_error *error, int code, int subcode,
73*c9989395Sjsing const char *file, int line, const char *fmt, ...)
74*c9989395Sjsing {
75*c9989395Sjsing va_list ap;
76*c9989395Sjsing int errnum, rv;
77*c9989395Sjsing
78*c9989395Sjsing errnum = errno;
79*c9989395Sjsing
80*c9989395Sjsing va_start(ap, fmt);
81*c9989395Sjsing rv = tls13_error_vset(error, code, subcode, errnum, file, line, fmt, ap);
82*c9989395Sjsing va_end(ap);
83*c9989395Sjsing
84*c9989395Sjsing return (rv);
85*c9989395Sjsing }
86*c9989395Sjsing
87*c9989395Sjsing int
tls13_error_setx(struct tls13_error * error,int code,int subcode,const char * file,int line,const char * fmt,...)88*c9989395Sjsing tls13_error_setx(struct tls13_error *error, int code, int subcode,
89*c9989395Sjsing const char *file, int line, const char *fmt, ...)
90*c9989395Sjsing {
91*c9989395Sjsing va_list ap;
92*c9989395Sjsing int rv;
93*c9989395Sjsing
94*c9989395Sjsing va_start(ap, fmt);
95*c9989395Sjsing rv = tls13_error_vset(error, code, subcode, -1, file, line, fmt, ap);
96*c9989395Sjsing va_end(ap);
97*c9989395Sjsing
98*c9989395Sjsing return (rv);
99*c9989395Sjsing }
100