diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | misc/mntent_r.c | 8 | ||||
-rw-r--r-- | misc/tst-mntent.c | 59 |
3 files changed, 62 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index ad83227cde..b9c5c23ab0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * misc/mntent_r.c: Allow spaces and tabs in entry names by encoding these characters. + * misc/tst-mntent.c: Add test case for addmntent and getmntent. * string/bits/string2.h: Fix aliasing problems. * sysdeps/i386/i486/bits/string.h: Likewise. diff --git a/misc/mntent_r.c b/misc/mntent_r.c index 43cb3f732a..6d46abbd95 100644 --- a/misc/mntent_r.c +++ b/misc/mntent_r.c @@ -162,14 +162,18 @@ weak_alias (__getmntent_r, getmntent_r) while (*rp != '\0') \ if (*rp == ' ' || *rp == '\t' || *rp == '\\') \ break; \ + else \ + ++rp; \ \ if (*rp != '\0') \ { \ /* In the worst case the length of the string can increase to \ founr times the current length. */ \ - char *wp = (char *) alloca (strlen (name) * 4 + 1); \ + char *wp; \ \ rp = name; \ + name = wp = (char *) alloca (strlen (name) * 4 + 1); \ + \ do \ if (*rp == ' ') \ { \ @@ -193,8 +197,6 @@ weak_alias (__getmntent_r, getmntent_r) else \ *wp++ = *rp; \ while (*rp++ != '\0'); \ - \ - name = wp; \ } \ } while (0) diff --git a/misc/tst-mntent.c b/misc/tst-mntent.c index d6f374385f..ae967670f9 100644 --- a/misc/tst-mntent.c +++ b/misc/tst-mntent.c @@ -1,4 +1,5 @@ -/* Test case by Horst von Brand <vonbrand@sleipnir.valparaiso.cl>. */ +/* Test case by Horst von Brand <vonbrand@sleipnir.valparaiso.cl> + and Ulrich Drepper <drepper@cygnus.com>. */ #include <mntent.h> #include <stdio.h> #include <string.h> @@ -10,13 +11,15 @@ main (int argc, char *argv[]) int result = 0; struct mntent mef; struct mntent *mnt = &mef; + char *name; + FILE *fp; mef.mnt_fsname = strdupa ("/dev/hda1"); - mef.mnt_dir = strdupa ("/"); + mef.mnt_dir = strdupa ("/some dir"); mef.mnt_type = strdupa ("ext2"); mef.mnt_opts = strdupa ("defaults"); mef.mnt_freq = 1; - mef.mnt_passno = 1; + mef.mnt_passno = 2; if (hasmntopt (mnt, "defaults")) printf ("Found!\n"); @@ -26,5 +29,55 @@ main (int argc, char *argv[]) result = 1; } + name = tmpnam (NULL); + fp = fopen (name, "w+"); + if (fp == NULL) + { + printf ("Cannot open temporary file: %m\n"); + result = 1; + } + else + { + char buf[1024]; + + /* Write the name entry. */ + addmntent (fp, &mef); + + /* Prepare for reading. */ + rewind (fp); + + /* First, read it raw. */ + if (fgets (buf, sizeof (buf), fp) == NULL) + { + printf ("Cannot read temporary file: %m"); + result = 1; + } + else + if (strcmp (buf, "/dev/hda1 /some\\040dir ext2 defaults 1 2\n") != 0) + { + puts ("Raw file data not correct"); + result = 1; + } + + /* Prepare for reading, part II. */ + rewind (fp); + + /* Now read it cooked. */ + mnt = getmntent (fp); + + if (strcmp (mnt->mnt_fsname, "/dev/hda1") != 0 + || strcmp (mnt->mnt_dir, "/some dir") != 0 + || strcmp (mnt->mnt_type, "ext2") != 0 + || strcmp (mnt->mnt_opts, "defaults") != 0 + || mnt->mnt_freq != 1 + || mnt->mnt_passno != 2) + { + puts ("Error while reading written entry back in"); + result = 1; + } + + remove (name); + } + return result; } |