/*
* 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;
}