mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-03-26 06:44:51 +02:00
(translate_040_to_space) [MOUNTED_GETMNTENT1]: New function.
(read_filesystem_list) [MOUNTED_GETMNTENT1]: Use it.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* mountlist.c -- return a list of mounted filesystems
|
||||
Copyright (C) 1991, 1992, 1997, 1998 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 1992, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
@@ -151,6 +151,46 @@ xatoi (char *cp)
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Convert, in place, each unambiguous `\040' sequence in the NUL-terminated
|
||||
string, STR, to a single space. `unambiguous' means that it must not be
|
||||
immediately preceded by an odd number of backslash characters. */
|
||||
|
||||
static void
|
||||
translate_040_to_space (char *str)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
char *p;
|
||||
char *backslash = strstr (str, "\\040");
|
||||
unsigned int backslash_count = 0;
|
||||
|
||||
if (backslash == NULL)
|
||||
break;
|
||||
|
||||
/* Count preceding backslashes, going no further than str. */
|
||||
for (p = backslash - 1; p >= str && *p == '\\'; p--)
|
||||
++backslash_count;
|
||||
|
||||
if (backslash_count % 2 == 1)
|
||||
{
|
||||
/* The backslash is escaped; advance past the 040 and
|
||||
continue searching. */
|
||||
str = backslash + 4;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* We found an unambiguous `\040'. Replace it with a space
|
||||
and move everything following it back by 3 bytes.
|
||||
The source and destination regions may overlap, so we have
|
||||
to use memmove. */
|
||||
*backslash = ' ';
|
||||
str = backslash + 1;
|
||||
/* Be sure to copy the trailing NUL byte, too. */
|
||||
memmove (str, backslash + 4, strlen (backslash + 4) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MOUNTED_GETMNTENT1. */
|
||||
|
||||
#if MOUNTED_GETMNTINFO
|
||||
@@ -349,6 +389,11 @@ read_filesystem_list (int need_fs_type)
|
||||
else
|
||||
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
|
||||
|
||||
/* FIXME: do the conversion only if we're using some version of
|
||||
GNU libc -- which one? */
|
||||
/* Convert each `\040' string to a space. */
|
||||
translate_040_to_space (me->me_mountdir);
|
||||
|
||||
/* Add to the linked list. */
|
||||
*mtail = me;
|
||||
mtail = &me->me_next;
|
||||
@@ -672,3 +717,18 @@ read_filesystem_list (int need_fs_type)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
char *p = xstrdup (argv[i]);
|
||||
translate_040_to_space (p);
|
||||
printf ("%s: %s\n", argv[i], p);
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user