helper-functions.sh: multijob support bash <4.1 v2.2.0_alpha110
authorZac Medico <zmedico@gentoo.org>
Mon, 4 Jun 2012 22:22:21 +0000 (15:22 -0700)
committerZac Medico <zmedico@gentoo.org>
Mon, 4 Jun 2012 22:22:21 +0000 (15:22 -0700)
The redirect_alloc_fd() compatibility function is borrowed from Mike
Frysinger's proposed multiprocessing.eclass:

http://archives.gentoo.org/gentoo-dev/msg_5ecd3b1dd0720522807c136d8fd2cd5f.xml

bin/helper-functions.sh

index afe14af91c9018c130504a43a8a2f7c3c21e0b3e..c7400fa4b2cc8ddc3885c81e1c23662b7153d01b 100644 (file)
@@ -22,7 +22,7 @@ multijob_init() {
        mj_control_pipe=$(mktemp -t multijob.XXXXXX)
        rm "${mj_control_pipe}"
        mkfifo "${mj_control_pipe}"
-       exec {mj_control_fd}<>${mj_control_pipe}
+       redirect_alloc_fd mj_control_fd "${mj_control_pipe}"
        rm -f "${mj_control_pipe}"
 
        # See how many children we can fork based on the user's settings.
@@ -60,3 +60,31 @@ multijob_post_fork() {
        fi
        return $?
 }
+
+# @FUNCTION: redirect_alloc_fd
+# @USAGE: <var> <file> [redirection]
+# @DESCRIPTION:
+# Find a free fd and redirect the specified file via it.  Store the new
+# fd in the specified variable.  Useful for the cases where we don't care
+# about the exact fd #.
+redirect_alloc_fd() {
+       local var=$1 file=$2 redir=${3:-"<>"}
+
+       if [[ $(( (BASH_VERSINFO[0] << 8) + BASH_VERSINFO[1] )) -ge $(( (4 << 8) + 1 )) ]] ; then
+                       # Newer bash provides this functionality.
+                       eval "exec {${var}}${redir}'${file}'"
+       else
+                       # Need to provide the functionality ourselves.
+                       local fd=10
+                       while :; do
+                                       # Make sure the fd isn't open.  It could be a char device,
+                                       # or a symlink (possibly broken) to something else.
+                                       if [[ ! -e /dev/fd/${fd} ]] && [[ ! -L /dev/fd/${fd} ]] ; then
+                                                       eval "exec ${fd}${redir}'${file}'" && break
+                                       fi
+                                       [[ ${fd} -gt 1024 ]] && die "redirect_alloc_fd failed"
+                                       : $(( ++fd ))
+                       done
+                       : $(( ${var} = fd ))
+       fi
+}