Let df compile again on Linux

This commit is contained in:
Pierre Pronchery 2007-03-28 05:39:38 +00:00
parent bc5a1b6be3
commit 5fb3c7d88a

View File

@ -14,6 +14,7 @@
/* Prefs */ /* Prefs */
typedef int Prefs; typedef int Prefs;
#define PREFS_k 1 #define PREFS_k 1
#define PREFS_P 2
/* df */ /* df */
@ -41,16 +42,14 @@ static int _df_error(char const * message, int ret)
return ret; return ret;
} }
static void _df_print(Prefs * prefs, const struct statvfs * f); static void _df_print(Prefs * prefs, struct statvfs const * f);
static int _df_mtab(Prefs * prefs) static int _df_mtab(Prefs * prefs)
{ {
#ifdef ST_WAIT
int cnt; int cnt;
struct statvfs * f; struct statvfs * f;
int i; int i;
/* FIXME not portable code here:
* - Linux: /etc/mtab
* - NetBSD: getvfsstat() */
if((cnt = getvfsstat(NULL, 0, ST_WAIT)) < 0) if((cnt = getvfsstat(NULL, 0, ST_WAIT)) < 0)
return _df_error("getvfsstat", 1); return _df_error("getvfsstat", 1);
if((f = malloc(sizeof(*f) * cnt)) == NULL) if((f = malloc(sizeof(*f) * cnt)) == NULL)
@ -63,10 +62,17 @@ static int _df_mtab(Prefs * prefs)
for(i = 0; i < cnt; i++) for(i = 0; i < cnt; i++)
_df_print(prefs, &f[i]); _df_print(prefs, &f[i]);
free(f); free(f);
#else /* FIXME incomplete workaround when getvfsstat() is missing */
struct statvfs f;
if(statvfs(".", &f) != 0)
return _df_error(".", 1);
_df_print(prefs, &f);
#endif
return 0; return 0;
} }
static void _df_print(Prefs * prefs, const struct statvfs * f) static void _df_print(Prefs * prefs, struct statvfs const * f)
{ {
unsigned long long mod; unsigned long long mod;
unsigned long long cnt; unsigned long long cnt;
@ -80,8 +86,13 @@ static void _df_print(Prefs * prefs, const struct statvfs * f)
avail = f->f_bavail * mod; avail = f->f_bavail * mod;
cap = ((f->f_blocks - f->f_bfree) * 100) cap = ((f->f_blocks - f->f_bfree) * 100)
/ ((f->f_blocks - f->f_bfree) + f->f_bavail); / ((f->f_blocks - f->f_bfree) + f->f_bavail);
#ifdef ST_WAIT
printf("%-11s %10llu %10llu %10llu %7u%% %s\n", f->f_mntfromname, printf("%-11s %10llu %10llu %10llu %7u%% %s\n", f->f_mntfromname,
cnt, used, avail, cap, f->f_mntonname); cnt, used, avail, cap, f->f_mntonname);
#else
printf("%-11s %10llu %10llu %10llu %7u%% %s\n", "", cnt, used, avail,
cap, "");
#endif
} }
static int _df_do(Prefs * prefs, char const * file) static int _df_do(Prefs * prefs, char const * file)
@ -117,6 +128,7 @@ int main(int argc, char * argv[])
prefs |= PREFS_k; prefs |= PREFS_k;
break; break;
case 'P': case 'P':
prefs |= PREFS_P;
break; break;
default: default:
return _usage(); return _usage();