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
40extern	const char *hstrerror(int);
41#endif
42
43static 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};
64static 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 */
77char const *
78http_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