1#ifdef __cplusplus 2extern "C" { 3#endif 4#include "EXTERN.h" 5#include "perl.h" 6#include "XSUB.h" 7#include <sys/statvfs.h> 8#ifdef __cplusplus 9} 10#endif 11 12typedef struct statvfs Statvfs; 13 14 15MODULE = Filesys::Df PACKAGE = Filesys::Df 16 17 18void 19_df(dir) 20 char *dir 21 PREINIT: 22 Statvfs st; 23 PPCODE: 24 EXTEND(sp, 7); 25 if(statvfs(dir, &st) == 0) { 26 /* Push values as doubles because we don't know size */ 27 PUSHs(sv_2mortal(newSVnv((double)st.f_frsize))); 28 PUSHs(sv_2mortal(newSVnv((double)st.f_blocks))); 29 PUSHs(sv_2mortal(newSVnv((double)st.f_bfree))); 30 PUSHs(sv_2mortal(newSVnv((double)st.f_bavail))); 31 32 PUSHs(sv_2mortal(newSVnv((double)st.f_files))); 33 PUSHs(sv_2mortal(newSVnv((double)st.f_ffree))); 34 PUSHs(sv_2mortal(newSVnv((double)st.f_favail))); 35 } 36 37 else { 38 PUSHs(sv_2mortal(newSVuv(0))); 39 PUSHs(sv_2mortal(newSVuv(0))); 40 PUSHs(sv_2mortal(newSVuv(0))); 41 PUSHs(sv_2mortal(newSVuv(0))); 42 43 PUSHs(sv_2mortal(newSVuv(0))); 44 PUSHs(sv_2mortal(newSVuv(0))); 45 PUSHs(sv_2mortal(newSVuv(0))); 46 } 47 48void 49_df_fh(fd) 50 int fd; 51 PREINIT: 52 Statvfs st; 53 PPCODE: 54 EXTEND(sp, 7); 55 if(fstatvfs(fd, &st) == 0) { 56 /* Push values as doubles because we don't know size */ 57 PUSHs(sv_2mortal(newSVnv((double)st.f_frsize))); 58 PUSHs(sv_2mortal(newSVnv((double)st.f_blocks))); 59 PUSHs(sv_2mortal(newSVnv((double)st.f_bfree))); 60 PUSHs(sv_2mortal(newSVnv((double)st.f_bavail))); 61 62 PUSHs(sv_2mortal(newSVnv((double)st.f_files))); 63 PUSHs(sv_2mortal(newSVnv((double)st.f_ffree))); 64 PUSHs(sv_2mortal(newSVnv((double)st.f_favail))); 65 } 66 67 else { 68 PUSHs(sv_2mortal(newSVuv(0))); 69 PUSHs(sv_2mortal(newSVuv(0))); 70 PUSHs(sv_2mortal(newSVuv(0))); 71 PUSHs(sv_2mortal(newSVuv(0))); 72 73 PUSHs(sv_2mortal(newSVuv(0))); 74 PUSHs(sv_2mortal(newSVuv(0))); 75 PUSHs(sv_2mortal(newSVuv(0))); 76 } 77 78