1/* 2 * The new sysinstall program. 3 * 4 * This is probably the last attempt in the `sysinstall' line, the next 5 * generation being slated to essentially a complete rewrite. 6 * 7 * $FreeBSD$ 8 * 9 * Copyright (c) 1995 10 * Jordan Hubbard. All rights reserved. 11 * Copyright (c) 1995 12 * Gary J Palmer. All rights reserved. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer, 19 * verbatim and that no modifications are made prior to this 20 * point in the file. 21 * 2. Redistributions in binary form must reproduce the above copyright 22 * notice, this list of conditions and the following disclaimer in the 23 * documentation and/or other materials provided with the distribution. 24 * 25 * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 */ 38 39/* These routines deal with getting things off of floppy media */ 40 41#include "sysinstall.h" 42#include <sys/fcntl.h> 43#include <sys/stat.h> 44#include <sys/errno.h> 45#include <sys/param.h> 46#include <sys/wait.h> 47#include <unistd.h> 48#include <grp.h> 49 50#define MSDOSFS 51#include <sys/mount.h> 52#include <fs/msdosfs/msdosfsmount.h> 53#undef MSDOSFS 54 55#include <ufs/ufs/ufsmount.h> 56static Boolean floppyMounted; 57 58char *distWanted; 59static char mountpoint[] = "/dist"; 60 61Boolean 62mediaInitFloppy(Device *dev) 63{ 64 struct msdosfs_args dosargs; 65 struct ufs_args u_args; 66 char *mp; 67 68 if (floppyMounted) 69 return TRUE; 70 71 mp = dev->private ? (char *)dev->private : mountpoint; 72 if (Mkdir(mp)) { 73 msgConfirm("Unable to make %s directory mountpoint for %s!", mp, dev->devname); 74 return FALSE; 75 } 76 77 msgDebug("Init floppy called for %s distribution.\n", distWanted ? distWanted : "some"); 78 79 if (!variable_get(VAR_NONINTERACTIVE)) { 80 if (!distWanted) 81 msgConfirm("Please insert floppy in %s", dev->description); 82 else 83 msgConfirm("Please insert floppy containing %s in %s", 84 distWanted, dev->description); 85 } 86 87 memset(&dosargs, 0, sizeof dosargs); 88 dosargs.fspec = dev->devname; 89 dosargs.uid = dosargs.gid = 0; 90 dosargs.mask = 0777; 91 92 memset(&u_args, 0, sizeof(u_args)); 93 u_args.fspec = dev->devname; 94 95 if (mount("msdosfs", mp, MNT_RDONLY, (caddr_t)&dosargs) != -1) 96 goto success; 97 if (mount("ufs", mp, MNT_RDONLY, (caddr_t)&u_args) != -1) 98 goto success; 99 100 msgConfirm("Error mounting floppy %s (%s) on %s : %s", 101 dev->name, dev->devname, mp, strerror(errno)); 102 return FALSE; 103 104success: 105 floppyMounted = TRUE; 106 distWanted = NULL; 107 return TRUE; 108} 109 110FILE * 111mediaGetFloppy(Device *dev, char *file, Boolean probe) 112{ 113 char buf[PATH_MAX], *mp; 114 FILE *fp; 115 int nretries = 5; 116 117 /* 118 * floppies don't use mediaGenericGet() because it's too expensive 119 * to speculatively open files on a floppy disk. Make user get it 120 * right or give up with floppies. 121 */ 122 mp = dev->private ? (char *)dev->private : mountpoint; 123 snprintf(buf, PATH_MAX, "%s/%s", mp, file); 124 if (!file_readable(buf)) { 125 if (probe) 126 return NULL; 127 else { 128 while (!file_readable(buf)) { 129 if (!--nretries) { 130 msgConfirm("GetFloppy: Failed to get %s after retries;\ngiving up.", buf); 131 return NULL; 132 } 133 distWanted = buf; 134 mediaShutdownFloppy(dev); 135 if (!mediaInitFloppy(dev)) 136 return NULL; 137 } 138 } 139 } 140 fp = fopen(buf, "r"); 141 return fp; 142} 143 144void 145mediaShutdownFloppy(Device *dev) 146{ 147 if (floppyMounted) { 148 char *mp = dev->private ? (char *)dev->private : mountpoint; 149 150 if (unmount(mp, MNT_FORCE) != 0) 151 msgDebug("Umount of floppy on %s failed: %s (%d)\n", mp, strerror(errno), errno); 152 else { 153 floppyMounted = FALSE; 154 if (!variable_get(VAR_NONINTERACTIVE) && variable_cmp(SYSTEM_STATE, "fixit")) 155 msgConfirm("You may remove the floppy from %s", dev->description); 156 } 157 } 158} 159