1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 2002-2003 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #include <unistd.h>
30 #include <string.h>
31 #include <errno.h>
32 #include <sys/types.h>
33
34 #include <openssl/ssl.h>
35 #include <openssl/err.h>
36
37 #include <boot_http.h>
38
39 #ifndef _BOOT
40 extern const char *hstrerror(int);
41 #endif
42
43 static const char *errlist[] = {
44 /* EHTTP_BADARG */ "One or more arguments are not valid",
45 /* EHTTP_NOMEM */ "Insufficient memory",
46 /* EHTTP_CONCLOSED */ "SSL connection is closed (but maybe not the"
47 " underlying connection)",
48 /* EHTTP_UNEXPECTED */ "SSL connection returned unexpected error",
49 /* EHTTP_EOFERR */ "Unexpected/premature EOF",
50 /* EHTTP_NOCERT */ "No certificate was presented",
51 /* EHTTP_NOMATCH */ "'Peername' doesn't match 'host' or no "
52 "matching entry",
53 /* EHTTP_NODATA */ "No data was returned",
54 /* EHTTP_NOT_1_1 */ "Not a HTTP/1.1 server",
55 /* EHTTP_BADHDR */ "Invalid header",
56 /* EHTTP_OORANGE */ "Request header line out of range",
57 /* EHTTP_NORESP */ "No response or partial response received",
58 /* EHTTP_BADRESP */ "Bad response or error response returned",
59 /* EHTTP_NOHEADER */ "Chunked header expected but not found",
60 /* EHTTP_NOBOUNDARY */ "Boundary line expected but not found",
61 /* EHTTP_NOTMULTI */ "This is not a multipart transfer",
62 /* EHTTP_BADSIZE */ "Could not determine msg body size"
63 };
64 static int nerrs = { sizeof (errlist) / sizeof (errlist[0]) };
65
66 /*
67 * http_errorstr - print the error associated with the source and errorcode
68 *
69 * Arguments:
70 * errsrc - Which library caused the error (as returned by
71 * http_get_lasterr())
72 * error - The error code returned
73 *
74 * Returns:
75 * Pointer to error string for this error.
76 */
77 char const *
http_errorstr(uint_t errsrc,ulong_t error)78 http_errorstr(uint_t errsrc, ulong_t error)
79 {
80 char const *msg = NULL;
81 #ifdef _BOOT
82 static char message[128];
83 #endif
84 switch (errsrc) {
85 case ERRSRC_SYSTEM:
86 msg = strerror(error);
87 if (msg == NULL)
88 msg = "Unknown system error";
89 break;
90 case ERRSRC_LIBHTTP:
91 if (error == 0 || error > nerrs)
92 msg = "Unknown libhttp error";
93 else
94 msg = errlist[error - 1];
95 break;
96 case ERRSRC_RESOLVE:
97 #ifdef _BOOT
98 (void) sprintf(message, "Host retrieval error %lu\n", error);
99 msg = message;
100 #else
101 msg = hstrerror(error);
102 #endif
103 break;
104 case ERRSRC_VERIFERR:
105 msg = X509_verify_cert_error_string(error);
106 break;
107 case ERRSRC_LIBSSL:
108 msg = ERR_error_string(error, NULL);
109 break;
110 default:
111 msg = "Unknown error";
112 break;
113 }
114
115 return (msg);
116 }
117