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