summaryrefslogtreecommitdiffstats
path: root/functions
diff options
context:
space:
mode:
authorAaron Griffin <aaron@archlinux.org>2006-04-25 07:41:53 +0200
committerAaron Griffin <aaron@archlinux.org>2006-04-25 07:41:53 +0200
commit7b6b2316bde86f21d44fdd3b5b3da5284c1bbdd1 (patch)
tree6eeefb0bc9e2b7e424213a109a71e2961aa4c435 /functions
parent97004aa82d44c0fc90c1b0b49a796cc9b1927032 (diff)
downloadmkinitcpio-7b6b2316bde86f21d44fdd3b5b3da5284c1bbdd1.tar.gz
mkinitcpio-7b6b2316bde86f21d44fdd3b5b3da5284c1bbdd1.tar.xz
git-svn-id: http://projects.archlinux.org/svn/initramfs/mkinitcpio@10 880c04e9-e011-0410-abf7-b926e227c9cd
Diffstat (limited to 'functions')
-rw-r--r--functions179
1 files changed, 179 insertions, 0 deletions
diff --git a/functions b/functions
new file mode 100644
index 0000000..f3e0800
--- /dev/null
+++ b/functions
@@ -0,0 +1,179 @@
+
+auto_modules ()
+{
+ aliases=$(find /sys/devices/ -name modalias -exec cat {} \;)
+ modprobe --show-depends -a $aliases 2>/dev/null |\
+ sed "s|insmod \(.*\)|\1|" | grep ${@} | sort -u
+}
+
+all_modules ()
+{
+ find ${MODULEDIR} -name *.ko 2>/dev/null |\
+ grep ${@} | sort -u
+}
+
+msg() { [ "${QUIET}" = "n" ] && echo "${@}"; }
+err() { echo "ERROR: ${@}" >&2; }
+
+add_dir()
+{
+ local dir
+ dir="$(dirname ${1})"
+ if [ "x${dir}" != "x" -a "${dir}" != "/" ]; then
+ dir="${dir}" #this got stripped off above... put it back
+
+ if ! grep "dir ${dir} " "${FILELIST}" 2>&1 > /dev/null; then
+ add_dir "${dir}"
+ msg " adding dir ${dir}"
+ echo "dir ${dir} 755 0 0" >> "${FILELIST}"
+ fi
+ fi
+}
+
+# add_devnode /dev/foo type major minor [permissions]
+add_device()
+{
+ if [ $# -ge 4 ]; then
+ local perms
+ perms="${5:-644}"
+ add_dir "${1}"
+ if ! grep "nod ${1}" "${FILELIST}" 2>&1 > /dev/null; then
+ msg " adding device node ${1}"
+ echo "nod ${1} ${perms} 0 0 ${2} ${3} ${4}" >> "${FILELIST}"
+ fi
+ else
+ err "invalid device node format: $@"
+ return 1
+ fi
+}
+
+add_symlink ()
+{
+ local fil dest dir
+ if [ -L ${1} ]; then
+ fil="${1}"
+ dest="${fil##$BASEDIR}"
+ add_dir "${dest}"
+ if ! grep "slink ${fil} " "${FILELIST}" 2>&1 > /dev/null; then
+ msg " adding symlink ${dest}"
+ echo "slink ${dest} ${fil} $(stat -c '%a %u %g' ${fil})" >> "${FILELIST}"
+ fi
+ else
+ err "ERROR: file '${1}' is not a symlink"
+ return 1
+ fi
+}
+
+add_file ()
+{
+ local fil lnk dir dest
+ if [ -e "${1}" ]; then
+ fil="${1}"
+ lnk=$(readlink -f "${fil}")
+ if [ -n "${lnk}" ]; then
+ add_symlink "${fil}"
+ fil="${lnk}"
+ fi
+ if [ $# -eq 2 ]; then
+ dest="${2}"
+ else
+ dest="${fil##$BASEDIR}"
+ fi
+
+ add_dir "${dest}"
+
+ if ! grep "file ${fil} " "${FILELIST}" 2>&1 > /dev/null; then
+ msg " adding file ${dest}"
+ echo "file ${dest} ${fil} $(stat -c '%a %u %g' ${fil})" >> "${FILELIST}"
+ fi
+ else
+ err "file '${1}' does not exist"
+ return 1
+ fi
+}
+
+HAS_MODULES="n"
+add_module()
+{
+ local fil path mod deps
+ #cleanup - remove .ko, replace - and _ with [-_] to match either
+ fil=$(basename "${1}" | sed -e "s|[-_]|\[-_\]|g" -e "s|\.ko$||g")
+
+ for path in $(find "${MODULEDIR}" -type f -name "${fil}.ko"); do
+ for mod in $(modinfo -F depends "${path}" | tr ',' ' '); do
+ if [ "x${mod}" != "x" ]; then
+ add_module "${mod}"
+ HAS_MODULES="y"
+ fi
+ done
+ add_file "${path}"
+ done
+}
+
+add_binary()
+{
+ local bin type lib
+ bin=$(which "${1}")
+ if [ $? -ne 0 ]; then
+ bin="${1}"
+ fi
+
+ if [ ! -f "${bin}" ]; then
+ err "'${bin}' is not a file"
+ return 1
+ fi
+
+ if [ $? -eq 0 ]; then
+ type=$(file -b "${bin}")
+ case "${type}" in
+ *script*)
+ msg " adding '${type}' script, ensure proper interp exists..."
+ add_file "${bin}"
+ ;;
+ *executable*)
+ add_file "${bin}"
+ #note, this will also handle 'not a dynamic executable' spit out by
+ # static binaries... the deps will produce nothing
+ for lib in $(ldd ${bin} 2>/dev/null | sed "s|.*=>\(.*\)|\1|"); do
+ if [ "x${lib}" != "x" ]; then
+ #remove TLS libraries
+ notls=$(echo ${lib} | sed 's|/lib/tls.*/\(lib.*\)|/lib/\1|')
+ [ -e "${notls}" ] && lib="${notls}"
+ [ -f "${lib}" ] && add_file "${lib}"
+ fi
+ done
+ ;;
+ *)
+ err "unknown type '${type}' for binary '${bin}'"
+ return 1
+ ;;
+ esac
+ fi
+}
+
+parse_hook()
+{
+ local mod bin fil
+ for mod in $MODULES; do
+ if [ "x${mod}" != "x" ]; then
+ add_module "${mod}"
+ fi
+ done
+
+ for bin in $BINARIES; do
+ if [ "x${bin}" != "x" ]; then
+ add_binary "${bin}"
+ fi
+ done
+
+ for fil in $FILES; do
+ if [ "x${fil}" != "x" ]; then
+ add_file "${fil}"
+ fi
+ done
+
+ if [ "x${SCRIPT}" != "x" ]; then
+ add_file "${HOOKDIR}${SCRIPT}"
+ fi
+}
+# vim: set ft=sh ts=4 sw=4 noet: