do NOT use function xxxmntent in linux

pull/5/head
yuqing 2016-01-18 15:32:32 +08:00
parent fa151cc4ea
commit 9c7a510803
1 changed files with 21 additions and 9 deletions

View File

@ -27,7 +27,6 @@
#ifdef OS_LINUX #ifdef OS_LINUX
#include <sys/sysinfo.h> #include <sys/sysinfo.h>
#include <sys/vfs.h> #include <sys/vfs.h>
#include <mntent.h>
#else #else
#ifdef OS_FREEBSD #ifdef OS_FREEBSD
#include <sys/sysctl.h> #include <sys/sysctl.h>
@ -152,26 +151,30 @@ int get_mounted_filesystems(struct fast_statfs *stats, const int size, int *coun
#ifdef OS_LINUX #ifdef OS_LINUX
const char *filename = "/proc/mounts"; const char *filename = "/proc/mounts";
FILE *fp; FILE *fp;
struct mntent *mnt; char *p;
char *mntfromname;
char *mntonname;
char *fstypename;
struct statfs buf; struct statfs buf;
char line[1024];
int result; int result;
int i; int i;
*count = 0; *count = 0;
fp = setmntent(filename, "r"); fp = fopen(filename, "r");
if (fp == NULL) if (fp == NULL)
{ {
result = errno != 0 ? errno : ENOENT; result = errno != 0 ? errno : ENOENT;
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"call setmntent fail, " "call fopen %s fail, "
"errno: %d, error info: %s", "errno: %d, error info: %s",
__LINE__, errno, STRERROR(errno)); __LINE__, filename, errno, STRERROR(errno));
return result; return result;
} }
memset(stats, 0, sizeof(struct fast_statfs) * size); memset(stats, 0, sizeof(struct fast_statfs) * size);
result = 0; result = 0;
while ((mnt=getmntent(fp)) != NULL) while (fgets(line, sizeof(line), fp) != NULL)
{ {
if (*count >= size) if (*count >= size)
{ {
@ -179,12 +182,21 @@ int get_mounted_filesystems(struct fast_statfs *stats, const int size, int *coun
break; break;
} }
SET_MNT_FIELDS(stats[*count], mnt->mnt_type, p = line;
mnt->mnt_fsname, mnt->mnt_dir); mntfromname = strsep(&p, " \t");
mntonname = strsep(&p, " \t");
fstypename = strsep(&p, " \t");
snprintf(stats[*count].f_mntfromname,
sizeof(stats[*count].f_mntfromname), "%s", mntfromname);
snprintf(stats[*count].f_mntonname,
sizeof(stats[*count].f_mntonname), "%s", mntonname);
snprintf(stats[*count].f_fstypename,
sizeof(stats[*count].f_fstypename), "%s", fstypename);
(*count)++; (*count)++;
} }
endmntent(fp); fclose(fp);
for (i=0; i<*count; i++) for (i=0; i<*count; i++)
{ {