From owner-freebsd-bugs@FreeBSD.ORG Sun Mar 11 05:00:16 2007 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id AA00E16A403 for ; Sun, 11 Mar 2007 05:00:16 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [69.147.83.40]) by mx1.freebsd.org (Postfix) with ESMTP id 9844413C494 for ; Sun, 11 Mar 2007 05:00:16 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id l2B50G9I095787 for ; Sun, 11 Mar 2007 05:00:16 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id l2B50GpV095785; Sun, 11 Mar 2007 05:00:16 GMT (envelope-from gnats) Date: Sun, 11 Mar 2007 05:00:16 GMT Message-Id: <200703110500.l2B50GpV095785@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Alex Kozlov Cc: Subject: Re: bin/110068: [patch] rewrite of mdmfs in shell X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Alex Kozlov List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Mar 2007 05:00:16 -0000 The following reply was made to PR bin/110068; it has been noted by GNATS. From: Alex Kozlov To: bug-followup@FreeBSD.org, spam@rm-rf.kiev.ua Cc: Subject: Re: bin/110068: [patch] rewrite of mdmfs in shell Date: Sun, 11 Mar 2007 06:54:22 +0200 Updated patch. Fix handling of -n option(pr 110178), add user/group check #!/bin/sh -f # # Copyright (c) 2006-7 Alex Kozlov # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # . /etc/rc.subr usage() { echo "usage: ${0##*/} [-DLlMNnPSUX] [-a maxcontig] [-b block-size]" echo " [-c blocks-per-cylinder-group][-d max-extent-size] [-E path-mdconfig]" echo " [-e maxbpg] [-F file] [-f frag-size] [-i bytes] [-m percent-free]" echo " [-O optimization] [-o mount-options] [-p permissions] [-s size]" echo " [-v version] [-w user:group] tmd-device mount-point" exit 1 } parse_options() { local OPT OPTARG OPTIND while getopts a:b:Cc:Dd:E:e:F:f:hi:LlMm:NnO:o:Pp:Ss:t:Uv:w:X OPT; do case ${OPT} in [abcdefilmn]) NEWFS_ARG="${NEWFS_ARG} -${OPT} ${OPTARG}" ;; C) ;; D) opt_detach=NO ;; E) MDCONFIG_PATH="${OPTARG}" ;; F) if checkyesno have_mdtype; then usage fi have_mdtype=YES opt_mdtype="vnode" MDCONFIG_ARG="${MDCONFIG_ARG} -f ${OPTARG}" ;; h) usage ;; L) redirect='' ;; M) if checkyesno have_mdtype; then usage fi have_mdtype=YES opt_mdtype="malloc" ;; N) opt_norun=YES ;; o) MOUNT_ARG="${MOUNT_ARG} -o ${OPTARG}" ;; O) NEWFS_ARG="${NEWFS_ARG} -o ${OPTARG}" ;; P) newfs=NO ;; p) mp_mode="${OPTARG}" ;; S) opt_softdep=NO ;; s) MDCONFIG_ARG="${MDCONFIG_ARG} -s ${OPTARG}" ;; U) opt_softdep=YES ;; v) NEWFS_ARG="${NEWFS_ARG} -O ${OPTARG}" ;; w) case ${OPTARG} in *:*) mp_user=${OPTARG%%:*} mp_group=${OPTARG#*:} run "${GETENT_PATH}" passwd "${mp_user}" if [ ${run_errcode} -ne 0 ]; then err 1 "invalid user: ${mp_user}" fi run "${GETENT_PATH}" group "${mp_group}" if [ ${run_errcode} -ne 0 ]; then err 1 "invalid group: ${mp_group}" fi ;; *) mp_user=${OPTARG} ;; esac ;; X) opt_debug=YES rc_debug=YES ;; *) usage ;; esac done OPTC=$((${OPTIND} - 1)) } do_mdconfig_detach() { run "${MDCONFIG_PATH}" -d -u "${unit}" # This is allowed to fail. if checkyesno opt_debug && [ ${run_errcode} -ne 0 ]; then warn "mdconfig (detach) exited with error code ${run_errcode} (ignored)" fi } do_mdconfig_attach() { if checkyesno autounit; then run "${MDCONFIG_PATH}" -a -t "${opt_mdtype}" "${MDCONFIG_ARG}" if checkyesno opt_norun; then unit=0 # dummy unit else unit=${run_ret} unit=${unit#*md*} # strip md fi else run "${MDCONFIG_PATH}" -a -t ${opt_mdtype} -u "${unit}" "${MDCONFIG_ARG}" fi if [ ${run_errcode} -ne 0 ]; then err 1 "mdconfig (attach) exited with error code ${run_errcode}" fi case ${unit} in [0-9]*) ;; *) err 1 "unexpected output from mdconfig (attach): ${unit}" ;; esac } do_newfs() { run "${NEWFS_PATH}" "${NEWFS_ARG}" "/dev/md${unit}" if [ ${run_errcode} -ne 0 ]; then err 1 "newfs exited with error code ${run_errcode}" fi } do_mount() { run "${MOUNT_PATH}" "${MOUNT_ARG}" "/dev/md${unit}${suffix}" "${opt_mp}" if [ ${run_errcode} -ne 0 ]; then err 1 "mount exited with error code ${run_errcode}" fi } do_mpsetup() { if [ -n "${mp_mode}" ]; then if checkyesno opt_debug; then debug "changing mode of ${opt_mp} to ${mp_mode}" fi run "${CHMOD_PATH}" "${mp_mode}" "${opt_mp}" if [ ${run_errcode} -ne 0 ]; then err 1 "chmod: ${opt_mp}" fi fi if [ -n "${mp_user}" ]; then if checkyesno opt_debug; then debug "changing owner (user) of ${opt_mp} to ${mp_user}" fi run "${CHOWN_PATH}" "${mp_user}" "${opt_mp}" if [ ${run_errcode} -ne 0 ]; then err 1 "chown ${opt_mp} to ${mp_user}" fi fi if [ -n "${mp_group}" ]; then if checkyesno opt_debug; then debug "changing owner (group) of ${opt_mp} to ${mp_group}" fi #run "${CHOWN_PATH}" :"${mp_group}" "${opt_mp}" run "${CHGRP_PATH}" "${mp_group}" "${opt_mp}" if [ ${run_errcode} -ne 0 ]; then err 1 "chgrp ${opt_mp} to ${mp_group}" fi fi } run() { run_ret='' run_errcode=0 if checkyesno opt_debug; then debug "running: $*" fi if checkyesno opt_norun; then return 0 fi run_ret=`eval $* ${redirect}` run_errcode=$? } init_vars() { CHMOD_PATH='/bin/chmod' CHOWN_PATH='/usr/sbin/chown' CHGRP_PATH='/usr/bin/chgrp' GETENT_PATH='/usr/bin/getent' NEWFS_PATH='/sbin/newfs' MDCONFIG_PATH='/sbin/mdconfig' MOUNT_PATH='/sbin/mount' NEWFS_ARG='' MDCONFIG_ARG='' MOUNT_ARG='' opt_detach=YES opt_softdep=YES opt_mdtype="swap" opt_norun=NO opt_debug=NO autounit=NO newfs=YES have_mdtype=NO suffix='' redirect='2>/dev/null' } main() { init_vars parse_options ${1+"$@"} shift ${OPTC} if [ -z ${@+1} ]; then usage fi case $1 in /dev/md[0-9]*|md[0-9]*) #unit=${1##*/} # strip path unit=${1#*md*} # strip md suffix=${unit##*[0-9]} # get suffix (first non-digit) unit=${unit%%[^0-9]*} ;;# strip suffix /dev/md|md|/dev/md[^0-9]*|md[^0-9]*) suffix=${1##*md} # get suffix (first after md) unit=0 autounit=YES ;; *) err 1 "bad device unit: $1" ;; esac shift if [ -z ${@+1} ]; then usage fi opt_mp=$1 if checkyesno opt_softdep; then NEWFS_ARG="${NEWFS_ARG} -U" fi if ! checkyesno newfs && [ "${opt_mdtype}" != "vnode" ]; then err 1 "-P requires a vnode-backed disk" fi if checkyesno opt_detach && ! checkyesno autounit; then do_mdconfig_detach fi do_mdconfig_attach if checkyesno newfs; then do_newfs fi do_mount do_mpsetup exit 0 } case ${0##*/} in mount_mfs|mfs) mp_mode=01777 ;; *) ;; esac main ${1+"$@"}