1 1.35 wiz /* $NetBSD: mount_cd9660.c,v 1.35 2024/02/03 15:47:44 wiz Exp $ */ 2 1.2 cgd 3 1.1 mycroft /* 4 1.1 mycroft * Copyright (c) 1992, 1993, 1994 5 1.1 mycroft * The Regents of the University of California. All rights reserved. 6 1.1 mycroft * 7 1.1 mycroft * This code is derived from software contributed to Berkeley 8 1.1 mycroft * by Pace Willisson (pace (at) blitz.com). The Rock Ridge Extension 9 1.1 mycroft * Support code is derived from software contributed to Berkeley 10 1.1 mycroft * by Atsushi Murai (amurai (at) spec.co.jp). 11 1.1 mycroft * 12 1.1 mycroft * Redistribution and use in source and binary forms, with or without 13 1.1 mycroft * modification, are permitted provided that the following conditions 14 1.1 mycroft * are met: 15 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 16 1.1 mycroft * notice, this list of conditions and the following disclaimer. 17 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 18 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 19 1.1 mycroft * documentation and/or other materials provided with the distribution. 20 1.18 agc * 3. Neither the name of the University nor the names of its contributors 21 1.1 mycroft * may be used to endorse or promote products derived from this software 22 1.1 mycroft * without specific prior written permission. 23 1.1 mycroft * 24 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 1.1 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 1.1 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 1.1 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 1.1 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 1.1 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 1.1 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 1.1 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 1.1 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 1.1 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 1.1 mycroft * SUCH DAMAGE. 35 1.5 lukem * 36 1.5 lukem * @(#)mount_cd9660.c 8.7 (Berkeley) 5/1/95 37 1.1 mycroft */ 38 1.1 mycroft 39 1.4 lukem #include <sys/cdefs.h> 40 1.1 mycroft #ifndef lint 41 1.27 lukem __COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\ 42 1.27 lukem The Regents of the University of California. All rights reserved."); 43 1.1 mycroft #endif /* not lint */ 44 1.1 mycroft 45 1.1 mycroft #ifndef lint 46 1.2 cgd #if 0 47 1.5 lukem static char sccsid[] = "@(#)mount_cd9660.c 8.7 (Berkeley) 5/1/95"; 48 1.2 cgd #else 49 1.35 wiz __RCSID("$NetBSD: mount_cd9660.c,v 1.35 2024/02/03 15:47:44 wiz Exp $"); 50 1.2 cgd #endif 51 1.1 mycroft #endif /* not lint */ 52 1.1 mycroft 53 1.1 mycroft #include <sys/param.h> 54 1.1 mycroft #include <sys/mount.h> 55 1.1 mycroft 56 1.1 mycroft #include <err.h> 57 1.1 mycroft #include <stdlib.h> 58 1.1 mycroft #include <stdio.h> 59 1.1 mycroft #include <string.h> 60 1.1 mycroft #include <unistd.h> 61 1.15 christos #include <util.h> 62 1.6 fvdl 63 1.6 fvdl #include <isofs/cd9660/cd9660_mount.h> 64 1.1 mycroft 65 1.17 jdolecek #include <mntopts.h> 66 1.1 mycroft 67 1.28 pooka #include "mountprog.h" 68 1.28 pooka #include "mount_cd9660.h" 69 1.28 pooka 70 1.14 jdolecek static const struct mntopt mopts[] = { 71 1.1 mycroft MOPT_STDOPTS, 72 1.1 mycroft MOPT_UPDATE, 73 1.15 christos MOPT_GETARGS, 74 1.12 jdolecek { "extatt", 0, ISOFSMNT_EXTATT, 1 }, 75 1.12 jdolecek { "gens", 0, ISOFSMNT_GENS, 1 }, 76 1.11 jdolecek { "maplcase", 1, ISOFSMNT_NOCASETRANS, 1 }, 77 1.29 christos { "casetrans", 1, ISOFSMNT_NOCASETRANS, 1 }, 78 1.12 jdolecek { "nrr", 0, ISOFSMNT_NORRIP, 1 }, 79 1.12 jdolecek { "rrip", 1, ISOFSMNT_NORRIP, 1 }, 80 1.12 jdolecek { "joliet", 1, ISOFSMNT_NOJOLIET, 1 }, 81 1.13 jdolecek { "rrcaseins", 0, ISOFSMNT_RRCASEINS, 1 }, 82 1.24 christos MOPT_NULL, 83 1.1 mycroft }; 84 1.1 mycroft 85 1.32 joerg __dead static void usage(void); 86 1.1 mycroft 87 1.14 jdolecek #ifndef MOUNT_NOMAIN 88 1.1 mycroft int 89 1.20 xtraeme main(int argc, char **argv) 90 1.1 mycroft { 91 1.28 pooka 92 1.28 pooka setprogname(argv[0]); 93 1.14 jdolecek return mount_cd9660(argc, argv); 94 1.14 jdolecek } 95 1.14 jdolecek #endif 96 1.14 jdolecek 97 1.28 pooka void 98 1.28 pooka mount_cd9660_parseargs(int argc, char **argv, 99 1.28 pooka struct iso_args *args, int *mntflags, 100 1.28 pooka char *canon_dev, char *canon_dir) 101 1.14 jdolecek { 102 1.34 christos struct stat sb; 103 1.34 christos int ch, opts, set_gid, set_uid, set_mask, set_dirmask; 104 1.22 christos mntoptparse_t mp; 105 1.28 pooka char *dev, *dir; 106 1.1 mycroft 107 1.29 christos memset(args, 0, sizeof(*args)); 108 1.34 christos *mntflags = opts = set_gid = set_uid = set_mask = set_dirmask = 0; 109 1.29 christos optind = optreset = 1; 110 1.34 christos while ((ch = getopt(argc, argv, "egG:jM:m:o:rU:")) != -1) 111 1.1 mycroft switch (ch) { 112 1.1 mycroft case 'e': 113 1.12 jdolecek /* obsolete, retained for compatibility only, use 114 1.12 jdolecek * -o extatt */ 115 1.1 mycroft opts |= ISOFSMNT_EXTATT; 116 1.1 mycroft break; 117 1.1 mycroft case 'g': 118 1.12 jdolecek /* obsolete, retained for compatibility only, use 119 1.12 jdolecek * -o gens */ 120 1.1 mycroft opts |= ISOFSMNT_GENS; 121 1.9 scw break; 122 1.34 christos case 'G': 123 1.34 christos opts |= ISOFSMNT_GID; 124 1.34 christos args->gid = a_gid(optarg); 125 1.34 christos set_gid = 1; 126 1.34 christos break; 127 1.34 christos case 'm': 128 1.34 christos args->fmask = a_mask(optarg); 129 1.34 christos set_mask = 1; 130 1.34 christos break; 131 1.34 christos case 'M': 132 1.34 christos args->dmask = a_mask(optarg); 133 1.34 christos set_dirmask = 1; 134 1.34 christos break; 135 1.9 scw case 'j': 136 1.12 jdolecek /* obsolete, retained fo compatibility only, use 137 1.12 jdolecek * -o nojoliet */ 138 1.9 scw opts |= ISOFSMNT_NOJOLIET; 139 1.1 mycroft break; 140 1.1 mycroft case 'o': 141 1.28 pooka mp = getmntopts(optarg, mopts, mntflags, &opts); 142 1.22 christos if (mp == NULL) 143 1.22 christos err(1, "getmntopts"); 144 1.22 christos freemntopts(mp); 145 1.1 mycroft break; 146 1.1 mycroft case 'r': 147 1.12 jdolecek /* obsolete, retained for compatibility only, use 148 1.12 jdolecek * -o norrip */ 149 1.1 mycroft opts |= ISOFSMNT_NORRIP; 150 1.1 mycroft break; 151 1.34 christos case 'U': 152 1.34 christos opts |= ISOFSMNT_UID; 153 1.34 christos args->uid = a_uid(optarg); 154 1.34 christos set_uid = 1; 155 1.34 christos break; 156 1.1 mycroft case '?': 157 1.1 mycroft default: 158 1.1 mycroft usage(); 159 1.1 mycroft } 160 1.30 christos 161 1.1 mycroft argc -= optind; 162 1.1 mycroft argv += optind; 163 1.1 mycroft 164 1.1 mycroft if (argc != 2) 165 1.1 mycroft usage(); 166 1.1 mycroft 167 1.34 christos if (set_mask && !set_dirmask) { 168 1.34 christos args->dmask = args->fmask; 169 1.34 christos set_dirmask = 1; 170 1.34 christos } else if (set_dirmask && !set_mask) { 171 1.34 christos args->fmask = args->dmask; 172 1.34 christos set_mask = 1; 173 1.34 christos } 174 1.34 christos 175 1.1 mycroft dev = argv[0]; 176 1.1 mycroft dir = argv[1]; 177 1.1 mycroft 178 1.28 pooka pathadj(dev, canon_dev); 179 1.28 pooka pathadj(dir, canon_dir); 180 1.19 erh 181 1.1 mycroft #define DEFAULT_ROOTUID -2 182 1.5 lukem /* 183 1.16 wiz * ISO 9660 filesystems are not writable. 184 1.5 lukem */ 185 1.30 christos if ((*mntflags & MNT_GETARGS) == 0) 186 1.30 christos *mntflags |= MNT_RDONLY; 187 1.31 pooka args->fspec = canon_dev; 188 1.28 pooka args->flags = opts; 189 1.34 christos 190 1.34 christos if (!set_gid || !set_uid || !set_mask) { 191 1.34 christos if (stat(dir, &sb) == -1) 192 1.34 christos err(1, "stat %s", dir); 193 1.34 christos 194 1.34 christos if (!set_uid) 195 1.34 christos args->uid = sb.st_uid; 196 1.34 christos if (!set_gid) 197 1.34 christos args->gid = sb.st_gid; 198 1.34 christos if (!set_mask) { 199 1.34 christos args->fmask = args->dmask = 200 1.34 christos sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); 201 1.34 christos } 202 1.34 christos } 203 1.28 pooka } 204 1.28 pooka 205 1.28 pooka int 206 1.28 pooka mount_cd9660(int argc, char **argv) 207 1.28 pooka { 208 1.28 pooka struct iso_args args; 209 1.28 pooka char canon_dev[MAXPATHLEN], canon_dir[MAXPATHLEN]; 210 1.28 pooka int mntflags; 211 1.1 mycroft 212 1.28 pooka mount_cd9660_parseargs(argc, argv, &args, &mntflags, 213 1.28 pooka canon_dev, canon_dir); 214 1.28 pooka 215 1.28 pooka if (mount(MOUNT_CD9660, canon_dir, mntflags, &args, sizeof args) == -1) 216 1.28 pooka err(1, "%s on %s", canon_dev, canon_dir); 217 1.15 christos if (mntflags & MNT_GETARGS) { 218 1.15 christos char buf[2048]; 219 1.15 christos (void)snprintb(buf, sizeof(buf), ISOFSMNT_BITS, args.flags); 220 1.15 christos printf("%s\n", buf); 221 1.15 christos } 222 1.28 pooka 223 1.1 mycroft exit(0); 224 1.33 rillig /* NOTREACHED */ 225 1.1 mycroft } 226 1.1 mycroft 227 1.14 jdolecek static void 228 1.20 xtraeme usage(void) 229 1.1 mycroft { 230 1.1 mycroft (void)fprintf(stderr, 231 1.35 wiz "usage: %s [-G gid] [-M mask] [-m mask] [-o options] [-U uid] special node\n", getprogname()); 232 1.1 mycroft exit(1); 233 1.1 mycroft } 234