xref: /titanic_51/usr/src/cmd/boot/common/boot_utils.c (revision af28f636873b7156cfd73ceffa927658cca33fd0)
1*af28f636SEnrico Perla - Sun Microsystems /*
2*af28f636SEnrico Perla - Sun Microsystems  * CDDL HEADER START
3*af28f636SEnrico Perla - Sun Microsystems  *
4*af28f636SEnrico Perla - Sun Microsystems  * The contents of this file are subject to the terms of the
5*af28f636SEnrico Perla - Sun Microsystems  * Common Development and Distribution License (the "License").
6*af28f636SEnrico Perla - Sun Microsystems  * You may not use this file except in compliance with the License.
7*af28f636SEnrico Perla - Sun Microsystems  *
8*af28f636SEnrico Perla - Sun Microsystems  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*af28f636SEnrico Perla - Sun Microsystems  * or http://www.opensolaris.org/os/licensing.
10*af28f636SEnrico Perla - Sun Microsystems  * See the License for the specific language governing permissions
11*af28f636SEnrico Perla - Sun Microsystems  * and limitations under the License.
12*af28f636SEnrico Perla - Sun Microsystems  *
13*af28f636SEnrico Perla - Sun Microsystems  * When distributing Covered Code, include this CDDL HEADER in each
14*af28f636SEnrico Perla - Sun Microsystems  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*af28f636SEnrico Perla - Sun Microsystems  * If applicable, add the following below this CDDL HEADER, with the
16*af28f636SEnrico Perla - Sun Microsystems  * fields enclosed by brackets "[]" replaced with your own identifying
17*af28f636SEnrico Perla - Sun Microsystems  * information: Portions Copyright [yyyy] [name of copyright owner]
18*af28f636SEnrico Perla - Sun Microsystems  *
19*af28f636SEnrico Perla - Sun Microsystems  * CDDL HEADER END
20*af28f636SEnrico Perla - Sun Microsystems  */
21*af28f636SEnrico Perla - Sun Microsystems /*
22*af28f636SEnrico Perla - Sun Microsystems  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*af28f636SEnrico Perla - Sun Microsystems  */
24*af28f636SEnrico Perla - Sun Microsystems 
25*af28f636SEnrico Perla - Sun Microsystems #include <stdio.h>
26*af28f636SEnrico Perla - Sun Microsystems #include <libintl.h>
27*af28f636SEnrico Perla - Sun Microsystems #include <errno.h>
28*af28f636SEnrico Perla - Sun Microsystems #include <assert.h>
29*af28f636SEnrico Perla - Sun Microsystems #include <unistd.h>
30*af28f636SEnrico Perla - Sun Microsystems #include "bblk_einfo.h"
31*af28f636SEnrico Perla - Sun Microsystems #include "boot_utils.h"
32*af28f636SEnrico Perla - Sun Microsystems 
33*af28f636SEnrico Perla - Sun Microsystems boolean_t boot_debug = B_FALSE;
34*af28f636SEnrico Perla - Sun Microsystems boolean_t nowrite = B_FALSE;
35*af28f636SEnrico Perla - Sun Microsystems 
36*af28f636SEnrico Perla - Sun Microsystems void
37*af28f636SEnrico Perla - Sun Microsystems boot_gdebug(const char *funcname, char *format, ...)
38*af28f636SEnrico Perla - Sun Microsystems {
39*af28f636SEnrico Perla - Sun Microsystems 	va_list ap;
40*af28f636SEnrico Perla - Sun Microsystems 
41*af28f636SEnrico Perla - Sun Microsystems 	if (boot_debug == B_FALSE)
42*af28f636SEnrico Perla - Sun Microsystems 		return;
43*af28f636SEnrico Perla - Sun Microsystems 
44*af28f636SEnrico Perla - Sun Microsystems 	(void) fprintf(stdout, "%s(): ", funcname);
45*af28f636SEnrico Perla - Sun Microsystems 
46*af28f636SEnrico Perla - Sun Microsystems 	va_start(ap, format);
47*af28f636SEnrico Perla - Sun Microsystems 	/* LINTED: E_SEC_PRINTF_VAR_FMT */
48*af28f636SEnrico Perla - Sun Microsystems 	(void) vfprintf(stdout, format, ap);
49*af28f636SEnrico Perla - Sun Microsystems 	va_end(ap);
50*af28f636SEnrico Perla - Sun Microsystems }
51*af28f636SEnrico Perla - Sun Microsystems 
52*af28f636SEnrico Perla - Sun Microsystems /*
53*af28f636SEnrico Perla - Sun Microsystems  * Common functions to write out and read in block-sized data to a file
54*af28f636SEnrico Perla - Sun Microsystems  * descriptor.
55*af28f636SEnrico Perla - Sun Microsystems  */
56*af28f636SEnrico Perla - Sun Microsystems int
57*af28f636SEnrico Perla - Sun Microsystems write_out(int fd, void *buffer, size_t size, off_t off)
58*af28f636SEnrico Perla - Sun Microsystems {
59*af28f636SEnrico Perla - Sun Microsystems 	int		ret;
60*af28f636SEnrico Perla - Sun Microsystems 	char		*buf = buffer;
61*af28f636SEnrico Perla - Sun Microsystems 
62*af28f636SEnrico Perla - Sun Microsystems 	if (size % SECTOR_SIZE != 0)
63*af28f636SEnrico Perla - Sun Microsystems 		BOOT_DEBUG("Expected block-sized data, got: %d\n", size);
64*af28f636SEnrico Perla - Sun Microsystems 
65*af28f636SEnrico Perla - Sun Microsystems 	/* Dry run. */
66*af28f636SEnrico Perla - Sun Microsystems 	if (nowrite)
67*af28f636SEnrico Perla - Sun Microsystems 		return (BC_SUCCESS);
68*af28f636SEnrico Perla - Sun Microsystems 
69*af28f636SEnrico Perla - Sun Microsystems 	for (;;) {
70*af28f636SEnrico Perla - Sun Microsystems 	again:
71*af28f636SEnrico Perla - Sun Microsystems 		ret = pwrite(fd, buf, size, off);
72*af28f636SEnrico Perla - Sun Microsystems 		if (ret == -1) {
73*af28f636SEnrico Perla - Sun Microsystems 			if (errno == EAGAIN)
74*af28f636SEnrico Perla - Sun Microsystems 				goto again;
75*af28f636SEnrico Perla - Sun Microsystems 			else
76*af28f636SEnrico Perla - Sun Microsystems 				return (BC_ERROR);
77*af28f636SEnrico Perla - Sun Microsystems 			}
78*af28f636SEnrico Perla - Sun Microsystems 		if (ret < size) {
79*af28f636SEnrico Perla - Sun Microsystems 			size -= ret;
80*af28f636SEnrico Perla - Sun Microsystems 			off += ret;
81*af28f636SEnrico Perla - Sun Microsystems 			buf += ret;
82*af28f636SEnrico Perla - Sun Microsystems 		} else {
83*af28f636SEnrico Perla - Sun Microsystems 			break;
84*af28f636SEnrico Perla - Sun Microsystems 		}
85*af28f636SEnrico Perla - Sun Microsystems 	}
86*af28f636SEnrico Perla - Sun Microsystems 	return (BC_SUCCESS);
87*af28f636SEnrico Perla - Sun Microsystems }
88*af28f636SEnrico Perla - Sun Microsystems 
89*af28f636SEnrico Perla - Sun Microsystems int
90*af28f636SEnrico Perla - Sun Microsystems read_in(int fd, void *buffer, size_t size, off_t off)
91*af28f636SEnrico Perla - Sun Microsystems {
92*af28f636SEnrico Perla - Sun Microsystems 	int		ret;
93*af28f636SEnrico Perla - Sun Microsystems 	char		*buf = buffer;
94*af28f636SEnrico Perla - Sun Microsystems 
95*af28f636SEnrico Perla - Sun Microsystems 	if (size % SECTOR_SIZE != 0)
96*af28f636SEnrico Perla - Sun Microsystems 		BOOT_DEBUG("Expected block-sized data, got: %d\n", size);
97*af28f636SEnrico Perla - Sun Microsystems 
98*af28f636SEnrico Perla - Sun Microsystems 	for (;;) {
99*af28f636SEnrico Perla - Sun Microsystems 	again:
100*af28f636SEnrico Perla - Sun Microsystems 		ret = pread(fd, buf, size, off);
101*af28f636SEnrico Perla - Sun Microsystems 		if (ret == -1) {
102*af28f636SEnrico Perla - Sun Microsystems 			if (errno == EAGAIN)
103*af28f636SEnrico Perla - Sun Microsystems 				goto again;
104*af28f636SEnrico Perla - Sun Microsystems 			else
105*af28f636SEnrico Perla - Sun Microsystems 				return (BC_ERROR);
106*af28f636SEnrico Perla - Sun Microsystems 			}
107*af28f636SEnrico Perla - Sun Microsystems 		if (ret < size) {
108*af28f636SEnrico Perla - Sun Microsystems 			size -= ret;
109*af28f636SEnrico Perla - Sun Microsystems 			off += ret;
110*af28f636SEnrico Perla - Sun Microsystems 			buf += ret;
111*af28f636SEnrico Perla - Sun Microsystems 		} else {
112*af28f636SEnrico Perla - Sun Microsystems 			break;
113*af28f636SEnrico Perla - Sun Microsystems 		}
114*af28f636SEnrico Perla - Sun Microsystems 	}
115*af28f636SEnrico Perla - Sun Microsystems 	return (BC_SUCCESS);
116*af28f636SEnrico Perla - Sun Microsystems }
117