1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| /* file mydf.c -- jipété, déc. 2018 */
/* http://www.linuxquestions.org/questions/programming-9/find-dir-space-419927/#post2126437
mettre ce define sinon erreur EOVERFLOW si fichier > 2,147 Gb
vient de config.h de coreutils */
/* Number of bits in a file offset, on hosts where this is settable. */
#define _FILE_OFFSET_BITS 64
/* oblige à rajouter un casting (long long) et modif lu -> llu */
#include <sys/types.h>
#include <sys/statvfs.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> // sync
int main (int nb_args, char * args[])
{
long long total, occup, libre;
struct statvfs sbuf;
if (nb_args != 2) {
fprintf (stderr, "syntaxe : %s <fichier> ou <dossier>\n", args[0]);
exit (1);
}
sync();
if (statvfs(args[1], &sbuf) < 0) {
fprintf (stderr, "Erreur en récupérant les informations de %s\n", args[1]);
exit(-1);
}
/*
printf("mode 'df -B1':\n");
//printf("Espace total : %15llu %s\n", (long long) sbuf.f_frsize * sbuf.f_blocks, " = df 1B-blocks");
printf("Espace used : %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree), " = df Util.");
printf("Espace dispo : %15llu %s\n", (long long) sbuf.f_frsize * sbuf.f_bavail, " = df Disponible, bavail");
printf("nouveau total: %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree + sbuf.f_bavail), " = blocks-bfree+bavail (= Util.+Dispo)");
printf("Espace libre : %15llu %s\n", (long long) sbuf.f_frsize * sbuf.f_bfree, " = bfree, tune2fs Free blocks");
printf("libre - dispo= %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_bfree - sbuf.f_bavail), " = bfree - bavail, tune2fs Reserved block count");
//netbsd printf("libre - dispo= %15llu %s\n", (long long) sbuf.f_frsize * (sbuf.f_bresvd), " = f_bresvd, tune2fs Reserved block count");
printf("\n");
*/
total = sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree + sbuf.f_bavail);
occup = sbuf.f_frsize * (sbuf.f_blocks - sbuf.f_bfree);
libre = sbuf.f_frsize * sbuf.f_bavail;
printf("Espace gnd total | utilisé | disponible | (en octets)\n");
printf("%16llu %16llu %16llu \n", total, occup, libre);
/* sortie (dossier '.') :
Espace gnd total | utilisé | disponible | (en octets)
83953655808 31480061952 52473593856
et pour récupérer les champs par script :
# /datas/Coding/C/stat_work/mydf . | awk 'NR==2 {print $1}'
83953655808
# /datas/Coding/C/stat_work/mydf . | awk 'NR==2 {print $2}'
31480094720
# /datas/Coding/C/stat_work/mydf . | awk 'NR==2 {print $3}'
52473561088
*/
/* https://stackoverflow.com/questions/4965355/converting-statvfs-to-percentage-free-correctly
* SIMUL -- les champs commençant par "f_" viennent de la structure statvfs
* les deux autres sont calculés :
* USED = f_blocks - f_bfree (= df Util.[isé]),
* Rfr = f_bfree - f_bavail
*
* |<--------------------- f_blocks 100------------------------->|
* |<---------------- f_bfree 60---------------->|
*
* ---------------------------------------------------------------
* | USED 40 | f_bavail 35 | Resrv for root 25 |
* ---------------------------------------------------------------
*
* Rfr = 60 -35 = 25
* nouveau total = 100-60+35 = 75 --> = 100-25 = used + bavail = 40+35 = 75
*/
return (0);
} |
Partager