Probe: tentatively implement volume support for FreeBSD

This is limited to the / volume at the moment.
This commit is contained in:
Pierre Pronchery 2022-05-18 00:31:44 +02:00
parent 242dac01ff
commit 48aa0ead65

View File

@ -39,17 +39,17 @@
# define _sysinfo_linux _sysinfo # define _sysinfo_linux _sysinfo
# define _userinfo_utmpx _userinfo # define _userinfo_utmpx _userinfo
# define _ifinfo_linux _ifinfo # define _ifinfo_linux _ifinfo
# define _volinfo_linux _volinfo # define _volinfo_mtab _volinfo
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
# define _sysinfo_generic _sysinfo # define _sysinfo_generic _sysinfo
# define _userinfo_utmpx _userinfo # define _userinfo_utmpx _userinfo
# define _ifinfo_bsd _ifinfo # define _ifinfo_bsd _ifinfo
# define _volinfo_linux _volinfo # define _volinfo_statfs _volinfo
#elif defined(__NetBSD__) #elif defined(__NetBSD__)
# define _sysinfo_generic _sysinfo # define _sysinfo_generic _sysinfo
# define _userinfo_utmpx _userinfo # define _userinfo_utmpx _userinfo
# define _ifinfo_bsd _ifinfo # define _ifinfo_bsd _ifinfo
# define _volinfo_bsd _volinfo # define _volinfo_statvfs _volinfo
#else #else
# define _sysinfo_generic _sysinfo # define _sysinfo_generic _sysinfo
# define _userinfo_utmpx _userinfo # define _userinfo_utmpx _userinfo
@ -475,7 +475,7 @@ struct volinfo
}; };
/* volinfo linux */ /* volinfo linux */
#if defined(_volinfo_linux) #if defined(_volinfo_mtab)
# include <sys/statvfs.h> # include <sys/statvfs.h>
enum VolInfo enum VolInfo
{ {
@ -483,8 +483,8 @@ enum VolInfo
}; };
#define VI_LAST VI_PASS #define VI_LAST VI_PASS
static int _volinfo_linux_append(struct volinfo ** dev, char * buf, int nb); static int _volinfo_mtab_append(struct volinfo ** dev, char * buf, int nb);
static int _volinfo_linux(struct volinfo ** dev) static int _volinfo_mtab(struct volinfo ** dev)
{ {
int ret = 0; int ret = 0;
FILE * fp; FILE * fp;
@ -502,7 +502,7 @@ static int _volinfo_linux(struct volinfo ** dev)
ret = -1; ret = -1;
break; break;
} }
if(_volinfo_linux_append(dev, buf, i) != 0) if(_volinfo_mtab_append(dev, buf, i) != 0)
{ {
ret = -1; ret = -1;
break; break;
@ -513,7 +513,7 @@ static int _volinfo_linux(struct volinfo ** dev)
return ret; return ret;
} }
static int _volinfo_linux_append(struct volinfo ** dev, char * buf, int nb) static int _volinfo_mtab_append(struct volinfo ** dev, char * buf, int nb)
{ {
unsigned int i; unsigned int i;
unsigned int j; unsigned int j;
@ -544,14 +544,53 @@ static int _volinfo_linux_append(struct volinfo ** dev, char * buf, int nb)
p[nb].free = sv.f_bavail; p[nb].free = sv.f_bavail;
return 0; return 0;
} }
#endif /* defined(_volinfo_linux) */ #endif /* defined(_volinfo_mtab) */
/* volinfo_bsd */ /* volinfo_statfs */
#if defined(_volinfo_bsd) #if defined(_volinfo_statfs)
# include <sys/statvfs.h> # include <sys/param.h>
static int _volinfo_bsd_append(struct volinfo ** dev, struct statvfs * buf, # include <sys/mount.h>
static int _volinfo_statfs_append(struct volinfo ** dev, struct statfs * buf,
int nb); int nb);
static int _volinfo_bsd(struct volinfo ** dev) static int _volinfo_statfs(struct volinfo ** dev)
{
int ret;
struct statfs buf;
int cnt;
int cnt2;
if((cnt = statfs("/", &buf)) == -1)
return _probe_perror("statfs", -1);
if(_volinfo_statfs_append(dev, &buf[ret], 0) == 0)
return -1;
return ret;
}
static int _volinfo_statfs_append(struct volinfo ** dev, struct statfs * buf,
int nb)
{
struct volinfo * p;
if((p = realloc(*dev, sizeof(*p) * (nb + 1))) == NULL)
return _probe_perror(NULL, 1);
*dev = p;
strcpy(p[nb].name, buf->f_mntonname);
# if defined(DEBUG)
fprintf(stderr, "_volinfo_append: %s\n", p[nb].name);
# endif
p[nb].block_size = buf->f_bsize;
p[nb].total = buf->f_blocks * 2048 / buf->f_bsize;
p[nb].free = buf->f_bavail * 2048 / buf->f_bsize;
return 0;
}
#endif /* defined(_volinfo_statvfs) */
/* volinfo_statvfs */
#if defined(_volinfo_statvfs)
# include <sys/statvfs.h>
static int _volinfo_statvfs_append(struct volinfo ** dev, struct statvfs * buf,
int nb);
static int _volinfo_statvfs(struct volinfo ** dev)
{ {
int ret; int ret;
struct statvfs * buf; struct statvfs * buf;
@ -570,7 +609,7 @@ static int _volinfo_bsd(struct volinfo ** dev)
} }
for(ret = 0; ret < cnt && ret < cnt2; ret++) for(ret = 0; ret < cnt && ret < cnt2; ret++)
{ {
if(_volinfo_bsd_append(dev, &buf[ret], ret) == 0) if(_volinfo_statvfs_append(dev, &buf[ret], ret) == 0)
continue; continue;
ret = -1; ret = -1;
break; break;
@ -579,7 +618,7 @@ static int _volinfo_bsd(struct volinfo ** dev)
return ret; return ret;
} }
static int _volinfo_bsd_append(struct volinfo ** dev, struct statvfs * buf, static int _volinfo_statvfs_append(struct volinfo ** dev, struct statvfs * buf,
int nb) int nb)
{ {
struct volinfo * p; struct volinfo * p;
@ -596,7 +635,7 @@ static int _volinfo_bsd_append(struct volinfo ** dev, struct statvfs * buf,
p[nb].free = buf->f_bavail * 2048 / buf->f_bsize; p[nb].free = buf->f_bavail * 2048 / buf->f_bsize;
return 0; return 0;
} }
#endif /* defined(_volinfo_bsd) */ #endif /* defined(_volinfo_statvfs) */
/* volinfo generic */ /* volinfo generic */
#if defined(_volinfo_generic) #if defined(_volinfo_generic)