87 lines
1.9 KiB
C
87 lines
1.9 KiB
C
|
/* 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;
|
||
|
}
|