Add 'bind' option for the default behaviour of custom mounts (bind-mount).
[live-boot-grml.git] / scripts / live-helpers
index ce28742..d8bd613 100644 (file)
@@ -530,6 +530,24 @@ what_is_mounted_on ()
        grep -m1 "^[^ ]\+ ${dir} " /proc/mounts | cut -d' ' -f1
 }
 
+chown_ref ()
+{
+       local reference="${1}"
+       shift
+       local targets=${@}
+       local owner=$(stat -c %u:%g "${reference}")
+       chown -h ${owner} ${targets}
+}
+
+chmod_ref ()
+{
+       local reference="${1}"
+       shift
+       local targets=${@}
+       local rights=$(stat -c %a "${reference}")
+       chmod ${rights} ${targets}
+}
+
 lastline ()
 {
        while read lines
@@ -1164,17 +1182,19 @@ link_files ()
                        then
                                mkdir -p "${dest}"
                                prev="$(dirname "${dest}")"
-                               chown --reference "${prev}" "${dest}"
-                               chmod --reference "${prev}" "${dest}"
+                               chown_ref "${prev}" "${dest}"
+                               chmod_ref "${prev}" "${dest}"
                        fi
                        link_files "${src}" "${dest}" "${src_mask}"
                else
+                       local final_src=${src}
                        if [ -n "${src_mask}" ]
                        then
-                               src="$(echo ${src} | sed "s|^${src_mask}||")"
+                               final_src="$(echo ${final_src} | sed "s|^${src_mask}||")"
                        fi
                        rm -rf "${dest}" 2> /dev/null
-                       ln -s "${src}" "${dest}"
+                       ln -s "${final_src}" "${dest}"
+                       chown_ref "${src}" "${dest}"
                fi
        done
 }
@@ -1303,7 +1323,7 @@ get_custom_mounts ()
                                        linkfiles)
                                                opt_linkfiles="yes"
                                                ;;
-                                       union)
+                                       union|bind)
                                                ;;
                                        *)
                                                log_warning_msg "Skipping custom mount with unkown option: ${opt}"
@@ -1369,25 +1389,27 @@ activate_custom_mounts ()
 
        while read device source dest options # < ${custom_mounts}
        do
+               local opt_bind="yes"
                local opt_linkfiles=""
                local opt_union=""
                for opt in $(echo ${options} | tr ',' ' ');
                do
                        case "${opt}" in
+                               bind)
+                                       opt_bind="yes"
+                                       unset opt_linkfiles opt_union
+                                       ;;
                                linkfiles)
                                        opt_linkfiles="yes"
+                                       unset opt_bind opt_union
                                        ;;
                                union)
                                        opt_union="yes"
+                                       unset opt_bind opt_linkfiles
                                        ;;
                        esac
                done
 
-               if [ -n "${opt_linkfiles}" ] && [ -n "${opt_union}" ]
-               then
-                       log_warning_msg "Skipping custom mount ${dest} with options ${options}: \"linkfiles\" and \"union\" are mutually exclusive options"
-               fi
-
                if [ -n "$(what_is_mounted_on "${dest}")" ]
                then
                        log_warning_msg "Skipping custom mount ${dest}: $(what_is_mounted_on "${dest}") is already mounted there"
@@ -1433,9 +1455,10 @@ activate_custom_mounts ()
                                # unions and don't need to be bootstrapped
                                # linkfiles dirs can't be bootstrapped in a sensible way
                                mkdir -p "${source}"
-                               chown --reference "${dest}" "${source}"
-                               chmod --reference "${dest}" "${source}"
-                       else
+                               chown_ref "${dest}" "${source}"
+                               chmod_ref "${dest}" "${source}"
+                       elif [ -n "${opt_bind}" ]
+                       then
                                # ensure that $dest is not copied *into* $source
                                mkdir -p "$(dirname ${source})"
                                cp -a "${dest}" "${source}"
@@ -1494,8 +1517,8 @@ activate_custom_mounts ()
                                rm -rf "${cow_dir}"
                        fi
                        mkdir -p ${cow_dir}
-                       chown --reference "${source}" "${cow_dir}"
-                       chmod --reference "${source}" "${cow_dir}"
+                       chown_ref "${source}" "${cow_dir}"
+                       chmod_ref "${source}" "${cow_dir}"
                        do_union ${dest} ${cow_dir} ${source} ${rofs_dest_backing}
                fi