#! /usr/bin/awk -f # MOUNT-RAW - mounts partitions stored in image file # Copyright (C) 2007 Matous Jan Fialka # # This program 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. # # This program 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 # this program. If not, see . # NOTES: # # Works also when POSIXLY_CORRECT exists in environment. BEGIN { DEBUG = 1 # DEBUG = 0 FTEST = "/usr/bin/test" FDISK = "/sbin/fdisk" MOUNT = "/bin/mount" USAGE = USAGE "mountraw.awk " USAGE = USAGE " " USAGE = USAGE "[ ]" ERROR[01] = "invalid number of arguments; at least 3 expected" ERROR[02] = "invalid run-time user; only root can do that" ERROR[03] = "target does not exist" ERROR[04] = "target can not be read" ERROR[05] = "target can not be executed" ERROR[06] = "target is not a directory" ERROR[07] = "invalid partition number given; use decimal number" ERROR[08] = "invalid mount options given; see mount(8) options" ERROR[09] = "unable to determine sector size" ERROR[10] = "unable to determine partition starting sector" ERROR[11] = "unable to perform write operations; turn off debugging" EMPTY = "" } function error(code, message) { print("Error: " ERROR[code] " " message) > "/dev/stderr" exit(code) } function usage() { print("Usage: " USAGE) } function debug(message) { print("Debug: " message) } function teste(filename) { if (system(FTEST " -e " filename " &> /dev/null")) error(3, filename) return(1) } function testr(filename) { if (system(FTEST " -r " filename " &> /dev/null")) error(4, filename) return(1) } function testx(filename) { if (system(FTEST " -x " filename " &> /dev/null")) error(4, filename) return(1) } function testd(filename) { if (system(FTEST " -d " filename " &> /dev/null")) error(6, filename) return(1) } BEGIN { if (ARGC < 4) { usage() error(1, EMPTY) } if (PROCINFO["euid"] != 0) error(2, EMPTY) teste(FTEST) # sort of tricky test of test testx(FTEST) teste(FDISK) testx(FDISK) teste(MOUNT) testx(MOUNT) testr(image_file = ARGV[1]) testd(mount_point = ARGV[3]) if (ARGV[2] !~ /^[0-9]+$/) error(7, ENPTY) else partition_number = ARGV[2] if (ARGV[4] && ARGV[4] !~ /^[a-zA-Z0-9,=]+$/) error(8, EMPTY) else mount_options = ARGV[4] FDISK = FDISK " 2> /dev/null -u -l " image_file sector_size = starting_sector = 0 match_sector_size = "^Units = sectors of 1 \\* [0-9]+ = [0-9]+ bytes$" match_starting_sector = "^" image_file partition_number "$" while (FDISK | getline) { if ((!sector_size) && $0 ~ match_sector_size) { sector_size = $7 continue } if ((!starting_sector) && $1 ~ match_starting_sector) { if ($2 ~ /^[0-9]+$/) { starting_sector = $2 break } if ($2 ~ "^*$" && $3 ~ /^[0-9]+$/) { starting_sector = $3 break } break } } close(command_fdisk) if (!sector_size) error(9, EMPTY) if (!starting_sector) error(10, EMPTY) offset = sprintf("%d", starting_sector * sector_size) MOUNT = MOUNT " -o loop,offset=" offset MOUNT = MOUNT (mount_options ? "," mount_options : "") MOUNT = MOUNT " " image_file " " mount_point if (DEBUG) { debug(MOUNT) error(11, EMPTY) } exit(system(MOUNT)) }