1
0
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:
Jim Meyering
1999-07-20 18:41:58 +00:00
parent c7582bc4ab
commit bca7546dcd

View File

@@ -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