1/* Test mntent interface with escaped sequences.
2 Copyright (C) 2020-2022 Free Software Foundation, Inc.
3
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20#include <mntent.h>
21#include <stdio.h>
22#include <string.h>
23#include <support/check.h>
24
25struct const_mntent
26{
27 const char *mnt_fsname;
28 const char *mnt_dir;
29 const char *mnt_type;
30 const char *mnt_opts;
31 int mnt_freq;
32 int mnt_passno;
33 const char *expected;
34};
35
36struct const_mntent tests[] =
37{
38 {"/dev/hda1", "/some dir", "ext2", "defaults", 1, 2,
39 "/dev/hda1 /some\\040dir ext2 defaults 1 2\n"},
40 {"device name", "/some dir", "tmpfs", "defaults", 1, 2,
41 "device\\040name /some\\040dir tmpfs defaults 1 2\n"},
42 {" ", "/some dir", "tmpfs", "defaults", 1, 2,
43 "\\040 /some\\040dir tmpfs defaults 1 2\n"},
44 {"\t", "/some dir", "tmpfs", "defaults", 1, 2,
45 "\\011 /some\\040dir tmpfs defaults 1 2\n"},
46 {"\\", "/some dir", "tmpfs", "defaults", 1, 2,
47 "\\134 /some\\040dir tmpfs defaults 1 2\n"},
48};
49
50static int
51do_test (void)
52{
53 for (int i = 0; i < sizeof (tests) / sizeof (struct const_mntent); i++)
54 {
55 char buf[128];
56 struct mntent *ret, curtest;
57 FILE *fp = fmemopen (buf, sizeof (buf), "w+");
58
59 if (fp == NULL)
60 {
61 printf (format: "Failed to open file\n");
62 return 1;
63 }
64
65 curtest.mnt_fsname = strdupa (tests[i].mnt_fsname);
66 curtest.mnt_dir = strdupa (tests[i].mnt_dir);
67 curtest.mnt_type = strdupa (tests[i].mnt_type);
68 curtest.mnt_opts = strdupa (tests[i].mnt_opts);
69 curtest.mnt_freq = tests[i].mnt_freq;
70 curtest.mnt_passno = tests[i].mnt_passno;
71
72 if (addmntent (stream: fp, mnt: &curtest) != 0)
73 {
74 support_record_failure ();
75 continue;
76 }
77
78 TEST_COMPARE_STRING (buf, tests[i].expected);
79
80 rewind (fp);
81 ret = getmntent (stream: fp);
82 if (ret == NULL)
83 {
84 support_record_failure ();
85 continue;
86 }
87
88 TEST_COMPARE_STRING(tests[i].mnt_fsname, ret->mnt_fsname);
89 TEST_COMPARE_STRING(tests[i].mnt_dir, ret->mnt_dir);
90 TEST_COMPARE_STRING(tests[i].mnt_type, ret->mnt_type);
91 TEST_COMPARE_STRING(tests[i].mnt_opts, ret->mnt_opts);
92 TEST_COMPARE(tests[i].mnt_freq, ret->mnt_freq);
93 TEST_COMPARE(tests[i].mnt_passno, ret->mnt_passno);
94
95 fclose (fp);
96 }
97
98 return 0;
99}
100
101#include <support/test-driver.c>
102

source code of glibc/misc/tst-mntent-escape.c