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