Mercurial > dwindows
changeset 649:3e2ada9ee0ac
Switched to using reentrant version of getmntent on Linux.
The non-reentrant version seems to be very unreliable.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sat, 19 Feb 2011 09:37:39 +0000 |
parents | 2b260f4309bb |
children | 55b677d460e9 |
files | compat.c |
diffstat | 1 files changed, 37 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/compat.c Sat Feb 19 00:02:12 2011 +0000 +++ b/compat.c Sat Feb 19 09:37:39 2011 +0000 @@ -120,8 +120,10 @@ if(mnt.mnt_mountp) { - statfs(mnt.mnt_mountp, &sfs, sizeof(struct statfs), 0); - size = (long double)((double)sfs.f_bsize * (double)sfs.f_bfree); + if(!statfs(mnt.mnt_mountp, &sfs, sizeof(struct statfs), 0)) + { + size = (long double)((double)sfs.f_bsize * (double)sfs.f_bfree); + } } fclose(fp); return size; @@ -133,22 +135,25 @@ return 0; #else FILE *fp = setmntent(MOUNTED, "r"); - struct mntent *mnt; + struct mntent mnt; struct statfs sfs; + char buffer[1024]; int index = 1; if(fp) { - while((mnt = getmntent(fp))) + while(getmntent_r(fp, &mnt, buffer, sizeof(buffer))) { if(index == drive) { long double size = 0; - if(mnt->mnt_dir) + if(mnt.mnt_dir) { - statfs(mnt->mnt_dir, &sfs); - size = (long double)((double)sfs.f_bsize * (double)sfs.f_bavail); + if(!statfs(mnt.mnt_dir, &sfs)) + { + size = (long double)((double)sfs.f_bsize * (double)sfs.f_bavail); + } } endmntent(fp); return size; @@ -217,8 +222,10 @@ if(mnt.mnt_mountp) { - statfs(mnt.mnt_mountp, &sfs, sizeof(struct statfs), 0); - size = (long double)((double)sfs.f_bsize * (double)sfs.f_blocks); + if(!statfs(mnt.mnt_mountp, &sfs, sizeof(struct statfs), 0)) + { + size = (long double)((double)sfs.f_bsize * (double)sfs.f_blocks); + } } fclose(fp); return size; @@ -230,22 +237,25 @@ return 0; #else FILE *fp = setmntent(MOUNTED, "r"); - struct mntent *mnt; + struct mntent mnt; + char buffer[1024]; struct statfs sfs; int index = 1; if(fp) { - while((mnt = getmntent(fp))) + while(getmntent_r(fp, &mnt, buffer, sizeof(buffer))) { if(index == drive) { long double size = 0; - if(mnt->mnt_dir) + if(mnt.mnt_dir) { - statfs(mnt->mnt_dir, &sfs); - size = (long double)((double)sfs.f_bsize * (double)sfs.f_blocks); + if(!statfs(mnt.mnt_dir, &sfs)) + { + size = (long double)((double)sfs.f_bsize * (double)sfs.f_blocks); + } } endmntent(fp); return size; @@ -310,8 +320,7 @@ fclose(fp); if(mnt.mnt_mountp) { - statfs(mnt.mnt_mountp, &sfs, sizeof(struct statfs), 0); - if(sfs.f_blocks) + if(!statfs(mnt.mnt_mountp, &sfs, sizeof(struct statfs), 0) && sfs.f_blocks) return 1; } return 0; @@ -322,22 +331,24 @@ } #else FILE *fp = setmntent(MOUNTED, "r"); - struct mntent *mnt; + struct mntent mnt; + char buffer[1024]; struct statfs sfs; int index = 1; if(fp) { - while((mnt = getmntent(fp))) + while(getmntent_r(fp, &mnt, buffer, sizeof(buffer))) { if(index == drive) { endmntent(fp); - if(mnt->mnt_dir) + if(mnt.mnt_dir) { - statfs(mnt->mnt_dir, &sfs); - if(sfs.f_blocks) + if(!statfs(mnt.mnt_dir, &sfs) && sfs.f_blocks) + { return 1; + } } return 0; } @@ -385,17 +396,18 @@ } #else FILE *fp = setmntent(MOUNTED, "r"); - struct mntent *mnt; + struct mntent mnt; + char buffer[1024]; int index = 1; strncpy(buf, "Unknown", len); if(fp) { - while((mnt = getmntent(fp))) + while(getmntent_r(fp, &mnt, buffer, sizeof(buffer))) { - if(index == drive && mnt->mnt_dir) - strncpy(buf, mnt->mnt_dir, len); + if(index == drive && mnt.mnt_dir) + strncpy(buf, mnt.mnt_dir, len); index++; } endmntent(fp);