/* * VAS_EBOOT -- GRand Unified Bootloader * Copyright (C) 1999,2000,2001,2002,2003,2004,2006,2007,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc. * * VAS_EBOOT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * VAS_EBOOT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with VAS_EBOOT. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include # include # include /* struct disklabel */ # include /* struct dkwedge_info */ # ifdef HAVE_GETRAWPARTITION # include /* getrawpartition */ # endif /* HAVE_GETRAWPARTITION */ # if defined(__NetBSD__) # include # endif # if defined(__OpenBSD__) # include # endif #if defined(__NetBSD__) # ifndef RAW_FLOPPY_MAJOR # define RAW_FLOPPY_MAJOR 9 # endif /* ! RAW_FLOPPY_MAJOR */ /* Adjust device driver parameters. This function should be called just after successfully opening the device. For now, it simply prevents the floppy driver from retrying operations on failure, as otherwise the driver takes a while to abort when there is no floppy in the drive. */ static void configure_device_driver (VasEBoot_util_fd_t fd) { struct stat st; if (fstat (fd, &st) < 0 || ! S_ISCHR (st.st_mode)) return; if (major(st.st_rdev) == RAW_FLOPPY_MAJOR) { int floppy_opts; if (ioctl (fd, FDIOCGETOPTS, &floppy_opts) == -1) return; floppy_opts |= FDOPT_NORETRY; if (ioctl (fd, FDIOCSETOPTS, &floppy_opts) == -1) return; } } VasEBoot_util_fd_t VasEBoot_util_fd_open (const char *os_dev, int flags) { VasEBoot_util_fd_t ret; #ifdef O_LARGEFILE flags |= O_LARGEFILE; #endif #ifdef O_BINARY flags |= O_BINARY; #endif ret = open (os_dev, flags, S_IROTH | S_IRGRP | S_IRUSR | S_IWUSR); if (ret >= 0) configure_device_driver (ret); return ret; } #endif VasEBoot_int64_t VasEBoot_util_get_fd_size_os (VasEBoot_util_fd_t fd, const char *name, unsigned *log_secsize) { struct disklabel label; unsigned sector_size, log_sector_size; #if defined(__NetBSD__) configure_device_driver (fd); #endif if (ioctl (fd, DIOCGDINFO, &label) == -1) return -1; sector_size = label.d_secsize; if (sector_size & (sector_size - 1) || !sector_size) return -1; log_sector_size = VasEBoot_log2ull (sector_size); if (log_secsize) *log_secsize = log_sector_size; return (VasEBoot_uint64_t) label.d_secperunit << log_sector_size; } void VasEBoot_hostdisk_flush_initial_buffer (const char *os_dev __attribute__ ((unused))) { }