diff options
Diffstat (limited to 'rvs/wrapper')
-rw-r--r-- | rvs/wrapper/.gitignore | 2 | ||||
-rw-r--r-- | rvs/wrapper/Makefile | 32 | ||||
-rw-r--r-- | rvs/wrapper/Makefile.in | 90 | ||||
-rw-r--r-- | rvs/wrapper/inner.sh | 145 | ||||
-rw-r--r-- | rvs/wrapper/main.mk.in | 66 | ||||
-rw-r--r-- | rvs/wrapper/outer.c | 63 | ||||
-rw-r--r-- | rvs/wrapper/runcom.mk.in | 12 | ||||
-rw-r--r-- | rvs/wrapper/rvs.sh | 165 |
8 files changed, 242 insertions, 333 deletions
diff --git a/rvs/wrapper/.gitignore b/rvs/wrapper/.gitignore new file mode 100644 index 0000000..6141a28 --- /dev/null +++ b/rvs/wrapper/.gitignore @@ -0,0 +1,2 @@ +/outer +/inner
\ No newline at end of file diff --git a/rvs/wrapper/Makefile b/rvs/wrapper/Makefile new file mode 100644 index 0000000..f316cc0 --- /dev/null +++ b/rvs/wrapper/Makefile @@ -0,0 +1,32 @@ +#!/usr/bin/make -f +# Copyright (C) 2009, 2015 Luke Shumaker +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +include $(dir $(lastword $(MAKEFILE_LIST)))/../config.mk +include $(topsrcdir)/common.top.mk + +src_files += Makefile outer.c inner.sh +obj_files += outer inner +install_files += $(bindir)/$(PACKAGE) $(pkglibexecdir)/$(PACKAGE) + +$(objdir)/outer.o: $(topobjdir)/config.h +$(objdir)/inner: $(topobjdir)/config.sh + +$(DESTDIR)$(bindir)/$(PACKAGE) : $(objdir)/outer | $(DESTDIR)$(bindir) + $(INSTALL_PROGRAM) $< $@ +$(DESTDIR)$(pkglibexecdir)/$(PACKAGE) : $(objdir)/inner | $(DESTDIR)$(bindir) + $(INSTALL_PROGRAM) $< $@ + +include $(topsrcdir)/common.bottom.mk diff --git a/rvs/wrapper/Makefile.in b/rvs/wrapper/Makefile.in deleted file mode 100644 index cfe9772..0000000 --- a/rvs/wrapper/Makefile.in +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/make -f -#name = Luke's Makefile -#ver = 1.0 -# Copyright (C) 2009 Luke Shumaker -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. -# If not, see <http://www.gnu.org/licenses>. - -# Directories ######################################################## -DESTDIR = @DESTDIR@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -dirs = $(DESTDIR) $(prefix) $(exec_prefix) $(bindir) $(sbindir) $(libexecdir) -srcdir = @srcdir@ -VPATH = $(srcdir) - -# Programs ########################################################### -SHELL = /bin/sh -CC = gcc -INSTALL = install -INSTALL_PROGRAM = $(INSTALL) -INSTALL_DATA = $(INSTALL) -m 644 -MKDIR = $(INSTALL) -d #mkdir -p -RM = rm -f -SED = sed - -include main.mk - -# dist ############################################################### -d = $(name)-$(ver) -.PHONY : dist -dist : $(d).tar.gz - -$(d).tar.gz : $(d) $(addprefix $(d)/,$(filelist)) - tar -czf $@ $< - -$(d) : - $(INSTALL) -m 777 -d $@ - -$(d)/% : $(srcdir)/% $(d) - $(INSTALL) -m 777 -d $(dir $@) - cp $< $@ - -# implicit rules ##################################################### -$(addprefix $(DESTDIR),$(dirs)) : - $(MKDIR) $@ - -% : %.sh - $(SED) 's/@VER@/$(ver)/g' < $< > $@ - -$(DESTDIR)$(bindir)/% : % $(DESTDIR)$(bindir) - $(INSTALL_PROGRAM) $< $@ - -.PHONY : dist Makefiles - -csources = $(filter %.c,$(filelist)) -Makefiles : $(shell find '$(srcdir)' -type f -name Makefile.in) \ - $(shell find '$(srcdir)' -type f -name Makefile.in) \ - $(csources:.c=.d) - -%Makefile %.mk : $(srcdir)/configure - $< @CONFIG@ - -# This is taken straight from the GNU `make' manual. -# That makes it GFDL, which is incompatible with the GPL -# I claim `fair-use' -%.d: %.c - @set -e; rm -f $@; \ - $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ - sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ - rm -f $@.$$$$ - -ifneq ($(shell ls -d $(csources:.c=.d) 2>/dev/null),) - include $(csources:.c=.d) -endif - diff --git a/rvs/wrapper/inner.sh b/rvs/wrapper/inner.sh new file mode 100644 index 0000000..b1dc718 --- /dev/null +++ b/rvs/wrapper/inner.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash +# rvs inner.sh - The main RVS program +# Copyright (C) 2009-2010, 2015 Luke Shumaker +# +# This file is part of rvs. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +set -u + +m4_include(config.sh) + +declare -r varname_REPO="${PACKAGE^^}_REPO" +declare -r varname_EXEC_PATH="${PACKAGE^^}_EXEC_PATH" + +declare -r program_name="$1"; shift + + + +_() { + if type gettext &>/dev/null; then + TEXTDOMAINDIR=$localedir gettext "$pkgtextdomain" "$1"; + else + echo "$1"; + fi +} + +sighandler_exit() { + local signal=$1; shift + echo + error 0 "$@" + trap -- "$signal" + kill -"$signal" "$$" +} + +install_sighandlers() { + set -E + for signal in TERM HUP QUIT; do + trap "signalhandler_exit $signal '%s signal cought. Exiting...'" $signal + done + trap 'signalhandler_exit INT "Aborted by user. Exiting..."' INT + trap 'kill -USR1 "$$"' ERR +} + +# Like GLibC's error(3), but call gettext on the format string +error() { + >&2 printf "%s: $(_ "$2")\n" "$RVS" "${@:3}" + [[ $1 -eq 0 ]] || exit $1 +} + +_runcmd() { + [[ $# -ge 1 ]] || error 1 'Usage: %s <command> [<args>]' "$program_name" + local cmd=$1 + + local exec_path="${!varname_EXEC_PATH:-$pkglibexecdir}" + + if [ ! -e "$exec_path/$cmd" ] || [ "$cmd" = "${PACKAGE}" ]; then + error 127 '%s: Not a %s command' "$cmd" "$PACKAGE" + else + trap '[ -z "${TMPDIR:-}" ] || rm -rf -- "$TMPDIR"' EXIT + export TMPDIR="$(mktemp -dt "${PACKAGE}.XXXXXXXXXX")" + + repo="$(_repo)" + export "$varname_REPO=$repo" + + set -o pipefail + + if [ -f "$exec_path/$cmd" ]; then + "$exec_path/$cmd" "$@" | tee -- "$TMPDIR/$cmd" + elif [ -d "$exec_path/$cmd" ]; then + mkdir -p -- "$TMPDIR/$cmd" + local file + for file in "$exec_path/$command"/*; do + "$file" "$@" | tee -- "$TMPDIR/$command/${file##*/}" || + error 127 'Aborting: error encountered while running: %s' "$file" + done + else + error 127 '%s: Could not execute' "$exec_path/$cmd" + fi + fi +} + +_repo() { + [[ $# -ne 0 ]] || error 1 'Usage: %s repo' "$program_name" + if [ -z "${!varname_REPO:-}" ]; then # we aren't getting a value from then env + local repo=".${PACKAGE,,}" + + # [------can ascend-----] && ! [-not found repo--] + while [ "$PWD" != "$OLDPWD" ] && ! [ -d "$PWD/$repo" ]; do + cd .. + done + + if [ -d "$PWD/$repo" ]; then + # we found a repository + printf '%s\n' "$PWD/$repo" + else + # we didn't find a repository + error 128 "No %s repository found" "$PACKAGE" + fi + else + printf '%s\n' "${!varname_REPO}" + fi +} + +_init() { + [[ $# -gt 1 ]] || error 1 'Usage: %s init [directory]' "$program_name" + local dir="${1:-$PWD}" + mkdir -p -- "$dir" + cd "$dir" + repo="$(_repo 2> /dev/null)" || true + if [ -n "${repo:-}" ]; then + _error 129 "Repository already exists at \`%s'" "$repo" + fi + export "$varname_REPO=$PWD/.${PACKAGE,,}" + mkdir "${!varname_REPO}" + _runcmd init "$dir" +} + +main() { + install_sighandlers + [[ $# -ge 1 ]] || error 'No command specified';; + export "${PACKAGE^^}=$program_name" + + local cmd=$1; shift + case "$cmd" in + repo) _repo "$@";; + init) _init "$@";; + *) _runcmd "$cmd" "$@";; + esac +} + +main "$@" + +# Copy/Paste Virus 1.3c Please copy and paste this text anywhere. Track +# its progress by searching for this MD5#f7eac285ebfe21c4587bfebb9582f90d diff --git a/rvs/wrapper/main.mk.in b/rvs/wrapper/main.mk.in deleted file mode 100644 index 0ba00d7..0000000 --- a/rvs/wrapper/main.mk.in +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/make -f -name = @name@ -ver = 0.9 -# Copyright (C) 2009 Luke Shumaker -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. -# If not, see <http://www.gnu.org/licenses>. - -sysconfdir = @sysconfdir@ -BINDIR = @BINDIR@ -TMPDIR = @TMPDIR@ -LIBDIR = @LIBDIR@ -ETCDIR = @ETCDIR@ -dirs += $(sysconfdir) $(BINDIR) $(TMPDIR) $(LIBDIR) $(ETCDIR) - -rvs = @rvs@ -RVS = @RVS@ - -# phony targets #################################################### -.PHONY : all -all : Makefiles rvs -filelist=$(patsubst $(srcdir)/%,%,$(shell find $(srcdir)/* -type f)) - -# most everything ################################################## - -# the installed wrapper -$(RVS) : rvs $(dir $(RVS)) - $(INSTALL_PROGRAM) $< $@ - -# build the wrapper -b := @ -rvs : rvs.sh - $(INSTALL_PROGRAM) $< $@ - $(SED) -i \ - -e 's/$bSHELL@/$(subst /,\/,$(SHELL))/g' \ - -e 's/$bname@/$(subst /,\/,$(rvs))/g' \ - -e 's/$bBINDIR@/$(subst /,\/,$(BINDIR))/' \ - -e 's/$bTMPDIR@/$(subst /,\/,$(TMPDIR))/' \ - -e 's/$bLIBDIR@/$(subst /,\/,$(LIBDIR))/' \ - -e 's/$bETCDIR@/$(subst /,\/,$(ETCDIR))/' \ - $@ - -# standard targes #################################################### -.PHONY : install uninstall clean distclean -install : $(RVS) - -uninstall : - $(RM) $(RVS) - -clean : - -distclean : clean - $(RM) rvs - $(RM) Makefile *.mk - diff --git a/rvs/wrapper/outer.c b/rvs/wrapper/outer.c new file mode 100644 index 0000000..4bc2d2f --- /dev/null +++ b/rvs/wrapper/outer.c @@ -0,0 +1,63 @@ +/* RVS outer.c - A wrapper for $(bindir) to call the main RVS program + * Copyright (C) 2015 Luke Shumaker + * + * This file is part of rvs. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include <errno.h> /* for errno */ +#include <error.h> /* for error(3) */ +#include <libintl.h> /* for dgettext(3) */ +#include <locale.h> /* for bindtextdomain(3) and textdomain(3) */ +#include <stdio.h> /* for asprintf(3) */ +#include <stdlib.h> /* for getenv(3), calloc(3) */ +#include <string.h> /* for mempcy(3) */ +#include <unistd.h> /* for execv(3) */ + +#include "config.h" +#define _ gettext + +#define EXIT_FAILURE_OOM 126 +#define EXIT_FAILURE_EXEC 127 + +int +main(int argc, char *argv[]) { + bindtextdomain(pkgtextdomain, localedir); + textdomain(pkgtextdomain); + + unsetenv("ENV"); + unsetenv("BASH_ENV"); + + const char *varname = PACKAGE_UPPER "_EXEC_PATH"; + + char *exec_path = getenv(varname); + if (!exec_path) + exec_path = pkglibexecdir; + + char *exec_file = NULL; + if (asprintf(&exec_file, "%s/" PACKAGE, exec_path) < 0) + error(EXIT_FAILURE_OOM, errno, + _("Could not allocate memory for string")); + + char **args = calloc(argc+2, sizeof(char*)); + if (!args) + error(EXIT_FAILURE_OOM, errno, + _("Could not allocate cleared memory")); + args[0] = exec_file; + memcpy(&args[1], argv, sizeof(char*) * argc); + + execv(exec_file, args); + error(EXIT_FAILURE_EXEC, errno, _("Could not execute: %s"), exec_file); + return EXIT_FAILURE_EXEC; +} diff --git a/rvs/wrapper/runcom.mk.in b/rvs/wrapper/runcom.mk.in deleted file mode 100644 index 55782f0..0000000 --- a/rvs/wrapper/runcom.mk.in +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/make -f - -FIND = $(patsubst $(1)/%,%,$(wildcard $(2)/*)) - -COMMANDS = $(call FIND,$(BINDIR),$(BINDIR)) -$(COMMANDS): % : $(call FIND,$(BINDIR),$(BINDIR)/%) - -% :: - "$(BINDIR)/$@" $(ARGS) - -include $(wildcard $(DEPDIR)/*) - diff --git a/rvs/wrapper/rvs.sh b/rvs/wrapper/rvs.sh deleted file mode 100644 index 19a8188..0000000 --- a/rvs/wrapper/rvs.sh +++ /dev/null @@ -1,165 +0,0 @@ -#!/bin/sh -name='@name@' -ver='0.9' -# Copyright (C) 2009-2010 Luke Shumaker -# -# This file is part of rvs. -# -# rvs is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2, or (at your option) any later version. -# -# rvs is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. -# If not, see <http://www.gnu.org/licenses>. - -export RVS="$0" #RVS='@RVS@' - BINDIR='@BINDIR@' - DEPDIR='@DEPDIR@' - baseTMPDIR='@TMPDIR@' -export LIBDIR='@LIBDIR@' -export ETCDIR='@ETCDIR@' - -################################################################################ -# Internal use # -################################################################################ - -# General ############################################################ - -_error() { - echo "$RVS: $1" >> /dev/stderr - exit ${2-1} -} - -# Repository ######################################################### - -_repo() { - if [ -z "$REPO" ]; then # we aren't getting a value from then env - repo=".$name" - owd="`pwd`" # old working directory - - # [----can ascend-----] && [-haven't found repo-] - while [ "$pwd" != "`pwd`" ] && [ ! -e "`pwd`/$repo" ]; do - pwd=`pwd` - cd .. - done - - if [ -e "`pwd`/$repo" ]; then - # we found a repository - echo "`pwd`/$repo" - else - # we didn't find a repository - _error "no $name repository found" - fi - cd "$owd" - else - echo "$REPO" - fi -} - -# Modules ############################################################ - -_runcom() { - # exit states - # 0 - fine - # 1 - could not find command - # 2 - could not run command - usage="usage: $RVS runcom COMMAND" - command=${1?"$usage"}; shift - - if [ ! -e "$BINDIR/$command" ]; then - exit 1 - else - mkdir -p "$baseTMPDIR" - export TMPDIR="`mktemp -d --tmpdir="$baseTMPDIR"`" - - if [ -z "$RVS_LEVEL" ]; then - export RVS_LEVEL=0; - else - export RVS_LEVEL=`expr $RVS_LEVEL + 1` - fi - - if [ -f "$BINDIR/$command" ]; then - exec "$BINDIR/$command" $@ | tee "$TMPDIR/$command" - elif [ -d "$BINDIR/$command" ]; then - mkdir -p "$TMPDIR/$command" - for file in "$BINDIR/$command"/*; do - id="`basename "$file" | sed 's/^[0-9]*-//'`" - "$file" $@ | tee "$TMPDIR/$command/$id" - done - else - exit 2 - fi - rm -rf "$TMPDIR" - fi -} - -_nextpriority() { - usage="usage: $RVS nextpriority COMMAND" - command=${1?"$usage"} - for file in "$BINDIR/$command"/*; do - echo "$file" | sed 's/^\([0-9]*\)-.*/\1/' - done | sort -n | tail -n1 | xargs expr 1 + -} - -################################################################################ -# Builtin commands # -################################################################################ - -_init() { - # exit states: - # 0 - fine - # 1 - repo already exists - # 2 - error running init commands - REPO="`_repo 2> /dev/null`" - if [ -z "$REPO" ]; then - export REPO="`pwd`/.$name" - install -d "$REPO" - _runcom init - case "$?" in - 0) exit 0;; - 1) exit 0;; - 2) _error 'error running init scripts' 2;; - esac - else - _error "repository already exists at \`$REPO'" 1 - fi -} - -################################################################################ -# Main # -################################################################################ - -# START OPTION HANDLING # -com=$1; -# END OPTION HANDLING # -case "$com" in - '') _error 'no command specified';; - repo) _repo; exit $?;; - 'init' ) shift; _init $@; exit $?;; - 'install') shift; _install $@; exit $?;; - 'uninstall') shift; _uninstall $@; exit $?;; - *) - REPO=`_repo` - if [ "$?" = '0' ]; then - export REPO - _runcom $@ - case "$?" in - 0) exit 0;; - 1) _error "could not find command \`$1'" 1;; - 2) _error "could not run command \`$1'" 2;; - esac - else - exit 1 - fi - :;; -esac - -# Copy/Paste Virus 1.3c Please copy and paste this text anywhere. Track -# its progress by searching for this MD5#f7eac285ebfe21c4587bfebb9582f90d - |