The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <sys/statvfs.h>
#ifdef __cplusplus
}
#endif

typedef struct statvfs Statvfs;


MODULE = Filesys::Df	PACKAGE = Filesys::Df


void
_df(dir)
	char *dir
	PREINIT:
	Statvfs st;
	PPCODE:
	EXTEND(sp, 7);
	if(statvfs(dir, &st) == 0) {
		/* Push values as doubles because we don't know size */
		PUSHs(sv_2mortal(newSVnv((double)st.f_frsize)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_blocks)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_bfree)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_bavail)));

		PUSHs(sv_2mortal(newSVnv((double)st.f_files)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_ffree)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_favail)));
	}

	else {
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));

		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
	}

void
_df_fh(fd)
	int fd;
	PREINIT:
	Statvfs st;
	PPCODE:
	EXTEND(sp, 7);
	if(fstatvfs(fd, &st) == 0) {
		/* Push values as doubles because we don't know size */
		PUSHs(sv_2mortal(newSVnv((double)st.f_frsize)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_blocks)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_bfree)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_bavail)));

		PUSHs(sv_2mortal(newSVnv((double)st.f_files)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_ffree)));
		PUSHs(sv_2mortal(newSVnv((double)st.f_favail)));
	}

	else {
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));

		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
		PUSHs(sv_2mortal(newSVuv(0)));
	}