You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.0 KiB
83 lines
2.0 KiB
/* |
|
* Copyright (c) 2014 Fujitsu Ltd. |
|
* Author: Xing Gu <gux.fnst@cn.fujitsu.com> |
|
* |
|
* This program is free software; you can redistribute it and/or modify it |
|
* under the terms of version 2 of the GNU General Public License as |
|
* published by the Free Software Foundation. |
|
* |
|
* This program is distributed in the hope that it would be useful, but |
|
* WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
* |
|
* You should have received a copy of the GNU General Public License along |
|
* with this program; if not, write the Free Software Foundation, Inc., |
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|
*/ |
|
|
|
#include <unistd.h> |
|
#include <mntent.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
#include "test.h" |
|
|
|
/* |
|
* Check whether a path is on a filesystem that is mounted with |
|
* specified flags. |
|
*/ |
|
int tst_path_has_mnt_flags(void (cleanup_fn)(void), |
|
const char *path, const char *flags[]) |
|
{ |
|
struct mntent *mnt; |
|
size_t prefix_max = 0, prefix_len; |
|
int flags_matched = 0; |
|
FILE *f; |
|
int i; |
|
char *tmpdir = NULL; |
|
|
|
/* |
|
* Default parameter is test temporary directory |
|
*/ |
|
if (path == NULL) |
|
path = tmpdir = tst_get_tmpdir(); |
|
|
|
if (access(path, F_OK) == -1) { |
|
tst_brkm(TBROK | TERRNO, cleanup_fn, |
|
"tst_path_has_mnt_flags: path %s doesn't exist", path); |
|
return -1; |
|
} |
|
|
|
f = setmntent("/proc/mounts", "r"); |
|
if (f == NULL) { |
|
tst_brkm(TBROK | TERRNO, cleanup_fn, |
|
"tst_path_has_mnt_flags: failed to open /proc/mounts"); |
|
return -1; |
|
} |
|
|
|
while ((mnt = getmntent(f))) { |
|
/* ignore duplicit record for root fs */ |
|
if (!strcmp(mnt->mnt_fsname, "rootfs")) |
|
continue; |
|
|
|
prefix_len = strlen(mnt->mnt_dir); |
|
|
|
if (strncmp(path, mnt->mnt_dir, prefix_len) == 0 |
|
&& prefix_len > prefix_max) { |
|
prefix_max = prefix_len; |
|
flags_matched = 0; |
|
i = 0; |
|
|
|
while (flags[i] != NULL) { |
|
if (hasmntopt(mnt, flags[i]) != NULL) |
|
flags_matched++; |
|
i++; |
|
} |
|
} |
|
} |
|
|
|
endmntent(f); |
|
|
|
free(tmpdir); |
|
|
|
return flags_matched; |
|
}
|
|
|