diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/gen-multicall.sh | 84 | ||||
-rwxr-xr-x | tools/install.sh | 11 |
2 files changed, 92 insertions, 3 deletions
diff --git a/tools/gen-multicall.sh b/tools/gen-multicall.sh new file mode 100755 index 0000000..50a9625 --- /dev/null +++ b/tools/gen-multicall.sh @@ -0,0 +1,84 @@ +#!/bin/sh -e + +P="$1" +p=`echo $P | tr - _` + +echo '/* ISC license. */' +echo +echo '#include <skalibs/nonposix.h>' +echo +{ echo '#include <string.h>' ; echo '#include <stdlib.h>' ; cat src/$P/*.c | grep '^#include <' | grep -vF '<skalibs/' | grep -vF "<$P/" ; } | sort -u + +cat <<EOF + +#include <skalibs/skalibs.h> + +#include <$P/config.h> + +typedef int main_func (int, char const *const *, char const *const *) ; +typedef main_func *main_func_ref ; + +typedef struct multicall_app_s multicall_app, *multicall_app_ref ; +struct multicall_app_s +{ + char const *name ; + main_func_ref mainf ; +} ; + +static int multicall_app_cmp (void const *a, void const *b) +{ + char const *name = a ; + multicall_app const *p = b ; + return strcmp(name, p->name) ; +} +EOF + +for i in `ls -1 src/$P/deps-exe` ; do + j=`echo $i | tr - _` + echo + grep -v '^#include ' < src/$P/${i}.c | grep -vF '/* ISC license. */' | sed -e "s/int main (.*)$/int ${j}_main (int argc, char const *const *argv, char const *const *envp)/" + echo + echo '#undef USAGE' + echo '#undef dieusage' + echo '#undef dienomem' + echo '#undef bail' +done + +cat <<EOF + +static int ${p}_main (int, char const *const *, char const *const *) ; + +static multicall_app const multicall_apps[] = +{ +EOF + +for i in `{ echo $P ; ls -1 src/$P/deps-exe ; } | sort` ; do + j=`echo $i | tr - _` + echo " { .name = \"${i}\", .mainf = &${j}_main }," +done + +cat <<EOF +} ; + +#define USAGE "$P subcommand [ arguments... ]" +#define dieusage() strerr_dief1x(100, USAGE) + +static int ${p}_main (int argc, char const *const *argv, char const *const *envp) +{ + multicall_app const *p ; + PROG = "$P" ; + if (!argc) dieusage() ; + p = bsearch(argv[1], multicall_apps, sizeof(multicall_apps) / sizeof(multicall_app), sizeof(multicall_app), &multicall_app_cmp) ; + if (!p) strerr_dief2x(100, "unknown subcommand: ", argv[1]) ; + return (*(p->mainf))(argc-1, argv+1, envp) ; +} + +int main (int argc, char const *const *argv, char const *const *envp) +{ + multicall_app const *p ; + char const *name = strrchr(argv[0], '/') ; + if (name) name++ ; else name = argv[0] ; + p = bsearch(name, multicall_apps, sizeof(multicall_apps) / sizeof(multicall_app), sizeof(multicall_app), &multicall_app_cmp) ; + return p ? (*(p->mainf))(argc, argv, envp) : ${p}_main(argc, argv, envp) ; +} +EOF diff --git a/tools/install.sh b/tools/install.sh index 89f9428..e96dd7b 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -1,19 +1,21 @@ #!/bin/sh usage() { - echo "usage: $0 [-D] [-l] [-m mode] src dst" 1>&2 + echo "usage: $0 [ -D ] [ -l ] [ -m mode ] [ -O owner:group ] src dst" 1>&2 exit 1 } mkdirp=false symlink=false mode=0755 +og= -while getopts Dlm: name ; do +while getopts Dlm:O: name ; do case "$name" in D) mkdirp=true ;; l) symlink=true ;; m) mode=$OPTARG ;; + O) og=$OPTARG ;; ?) usage ;; esac done @@ -46,7 +48,10 @@ if $symlink ; then ln -s "$src" "$tmp" else cat < "$1" > "$tmp" - chmod "$mode" "$tmp" + if test -n "$og" ; then + chown -- "$og" "$tmp" + fi + chmod -- "$mode" "$tmp" fi mv -f "$tmp" "$dst" |