Make trim_path() handle "/", and arbitrarily many consecutive /:es.
[live-boot-grml.git] / scripts / live-helpers
index 7c4e0d7..75fc106 100644 (file)
@@ -519,8 +519,9 @@ where_is_mounted ()
 }
 
 trim_path () {
-    # remove all unnecessary /:s in the path, including last
-    echo ${1} | sed 's|//|/|g' | sed 's|/$||'
+    # remove all unnecessary /:s in the path, including last one (except
+    # if path is just "/")
+    echo ${1} | sed 's|//\+|/|g' | sed 's|^\(.*[^/]\)/$|\1|'
 }
 
 what_is_mounted_on ()
@@ -1277,35 +1278,32 @@ get_custom_mounts ()
                        cp ${include_list} ${rootmnt}/live/persistent/${persistence_list}.${device_name}
                fi
 
-               while read source dest options # < ${include_list}
+               while read dir options # < ${include_list}
                do
-                       if echo ${source} | grep -qe "^[[:space:]]*\(#.*\)\?$"
+                       if echo ${dir} | grep -qe "^[[:space:]]*\(#.*\)\?$"
                        then
                                # skipping empty or commented lines
                                continue
                        fi
 
-                       if [ -z "${dest}" ]
+                       if trim_path ${dir} | grep -q -e "^[^/]" -e "^/$" -e "^/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
                        then
-                               dest="${source}"
-                       fi
-
-                       if trim_path ${source} | grep -q -e "^[^/]" -e "^\(.*/\)\?\.\.\?\(/.*\)\?$"
-                       then
-                               log_warning_msg "Skipping unsafe custom mount with source ${source}: the source must be an absolute path w.r.t. the persistent media root and cannot contain \".\" or \"..\""
-                               continue
-                       fi
-
-                       if trim_path ${dest} | grep -q -e "^[^/]" -e "^/$" -e "^/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
-                       then
-                               log_warning_msg "Skipping unsafe custom mount with desination ${dest}: the destination must be an absolute path containing neither \".\" nor \"..\", and cannot be /live (or any sub-directory therein) or / (for the latter, use ${root_overlay_label}-type persistence instead)"
+                               log_warning_msg "Skipping unsafe custom mount ${dir}: must be an absolute path containing neither the \".\" nor \"..\" special dirs, and cannot be \"/live\" (or any sub-directory therein) or \"/\" (for the latter, use ${root_overlay_label}-type persistence)"
                                continue
                        fi
 
+                       local opt_source=""
+                       local opt_linkfiles=""
                        for opt in $(echo ${options} | tr ',' ' ');
                        do
                                case "${opt}" in
-                                       linkfiles|union)
+                                       source=*)
+                                               opt_source=${opt#source=}
+                                               ;;
+                                       linkfiles)
+                                               opt_linkfiles="yes"
+                                               ;;
+                                       union)
                                                ;;
                                        *)
                                                log_warning_msg "Skipping custom mount with unkown option: ${opt}"
@@ -1314,10 +1312,21 @@ get_custom_mounts ()
                                esac
                        done
 
-                       # ensure that no multiple-/ occur in paths
+                       local source="${dir}"
+                       if [ -n "${opt_source}" ]
+                       then
+                               if echo ${opt_source} | grep -q -e "^/" -e "^\(.*/\)\?\.\.\?\(/.*\)\?$" && [ "${source}" != "." ]
+                               then
+                                       log_warning_msg "Skipping unsafe custom mount with option source=${opt_source}: must be either \".\" (the media root) a relative path w.r.t. the media root that doesn't contain comas or the special dirs \".\" and \"..\""
+                                       continue
+                               else
+                                       source="${opt_source}"
+                               fi
+                       fi
+
                        local full_source="$(trim_path ${backing}/${source})"
-                       local full_dest="$(trim_path ${rootmnt}/${dest})"
-                       if echo ${options} | grep -qe "\<linkfiles\>";
+                       local full_dest="$(trim_path ${rootmnt}/${dir})"
+                       if [ -n "${opt_linkfiles}" ]
                        then
                                echo "${device} ${full_source} ${full_dest} ${options}" >> ${links}
                        else
@@ -1364,7 +1373,7 @@ activate_custom_mounts ()
 
                if [ -n "$(what_is_mounted_on "${dest}")" ]
                then
-                       log_warning_msg "Skipping custom mount ${source} on ${dest}: $(what_is_mounted_on "${dest}") is already mounted there"
+                       log_warning_msg "Skipping custom mount ${dest}: $(what_is_mounted_on "${dest}") is already mounted there"
                        continue
                fi
 
@@ -1420,6 +1429,8 @@ activate_custom_mounts ()
                        fi
                fi
 
+               # XXX: If CONFIG_AUFS_ROBR is added to the Debian kernel we can
+               # ignore the loop below and set rofs_dest_backing=$dest
                rofs_dest_backing=""
                for d in ${rootmnt}/live/rofs/*
                do
@@ -1504,6 +1515,6 @@ fix_home_rw_compatibility ()
        if [ ! -r "${include_list}" ]
        then
                echo "# home-rw backwards compatibility:
-/ /home" > "${include_list}"
+/home source=." > "${include_list}"
        fi
 }