/usr/bin/ldbash is in libbash 0.9.11-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 | #!/bin/bash
###########################################################################
# Copyright (c) 2004-2009 Hai Zaar and Gil Ran #
# #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of version 3 of the GNU General Public License as #
# published by the Free Software Foundation. #
# #
###########################################################################
#
# Dynamic loader for bash libraries
# NOTE: The script can't load libraries if their file name starts with '-'.
# (If someone gives a file a name that starts with a '-' he deserves it!)
#
# The prefix of internal functions
INTERNAL_PREFIX='__${Lib}_'
prefix=/usr
exec_prefix=${prefix}
# The directory that contains the bash libraries
LD_BASH_PATH=${exec_prefix}/lib/bash
# LD_BASH_CACHE - The ldbash cache file
LD_BASH_CACHE=/etc/ldbash.cache
# EXPORTS and REQUIREMENTS definitions
source $LD_BASH_CACHE || exit 1
# We want to use getopt_long...
source $LD_BASH_PATH/getopts.sh
source $LD_BASH_PATH/hashstash.sh
#############################################################
################### FUNCTIONS ####################
#############################################################
# Prints the script's usage.
usage()
{
echo "usage: ldbash"
echo " [-h|--help]"
echo " [-l|--list]"
echo " [-L|--load <lib,[lib[...]]>]"
echo " [-U|--unload <lib,[lib[...]]>]"
echo " [-e|--externlist <lib,[lib[...]]>]"
echo " [--externlist-all]"
echo " [-i|--internlist <lib,[lib[...]]>]"
echo " [--internlist-all]"
echo " [-v|--version]"
exit
}
# Lists all the available libraries.
list()
{
retval=`(cd $LD_BASH_PATH ; ls *.sh | sed "s/\.sh$//g")`
}
#
# $retval findLibExternalFuncs <lib[,lib[...]]>
#
# Finds all exported functions of given libraries.
#
# Parameters:
# lib - A name of a bash library
# Return value:
# A list of external (exported) functions of the given library
findLibExternalFuncs()
{
retval=""
# for each lib, find it's external functions
local Lib=
for Lib in ${*//,/ } ; do
eval LibInternalPrefix=$INTERNAL_PREFIX
# Add to the retval the name of the lib
retval="$retval $Lib: "
# Step by step:
# Grep functions declarations from the code of given library.
# Take just the declaration (looks like: "funcName<white_space>()")
# Remove the '()'
# Now throw away the lines that define internal functions
retval="$retval"`grep ^"[ |\t]*[a-zA-Z_][0-9a-zA-Z_]*[ |\t]*()" ${LD_BASH_PATH}/${Lib}.sh 2> /dev/null | \
cut -d : -f 2 | \
sed -e "s/()//g" -e "s/[ |\t]//g" 2> /dev/null | \
grep -v ^"[ |\t]*${LibInternalPrefix}" 2> /dev/null`
done
}
#
# $retval findLibInternalFuncs <lib[,lib[...]]>
#
# Finds all internal (not-to-be-exported) functions of given libraries.
#
# Parameters:
# lib - A name of a bash library
# Return value:
# A list of internal functions of the given library
findLibInternalFuncs()
{
retval=""
# for each lib, find it's internal functions
local Lib=
for Lib in ${*//,/ } ; do
eval LibInternalPrefix=$INTERNAL_PREFIX
# Add to the retval the name of the lib
retval="$retval $Lib: "
# Step by step:
# Grep internal functions declarations from the code of given library. Step by step:
# Take just the declaration (looks like: "funcName<whitespace>()")
# Remove the '()'
retval="$retval"`grep ^"[ |\t]*$LibInternalPrefix[0-9a-zA-Z_]*[ |\t]*()" ${LD_BASH_PATH}/${Lib}.sh 2> /dev/null | \
cut -d : -f 2 2> /dev/null |
sed -e "s/()//g" -e "s/[ |\t]//g" 2> /dev/null`
done
}
#
# ldbash_load load <lib[,lib[...]]>
#
# See description of return value.
#
# Parameters:
# lib - A list of libraries to load.
# Return value:
# A string that contains a command that will load the libraries.
# This string should be evaled (eval $retval).
load()
{
local LoadString=""
# LibsRequests is a list of requests for libraries to be loaded. Once a
# request is dealt with, it is removed from the list, and the appropriate
# library is added to LibsAdded (if it's not already there).
# LibsAdded is the list which aggregates the names of libraries to
# eventually load.
local LibsRequests="${*//,/ } "
local LibsAdded=
# Create the list of libs to load (with dependencies)
local Lib=
while [[ $LibsRequests ]]; do
# Handling the request first on the list (and removing it)
Lib=${LibsRequests%% *}
LibsRequests=${LibsRequests#* }
# Requests for libraries which have already been encountered are ignored.
[[ $LibsAdded == $Lib\ * ]] || [[ $LibsAdded == *\ $Lib\ * ]] && continue
LibsAdded="$LibsAdded$Lib "
# Get the names of the needed functions
eval LibRequire='${'${Lib}_REQUIRE'}'
# Find out, for each function, who exports it
local Func=
for Func in $LibRequire ; do
# This finds the name of the library that defines the function
# It does it by greping "EXPORT" string and the function name from the cache file
# and then taking only the lib name from the line.
# NeededLib is not local so it can be treeted as an array.
NeededLib=(`grep EXPORT $LD_BASH_CACHE | \
grep " $Func " | \
awk -F= '{print $1}' | \
sed -e 's/_EXPORT//g'`)
LibsRequests="$LibsRequests$NeededLib "
unset NeededLib
done
done
# Build the command that loads the libs
for Lib in $LibsAdded ; do
LoadString="${LoadString} source ${LD_BASH_PATH}/${Lib}.sh;"
done
retval=$LoadString
}
#
# ldbash_unload unload <lib,[lib[...]]>
#
# See description of return value.
#
# Parameters:
# lib - A list of libraries to unload.
# Return value
# A string that contains a command that will unloaded the libraries.
# This string should be evaled (\e eval \e retval)
unload()
{
local UnloadString=""
local Lib=
# Build the command that unloads the libs
#
# we've sources cache file that defines ${lib}_EXPORT
# ${lib}_EXPORT contains list of all functions that we've defined in load()
# by running eval 'unset ${lib}_EXPORT' we'll unset them all
#
for Lib in ${*//,/ } ; do
eval LibExports='${'${Lib}_EXPORT'}'
UnloadString="${UnloadString} unset $LibExports;"
done
retval=$UnloadString
}
##############################################################
################## MAIN ####################
##############################################################
if ! [[ $* ]] ; then
usage
fi
# parsing parameters
#
# -e will set Extern to its argument
# BUT
# --externlist-all will set Extern to '-all'
#
getopt_long '-l|--list->List
-L|--load->Load:
-U|--unload->Unload:
-e|--externlist->Extern:
-i|--internlist->Intern:
-v|--version->Version
-h|--help->Help' "$@"
eval "$retval"
# Do we need to show usage message?
[[ $Help ]] && usage
if [[ $Version ]] ; then
echo "libbash 0.9.11"
echo "Writen by Gil Ran and Hai Zaar"
exit 0
fi
# Do we need to show a list of libraries?
if [[ $List ]] ; then
echo "Libraries:"
list
for LibName in $retval ; do
echo " $LibName"
done
fi
# Do we need to show a list of external functions?
if [[ $Extern ]] ; then
# Check if the parameter is -all
if [[ "$Extern" = '-all' ]] ; then
# Run the function for all the available libraries
list
findLibExternalFuncs "${retval// /,}"
else
findLibExternalFuncs "$Extern"
fi
echo "External:"
for FuncName in $retval ; do
# Check if it is the library's name
if [[ "$FuncName" = *: ]] ; then
echo " $FuncName"
else # It must be a function name
echo " $FuncName"
fi
done
fi
# Do we need to show a list of internal functions?
if [[ $Intern ]] ; then
# Check if the parameter is -all
if [[ "$Intern" = '-all' ]] ; then
# Run the function for all the available libraries
list
findLibInternalFuncs "${retval// /,}"
else
findLibInternalFuncs "$Intern"
fi
echo "Internal:"
for FuncName in $retval ; do
# Check if it is the library's name
if [[ "$FuncName" = *: ]] ; then
echo " $FuncName"
else # It must be a function name
echo " $FuncName"
fi
done
fi
# If any on the listing options were set, do not preform load/unload
[[ $List ]] || [[ $Extern ]] || [[ $Intern ]] && exit 0
# Do we need to load any libraries?
if [[ $Load ]] ; then
load "$Load"
echo $retval
fi
# Do we need to unload any libraries?
if [[ $Unload ]] ; then
unload "$Unload"
echo $retval
fi
|