From 2c50bd9a82c3bb6dfbc63466ae8bfbd401fb3235 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 4 Jun 2012 15:22:21 -0700 Subject: [PATCH] helper-functions.sh: multijob support bash <4.1 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 | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/bin/helper-functions.sh b/bin/helper-functions.sh index afe14af91..c7400fa4b 100644 --- a/bin/helper-functions.sh +++ b/bin/helper-functions.sh @@ -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: [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 +} -- 2.26.2