| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | #!/bin/sh
set -e
cd "$(php -r 'echo ini_get("extension_dir");')"
usage() {
	echo "usage: $0 [options] module-name [module-name ...]"
	echo "   ie: $0 gd mysqli"
	echo "       $0 pdo pdo_mysql"
	echo "       $0 --ini-name 0-apc.ini apcu apc"
	echo
	echo 'Possible values for module-name:'
	echo $(find -maxdepth 1 -type f -name '*.so' -exec basename '{}' ';' | sort)
}
opts="$(getopt -o 'h?' --long 'help,ini-name:' -- "$@" || { usage >&2 && false; })"
eval set -- "$opts"
iniName=
while true; do
	flag="$1"
	shift
	case "$flag" in
		--help|-h|'-?') usage && exit 0 ;;
		--ini-name) iniName="$1" && shift ;;
		--) break ;;
		*)
			{
				echo "error: unknown flag: $flag"
				usage
			} >&2
			exit 1
			;;
	esac
done
modules=
for module; do
	if [ -z "$module" ]; then
		continue
	fi
	if [ -f "$module.so" ] && ! [ -f "$module" ]; then
		# allow ".so" to be optional
		module="$module.so"
	fi
	if ! [ -f "$module" ]; then
		echo >&2 "error: $(readlink -f "$module") does not exist"
		echo >&2
		usage >&2
		exit 1
	fi
	modules="$modules $module"
done
if [ -z "$modules" ]; then
	usage >&2
	exit 1
fi
for module in $modules; do
	if nm -g "$module" | grep -q ' zend_extension_entry$'; then
		# https://wiki.php.net/internals/extensions#loading_zend_extensions
		line="zend_extension=$(readlink -f "$module")"
	else
		line="extension=$module"
	fi
	ext="$(basename "$module")"
	ext="${ext%.*}"
	if php -r 'exit(extension_loaded("'"$ext"'") ? 0 : 1);'; then
		# this isn't perfect, but it's better than nothing
		# (for example, 'opcache.so' presents inside PHP as 'Zend OPcache', not 'opcache')
		echo >&2
		echo >&2 "warning: $ext ($module) is already loaded!"
		echo >&2
		continue
	fi
	ini="${PHP_INI_DIR}/conf.d/${iniName:-"docker-php-ext-$ext.ini"}"
	if ! grep -q "$line" "$ini" 2>/dev/null; then
		echo "$line" >> "$ini"
	fi
done
 |