# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1298108259 0 # Node ID 3e2ada9ee0ac34e10add2d8d0bb3aa6f7a593e56 # Parent 2b260f4309bb3748cb04d28ccad4c32aee7df04e Switched to using reentrant version of getmntent on Linux. The non-reentrant version seems to be very unreliable. diff -r 2b260f4309bb -r 3e2ada9ee0ac compat.c --- 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);