aboutsummaryrefslogtreecommitdiffstats
path: root/src/fstab-decode.c
diff options
context:
space:
mode:
authorMiloslav Trmac <mitr@volny.cz>2006-05-08 23:54:06 +0000
committerMiloslav Trmac <mitr@volny.cz>2006-05-08 23:54:06 +0000
commit3bd074fd404b4863d811d0a50e9ef484523c6b57 (patch)
tree9c4ca48303377ab77a8a00d10561ba1e8afbab28 /src/fstab-decode.c
parent0414be84b33e98510feb1d0e281b089ba16b349d (diff)
downloadinitscripts-3bd074fd404b4863d811d0a50e9ef484523c6b57.tar
initscripts-3bd074fd404b4863d811d0a50e9ef484523c6b57.tar.gz
initscripts-3bd074fd404b4863d811d0a50e9ef484523c6b57.tar.bz2
initscripts-3bd074fd404b4863d811d0a50e9ef484523c6b57.tar.xz
initscripts-3bd074fd404b4863d811d0a50e9ef484523c6b57.zip
Fix handling of mount points with white space (#186713):
- src/fstab-decode.c, src/fstab-decode.8: New files. - src/Makefile: Build and install fstab-decode. - initscripts.spec: Add fstab-decode to %files - rc.d/init.d/functions (fstab_decode_str): New function. (__umount_loop, __umount_loopback_loop): Factor out from copy&pasted copies. (action): Fix command quoting. - rc.d/rc.sysinit: Correctly quote and decode mount points. - rc.d/init.d/halt: Use __umount_* and fstab-decode. (action): Rename from runcmd. Fix command quoting. - rc.d/init.d/netfs: Use __umount_*.
Diffstat (limited to 'src/fstab-decode.c')
-rw-r--r--src/fstab-decode.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/fstab-decode.c b/src/fstab-decode.c
new file mode 100644
index 00000000..4a162dfe
--- /dev/null
+++ b/src/fstab-decode.c
@@ -0,0 +1,86 @@
+/* fstab-decode(8).
+
+Copyright (c) 2006 Red Hat, Inc. All rights reserved.
+
+This copyrighted material is made available to anyone wishing to use, modify,
+copy, or redistribute it subject to the terms and conditions of the GNU General
+Public License v.2.
+
+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; if not, write to the Free Software Foundation, Inc., 51 Franklin
+Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Author: Miloslav Trmac <mitr@redhat.com> */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* Decode the fstab-encoded string in place. */
+static void
+decode(char *s)
+{
+ const char *src;
+ char *dest;
+
+ src = s;
+ dest = s;
+ while (*src != '\0') {
+ if (*src != '\\')
+ *dest = *src++;
+ else {
+ static const struct repl {
+ char orig[4];
+ size_t len;
+ char new;
+ } repls[] = {
+#define R(X, Y) { X, sizeof(X) - 1, Y }
+ R("\\", '\\'),
+ R("011", '\t'),
+ R("012", '\n'),
+ R("040", ' '),
+ R("134", '\\')
+#undef R
+ };
+
+ size_t i;
+
+ for (i = 0; i < sizeof (repls) / sizeof (repls[0]);
+ i++) {
+ if (memcmp(src + 1, repls[i].orig,
+ repls[i].len) == 0) {
+ *dest = repls[i].new;
+ src += 1 + repls[i].len;
+ goto found;
+ }
+ }
+ *dest = *src++;
+ found:
+ ;
+ }
+ dest++;
+ }
+ *dest = '\0';
+}
+
+int
+main (int argc, char *argv[])
+{
+ size_t i;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: fstab-decode command [arguments]\n");
+ return EXIT_FAILURE;
+ }
+ for (i = 2; i < (size_t)argc; i++)
+ decode(argv[i]);
+ execvp(argv[1], argv + 1);
+ fprintf(stderr, "fstab-decode: %s: %s\n", argv[1], strerror(errno));
+ return 127;
+}