aboutsummaryrefslogtreecommitdiff
path: root/system/sash
diff options
context:
space:
mode:
Diffstat (limited to 'system/sash')
-rw-r--r--system/sash/README22
-rw-r--r--system/sash/doinst.sh7
-rw-r--r--system/sash/sash-3.7-CFLAGS_i486.patch12
-rw-r--r--system/sash/sash-3.7-CFLAGS_i686.patch12
-rw-r--r--system/sash/sash-3.7-DESTDIR.patch13
-rw-r--r--system/sash/sash-3.7-cmd_chattr.c.patch12
-rw-r--r--system/sash/sash-plus-patches-3.7342
-rw-r--r--system/sash/sash.SlackBuild75
-rw-r--r--system/sash/sash.info8
-rw-r--r--system/sash/slack-desc19
10 files changed, 522 insertions, 0 deletions
diff --git a/system/sash/README b/system/sash/README
new file mode 100644
index 000000000000..27c4867a3546
--- /dev/null
+++ b/system/sash/README
@@ -0,0 +1,22 @@
+SASH - a stand-alone shell with many built-in commands
+
+The sash program is a stand-alone shell which is useful for recovering
+from certain types of system failures. In particular, it was created
+in order to cope with the problem of missing shared libraries or important
+executables.
+
+Sash can execute external programs, as in any shell. There are no
+restrictions on these commands, as the standard shell is used to execute
+them if there are any non-wildcard meta-characters in the command.
+More importantly, however, is that many of the standard system commands
+are built-in to sash.
+
+This script applies the 'sash-plus-patches' command collection, which
+adds the following commands: 'chroot' 'pivot_root' and 'losetup'.
+
+These functions actually provide interfaces to the respective Linux system
+calls. They are specificly useful when sash is used as a shell in "initial
+ramdisk" (initrd) environments.
+
+In addition, a simple shell variable expansion support has been added, e.g.
+the variable "$(VAR)" is replaced by the content of the variable "VAR".
diff --git a/system/sash/doinst.sh b/system/sash/doinst.sh
new file mode 100644
index 000000000000..e5dccd90cc02
--- /dev/null
+++ b/system/sash/doinst.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Add sash to the shells if not there
+if ! grep -q "/sash$" etc/shells ; then
+ echo "/bin/sash" >> etc/shells
+fi
+
diff --git a/system/sash/sash-3.7-CFLAGS_i486.patch b/system/sash/sash-3.7-CFLAGS_i486.patch
new file mode 100644
index 000000000000..2d4b14ee3566
--- /dev/null
+++ b/system/sash/sash-3.7-CFLAGS_i486.patch
@@ -0,0 +1,12 @@
+diff -Nur sash-3.7.orig/Makefile sash-3.7/Makefile
+--- sash-3.7.orig/Makefile 2002-07-21 18:24:47.000000000 -0500
++++ sash-3.7/Makefile 2007-08-22 15:56:15.225837097 -0500
+@@ -14,7 +14,7 @@
+ MOUNT_TYPE = '"ext3"'
+
+
+-CFLAGS = -O3 -Wall -Wmissing-prototypes \
++CFLAGS = -O2 -march=i486 -mtune=i686 -Wall -Wmissing-prototypes \
+ -DHAVE_GZIP=$(HAVE_GZIP) \
+ -DHAVE_LINUX_ATTR=$(HAVE_LINUX_ATTR) \
+ -DHAVE_LINUX_MOUNT=$(HAVE_LINUX_MOUNT) \
diff --git a/system/sash/sash-3.7-CFLAGS_i686.patch b/system/sash/sash-3.7-CFLAGS_i686.patch
new file mode 100644
index 000000000000..423718f372fe
--- /dev/null
+++ b/system/sash/sash-3.7-CFLAGS_i686.patch
@@ -0,0 +1,12 @@
+diff -Nur sash-3.7.orig/Makefile sash-3.7/Makefile
+--- sash-3.7.orig/Makefile 2002-07-21 18:24:47.000000000 -0500
++++ sash-3.7/Makefile 2007-08-22 15:56:15.225837097 -0500
+@@ -14,7 +14,7 @@
+ MOUNT_TYPE = '"ext3"'
+
+
+-CFLAGS = -O3 -Wall -Wmissing-prototypes \
++CFLAGS = -O2 -march=i686 -mtune=i686 -Wall -Wmissing-prototypes \
+ -DHAVE_GZIP=$(HAVE_GZIP) \
+ -DHAVE_LINUX_ATTR=$(HAVE_LINUX_ATTR) \
+ -DHAVE_LINUX_MOUNT=$(HAVE_LINUX_MOUNT) \
diff --git a/system/sash/sash-3.7-DESTDIR.patch b/system/sash/sash-3.7-DESTDIR.patch
new file mode 100644
index 000000000000..ff9b438f2088
--- /dev/null
+++ b/system/sash/sash-3.7-DESTDIR.patch
@@ -0,0 +1,13 @@
+diff -Nur sash-3.7.orig/Makefile sash-3.7/Makefile
+--- sash-3.7.orig/Makefile 2002-07-21 18:24:47.000000000 -0500
++++ sash-3.7/Makefile 2007-08-22 15:53:41.717089132 -0500
+@@ -40,7 +40,7 @@
+ rm -f $(OBJS) sash
+
+ install: sash
+- cp sash $(BINDIR)/sash
+- cp sash.1 $(MANDIR)/sash.1
++ cp sash $(DESTDIR)/$(BINDIR)/sash
++ cp sash.1 $(DESTDIR)/$(MANDIR)/sash.1
+
+ $(OBJS): sash.h
diff --git a/system/sash/sash-3.7-cmd_chattr.c.patch b/system/sash/sash-3.7-cmd_chattr.c.patch
new file mode 100644
index 000000000000..11ee50933813
--- /dev/null
+++ b/system/sash/sash-3.7-cmd_chattr.c.patch
@@ -0,0 +1,12 @@
+diff -Nur sash-3.7.orig/cmd_chattr.c sash-3.7/cmd_chattr.c
+--- sash-3.7.orig/cmd_chattr.c 2002-03-08 01:21:03.000000000 -0600
++++ sash-3.7/cmd_chattr.c 2007-08-22 15:58:52.234784527 -0500
+@@ -12,7 +12,7 @@
+
+ #include <sys/ioctl.h>
+ #include <sys/types.h>
+-#include <linux/ext2_fs.h>
++#include <ext2fs/ext2_fs.h>
+
+ #include "sash.h"
+
diff --git a/system/sash/sash-plus-patches-3.7 b/system/sash/sash-plus-patches-3.7
new file mode 100644
index 000000000000..77d17df90cc7
--- /dev/null
+++ b/system/sash/sash-plus-patches-3.7
@@ -0,0 +1,342 @@
+diff --unified --recursive --new-file sash-3.7/Makefile sash-3.7-fb/Makefile
+--- sash-3.7/Makefile 2002-07-22 01:24:47.000000000 +0200
++++ sash-3.7-fb/Makefile 2004-07-04 10:45:45.000000000 +0200
+@@ -3,12 +3,18 @@
+ #
+ # The HAVE_GZIP definition adds the -gzip and -gunzip commands.
+ # The HAVE_LINUX_ATTR definition adds the -chattr and -lsattr commands.
++# The HAVE_LINUX_CHROOT definition adds the -chroot command.
++# The HAVE_LINUX_PIVOT definition adds the -pivot_root command.
++# The HAVE_LINUX_LOSETUP definition adds the -losetup command.
+ # The HAVE_LINUX_MOUNT definition makes -mount and -umount work on Linux.
+ # The HAVE_BSD_MOUNT definition makes -mount and -umount work on BSD.
+ # The MOUNT_TYPE definition sets the default file system type for -mount.
+ #
+ HAVE_GZIP = 1
+ HAVE_LINUX_ATTR = 1
++HAVE_LINUX_CHROOT = 1
++HAVE_LINUX_LOSETUP = 1
++HAVE_LINUX_PIVOT = 1
+ HAVE_LINUX_MOUNT = 1
+ HAVE_BSD_MOUNT = 0
+ MOUNT_TYPE = '"ext3"'
+@@ -17,6 +23,9 @@
+ CFLAGS = -O3 -Wall -Wmissing-prototypes \
+ -DHAVE_GZIP=$(HAVE_GZIP) \
+ -DHAVE_LINUX_ATTR=$(HAVE_LINUX_ATTR) \
++ -DHAVE_LINUX_CHROOT=$(HAVE_LINUX_CHROOT) \
++ -DHAVE_LINUX_LOSETUP=$(HAVE_LINUX_LOSETUP) \
++ -DHAVE_LINUX_PIVOT=$(HAVE_LINUX_PIVOT) \
+ -DHAVE_LINUX_MOUNT=$(HAVE_LINUX_MOUNT) \
+ -DHAVE_BSD_MOUNT=$(HAVE_BSD_MOUNT) \
+ -DMOUNT_TYPE=$(MOUNT_TYPE)
+diff --unified --recursive --new-file sash-3.7/cmds.c sash-3.7-fb/cmds.c
+--- sash-3.7/cmds.c 2002-07-22 00:28:19.000000000 +0200
++++ sash-3.7-fb/cmds.c 2004-07-04 10:45:45.000000000 +0200
+@@ -21,6 +21,16 @@
+ #include <linux/fs.h>
+ #endif
+
++/* Need to tell loop.h what the actual dev_t type is. */
++#undef dev_t
++#if defined(__alpha) || (defined(__sparc__) && defined(__arch64__))
++#define dev_t unsigned int
++#else
++#define dev_t unsigned short
++#endif
++#include <linux/loop.h>
++#undef dev_t
++#define dev_t dev_t
+
+ void
+ do_echo(int argc, const char ** argv)
+@@ -147,6 +157,28 @@
+ }
+
+
++#if HAVE_LINUX_PIVOT
++
++void
++do_pivot_root(int argc, const char ** argv)
++{
++ if (pivot_root(argv[1], argv[2]) < 0)
++ perror("");
++}
++
++#endif
++
++#if HAVE_LINUX_CHROOT
++
++void
++do_chroot(int argc, const char ** argv)
++{
++ if (chroot(argv[1]) < 0)
++ perror("");
++}
++
++#endif
++
+ void
+ do_rmdir(int argc, const char ** argv)
+ {
+@@ -1253,4 +1285,62 @@
+ printf("Program \"%s\" not found in PATH\n", program);
+ }
+
++#if HAVE_LINUX_LOSETUP
++
++void
++do_losetup(int argc, const char ** argv)
++{
++ int loopfd;
++ int targfd;
++ struct loop_info loopInfo;
++
++ if (!strcmp(argv[1], "-d")) {
++ loopfd = open(argv[2], O_RDWR);
++ if (loopfd < 0) {
++ fprintf(stderr, "Error opening %s: %s\n", argv[2],
++ strerror(errno));
++ return;
++ }
++
++ if (ioctl(loopfd, LOOP_CLR_FD, 0)) {
++ fprintf(stderr, "Error unassociating device: %s\n",
++ strerror(errno));
++ return;
++ }
++ }
++
++ loopfd = open(argv[1], O_RDWR);
++ if (loopfd < 0) {
++ fprintf(stderr, "Error opening %s: %s\n", argv[1],
++ strerror(errno));
++ return;
++ }
++
++ targfd = open(argv[2], O_RDWR);
++ if (targfd < 0) {
++ fprintf(stderr, "Error opening %s: %s\n", argv[2],
++ strerror(errno));
++ return;
++ }
++
++ if (ioctl(loopfd, LOOP_SET_FD, targfd)) {
++ fprintf(stderr, "Error setting up loopback device: %s\n",
++ strerror(errno));
++ return;
++ }
++
++ memset(&loopInfo, 0, sizeof(loopInfo));
++ strcpy(loopInfo.lo_name, argv[2]);
++
++ if (ioctl(loopfd, LOOP_SET_STATUS, &loopInfo)) {
++ fprintf(stderr, "Error setting up loopback device: %s\n",
++ strerror(errno));
++ return;
++ }
++
++ return;
++}
++
++#endif
++
+ /* END CODE */
+diff --unified --recursive --new-file sash-3.7/sash.1 sash-3.7-fb/sash.1
+--- sash-3.7/sash.1 2004-01-14 06:04:50.000000000 +0100
++++ sash-3.7-fb/sash.1 2004-07-04 10:45:45.000000000 +0200
+@@ -22,11 +22,11 @@
+ These built-in commands are:
+ .PP
+ .nf
+- -ar, -chattr, -chgrp, -chmod, -chown, -cmp, -cp,
+- -dd, -echo, -ed, -grep, -file, -find, -gunzip,
+- -gzip, -kill, -ln, -ls, -lsattr, -mkdir, -mknod,
+- -more, -mount, -mv, -printenv, -pwd, -rm, -rmdir,
+- -sum, -sync, -tar, -touch, -umount, -where
++ -ar, -chattr, -chgrp, -chmod, -chown, -chroot, -cmp,
++ -cp, -dd, -echo, -ed, -grep, -file, -find, -gunzip,
++ -gzip, -kill, -losetup, -ln, -ls, -lsattr, -mkdir,
++ -mknod, -more, -mount, -mv, -pivot_root, -printenv, -pwd,
++ -rm, -rmdir, -sum, -sync, -tar, -touch, -umount, -where
+ .fi
+ .PP
+ These commands are generally similar to the standard programs with similar
+@@ -138,6 +138,13 @@
+ can
+ either be a user name, or a decimal value.
+ .TP
++.B -chroot path
++Changes the root directory to that specified in
++.I path.
++This directory
++will be used for path names beginning with /. The root directory is
++inherited by all children of the current process.
++.TP
+ .B -cmp fileName1 fileName2
+ Determines whether or not the specified file names have identical data.
+ This says that the files are links to each other, are different sizes,
+@@ -312,6 +319,20 @@
+ QUIT, KILL, TERM, STOP, CONT, USR1 or USR2.
+ If no signal is specified then SIGTERM is used.
+ .TP
++.B -losetup [-d] loopDev [file]
++Associates loopback devices with files on the system. If
++.I -d
++is not given,
++the loopback device
++.I loopDev
++is associated with
++.I file.
++If
++.I -d
++is given,
++.I loopDev
++is unassociated with the file it's currently configured for.
++.TP
+ .B -ln [-s] srcName ... destName
+ Links one or more files from the
+ .I srcName
+@@ -388,6 +409,13 @@
+ this fails because of the files being on different filesystems,
+ then copies and deletes are done instead.
+ .TP
++.B -pivot_root newRoot putOld
++Moves the root file system of the current process to the directory
++.I putOld
++and makes
++.I newRoot
++the new root file system of the current process.
++.TP
+ .B -printenv [name]
+ If
+ .I name
+diff --unified --recursive --new-file sash-3.7/sash.c sash-3.7-fb/sash.c
+--- sash-3.7/sash.c 2004-01-14 06:08:03.000000000 +0100
++++ sash-3.7-fb/sash.c 2004-07-04 10:45:45.000000000 +0200
+@@ -15,7 +15,7 @@
+ #include "sash.h"
+
+
+-static const char * const version = "3.7";
++static const char * const version = "3.7-fb";
+
+
+ /*
+@@ -107,6 +107,14 @@
+ "srcName ... destName"
+ },
+
++#ifdef HAVE_LINUX_CHROOT
++ {
++ "-chroot", do_chroot, 2, 2,
++ "change root file system",
++ "new_root_dir"
++ },
++#endif
++
+ {
+ "-dd", do_dd, 3, INFINITE_ARGS,
+ "Copy data between two files",
+@@ -181,6 +189,14 @@
+ "[-sig] pid ..."
+ },
+
++#ifdef HAVE_LINUX_LOSETUP
++ {
++ "-losetup", do_losetup, 3, 3,
++ "Associate a loopback device with a file",
++ "[-d] device\n -losetup device filename"
++ },
++#endif
++
+ {
+ "-ln", do_ln, 3, INFINITE_ARGS,
+ "Link one fileName to another",
+@@ -237,6 +253,14 @@
+ "srcName ... destName"
+ },
+
++#ifdef HAVE_LINUX_PIVOT
++ {
++ "-pivot_root", do_pivot_root, 3, 3,
++ "pivot the root file system",
++ "new_dir old_dir"
++ },
++#endif
++
+ {
+ "-printenv", do_printenv, 1, 2,
+ "Print environment variables",
+@@ -383,6 +407,7 @@
+ static void showPrompt(void);
+ static void usage(void);
+ static Alias * findAlias(const char * name);
++static void expandVariable(char * name);
+
+
+ /*
+@@ -702,6 +727,11 @@
+ }
+
+ /*
++ * Expand simple environment variables
++ */
++ while (strstr(cmd, "$(")) expandVariable((char *)cmd);
++
++ /*
+ * Now look for the command in the builtin table, and execute
+ * the command if found.
+ */
+@@ -1275,4 +1305,29 @@
+ exit(1);
+ }
+
++/*
++ * Expand one environment variable: Syntax $(VAR)
++ */
++static void
++expandVariable(char * cmd)
++{
++ char tmp[CMD_LEN];
++ char *cp;
++ char *ep;
++
++ strcpy(tmp, cmd);
++ cp = strstr(tmp, "$(");
++ if (cp) {
++ *cp++ = '\0';
++ strcpy(cmd, tmp);
++ ep = ++cp;
++ while (*ep && (*ep != ')')) ep++;
++ if (*ep == ')') *ep++ = '\0';
++ cp = getenv(cp);
++ if (cp) strcat(cmd, cp);
++ strcat(cmd, ep);
++ }
++ return;
++}
++
+ /* END CODE */
+diff --unified --recursive --new-file sash-3.7/sash.h sash-3.7-fb/sash.h
+--- sash-3.7/sash.h 2002-07-22 00:05:17.000000000 +0200
++++ sash-3.7-fb/sash.h 2004-07-04 10:45:45.000000000 +0200
+@@ -110,6 +110,18 @@
+ extern void do_chattr(int argc, const char ** argv);
+ #endif
+
++#if HAVE_LINUX_CHROOT
++extern void do_chroot(int argc, const char ** argv);
++#endif
++
++#if HAVE_LINUX_LOSETUP
++extern void do_losetup(int argc, const char ** argv);
++#endif
++
++#if HAVE_LINUX_PIVOT
++extern void do_pivot_root(int argc, const char ** argv);
++extern int pivot_root(const char *new_root, const char *put_old);
++#endif
+
+ /*
+ * Global utility routines.
diff --git a/system/sash/sash.SlackBuild b/system/sash/sash.SlackBuild
new file mode 100644
index 000000000000..64acbb690d60
--- /dev/null
+++ b/system/sash/sash.SlackBuild
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+# Slackware build script for the stand alone shell (sash)
+
+# Written by Menno E. Duursma <druiloor@zonnet.nl>
+# Modified by Robby Workman of the SlackBuilds.org project
+
+# Exit on most errors
+set -e
+
+PRGNAM=sash
+VERSION=3.7
+ARCH=${ARCH:-i486}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+CWD=$(pwd)
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar -xzvf $CWD/$PRGNAM-$VERSION.tar.gz
+cd $PRGNAM-$VERSION
+chown -R root:root .
+chmod -R u+w,go+r-w,a-s .
+
+# The 'sash-plus-patches' patch adds support for _very_ usefull features
+# like env var expention and the 'chroot' command:
+# http://www.baiti.net/sash/
+patch -p1 --verbose < $CWD/sash-plus-patches-3.7
+
+# Apply the appropriate CFLAGS to the Makefile
+if [ "$ARCH" = "i486" ]; then
+ patch -p1 --verbose < $CWD/sash-3.7-CFLAGS_i486.patch
+elif [ "$ARCH" = "i686" ]; then
+ patch -p1 --verbose < $CWD/sash-3.7-CFLAGS_i686.patch
+fi
+
+# Let's make this thing support DESTDIR
+patch -p1 --verbose < $CWD/sash-3.7-DESTDIR.patch
+
+# Fix an include line in cmd_chattr.c
+patch -p1 --verbose < $CWD/sash-3.7-cmd_chattr.c.patch
+
+# Create target dirs
+mkdir -p $PKG/bin
+mkdir -p $PKG/usr/man/man1
+
+# Compile the application and install it into the $PKG directory
+make
+make install DESTDIR=$PKG
+
+( cd $PKG
+ find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
+ find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
+)
+
+( cd $PKG/usr/man
+ find . -type f -exec gzip -9 {} \;
+ for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done
+)
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a CHANGES README $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.tgz
diff --git a/system/sash/sash.info b/system/sash/sash.info
new file mode 100644
index 000000000000..92927e796e8d
--- /dev/null
+++ b/system/sash/sash.info
@@ -0,0 +1,8 @@
+PRGNAM="sash"
+VERSION="3.7"
+HOMEPAGE="http://members.canb.auug.org.au/~dbell/programs/"
+DOWNLOAD="http://members.canb.auug.org.au/~dbell/programs/sash-3.7.tar.gz"
+MD5SUM="ee7c7ed5aad76599974d016a6f201ef4"
+MAINTAINER="Menno E. Duursma"
+EMAIL="druiloor@zonnet.nl"
+APPROVED="rworkman"
diff --git a/system/sash/slack-desc b/system/sash/slack-desc
new file mode 100644
index 000000000000..f379e97bc4ff
--- /dev/null
+++ b/system/sash/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description. Line
+# up the first '|' above the ':' following the base package name, and the '|'
+# on the right side marks the last column you can put a character in. You must
+# make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':'.
+
+ |-----handy-ruler------------------------------------------------------|
+sash: sash (Stand Alone SHell)
+sash:
+sash: stand-alone shell is primarly useful for recovering from
+sash: (certain types of) system failures. However (and more
+sash: importantly), it can execute external programs, as a lot
+sash: of standard system commands are built into it.
+sash:
+sash: SASH was written by David Bell
+sash:
+sash:
+sash: