File sash-plus-patches-3.7.diff of Package sash
Index: sash-3.7/Makefile
===================================================================
--- sash-3.7.orig/Makefile
+++ sash-3.7/Makefile
@@ -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 @@ MOUNT_TYPE = '"ext3"'
CFLAGS = -Wall -Wmissing-prototypes $(RPM_OPT_FLAGS) \
-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)
Index: sash-3.7/cmds.c
===================================================================
--- sash-3.7.orig/cmds.c
+++ sash-3.7/cmds.c
@@ -24,6 +24,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)
@@ -150,6 +160,28 @@ do_mknod(int argc, const char ** argv)
}
+#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)
{
@@ -1256,4 +1288,62 @@ do_where(int argc, const char ** argv)
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 */
Index: sash-3.7/sash.1
===================================================================
--- sash-3.7.orig/sash.1
+++ sash-3.7/sash.1
@@ -22,11 +22,11 @@ is that many of the standard system comm
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 @@ Change the owner id for the specified li
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 @@ is a numeric value, or one of the specia
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 @@ same names as the srcNames. Renames are
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
Index: sash-3.7/sash.c
===================================================================
--- sash-3.7.orig/sash.c
+++ sash-3.7/sash.c
@@ -18,7 +18,7 @@
#include <linux/major.h>
#include <linux/raid/md_u.h>
-static const char * const version = "3.7";
+static const char * const version = "3.7-fb";
/*
@@ -110,6 +110,14 @@ static const CommandEntry commandEntryTa
"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",
@@ -184,6 +192,14 @@ static const CommandEntry commandEntryTa
"[-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",
@@ -240,6 +256,14 @@ static const CommandEntry commandEntryTa
"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",
@@ -392,6 +416,7 @@ static void childProcess(const char * cm
static void showPrompt(void);
static void usage(void);
static Alias * findAlias(const char * name);
+static void expandVariable(char * name);
/*
@@ -711,6 +736,11 @@ command(const char * cmd)
}
/*
+ * 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.
*/
@@ -1296,4 +1326,29 @@ usage(void)
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 */
Index: sash-3.7/sash.h
===================================================================
--- sash-3.7.orig/sash.h
+++ sash-3.7/sash.h
@@ -111,6 +111,18 @@ extern void do_lsattr(int argc, const ch
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.