Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
libdi(3)		   Library Functions Manual		      libdi(3)

Name
       libdi - disk information	library

Synopsis
   Initialization
       #include	<di.h>

       void * di_initialize (void);
       int di_process_options (void *di_data, int targc, const char *targv [],
       int offset);
       void di_cleanup (void *di_data);
       const char *di_version (void);

   Options
       int di_check_option (void *di_data, int option);
       void di_format_iter_init	(void *di_data);
       int di_format_iterate (void *di_data);

   Getting data
       int di_get_all_disk_info	(void *di_data);
       int di_iterate_init (void *di_data, int iteroption);
	 typedef struct	{
	   const char	*strdata [DI_DISP_MAX];	     /*	string data */
	   int		index;		   /* internal index value */
	   int		doPrint;	   /* printable	flag based on options */
	   int		printFlag;	   /* print result flag	*/
	   int		isLocal;	   /* filesystem is local */
	   int		isReadOnly;	   /* filesystem is read-only */
	   int		isLoopback;	   /* filesystem is a loopback filesystem */
	 } di_pub_disk_info_t;

       const di_pub_disk_info_t	* di_iterate (void *di_data);
       int di_get_scale_max (void *di_data, int	index,
	   int valueidxA, int valueidxB, int valueidxC);
       double di_get_scaled (void *di_data, int	index,
	   int scaleidx, int valueidxA,	int valueidxB, int valueidxC);
       void di_disp_scaled (void *di_data, char	*buff, long buffsz,
	   int index, int scaleidx,
	   int valueidxA, int valueidxB, int valueidxC);
       double di_get_perc (void	*di_data, int index,
	   int valueidxA, int valueidxB,
	   int valueidxC, int valueidxB, int valueidxE);
       void di_disp_perc (void *di_data, char *buff, long buffsz,
	   int index,
	   int valueidxA, int valueidxB,
	   int valueidxC, int valueidxB, int valueidxE);

Overview
   Initialization
       di_initialize  returns a	pointer	to a di_data structure,	used in	all of
       the other library calls.	 The  returned	pointer	 must  be  freed  with
       di_cleanup.

       di_process_options  processes the arguments to di.  These are passed as
       strings via an argv structure as	if on the command line.	 If no call to
       di_process_options is made, di will use the defaults  and  the  DI_ARGS
       environment variable will not be	processed.

       If  the	return	value  from  di_process_options	 is  not DI_EXIT_NORM,
       di_cleanup should be called and processing stopped.

       di_cleanup frees	all allocated data.

   Options
       di_check_option returns the value of the	specified option. All  options
       will    return	 a    boolean	 value,	   excepting:	 DI_OPT_DEBUG,
       DI_OPT_FMT_STR_LEN, DI_OPT_SCALE	and DI_OPT_BLOCK_SZ.

       option may be one of:

	      DI_OPT_POSIX_COMPAT
	      DI_OPT_QUOTA_CHECK
	      DI_OPT_DISP_CSV
	      DI_OPT_DISP_CSV_TAB
	      DI_OPT_EXCL_LOOPBACK
	      DI_OPT_DISP_JSON
	      DI_OPT_DISP_TOTALS
	      DI_OPT_DISP_HEADER
	      DI_OPT_DISP_ALL
	      DI_OPT_LOCAL_ONLY
	      DI_OPT_NO_SYMLINK
	      DI_OPT_DEBUG
	      DI_OPT_FMT_STR_LEN
	      DI_OPT_SCALE
	      DI_OPT_BLOCK_SZ

       di_format_iter_init initializes the format string iterator.

       di_format_iterate iterates through each format character	in the	format
       string.	 Note  that  di	allows unrecognized format characters.	In the
       main di program,	these are printed as-is.

   Getting Data
       di_get_all_disk_info retrieves and processes all	of the	disk  informa-
       tion from the operating system.

       If  the	return	value  from  di_get_all_disk_info is not DI_EXIT_NORM,
       di_cleanup should be called and processing stopped.

       di_iterate_init initializes the disk information	iterator.   iteroption
       is  one	of  DI_ITER_PRINTABLE or DI_ITER_ALL.  If DI_ITER_PRINTABLE is
       specified, only the partitions with the doPrint flag set	 will  be  re-
       turned by the iterator.

       di_iterate    iterates	 through    the	  filesystems,	 returning   a
       di_pub_disk_info_t structure for	each filesystem.  If the --totals flag
       was specified as	an option, the totals will be the last	item  returned
       by the iterator.

       di_get_scale_max	gets the maximum scaling unit for the space value.

       index is	the index from the di_pub_disk_info_t structure.

       The  valueidx arguments indicate	which disk space values	to use to cal-
       culate the the space value.  The	formula	is: A -	(B - C).  Valid	combi-
       nations are:

	      DI_SPACE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE    // total
	      DI_SPACE_TOTAL, DI_SPACE_FREE, DI_SPACE_AVAIL   // used
	      DI_SPACE_TOTAL, DI_SPACE_FREE, DI_VALUE_NONE    // used
	      DI_SPACE_TOTAL, DI_SPACE_AVAIL, DI_VALUE_NONE   // used
	      DI_SPACE_FREE, DI_VALUE_NONE, DI_VALUE_NONE     // free
	      DI_SPACE_AVAIL, DI_VALUE_NONE, DI_VALUE_NONE    // free
	      DI_INODE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE    // inode total
	      DI_INODE_TOTAL, DI_INODE_FREE, DI_VALUE_NONE    // inodes	used
	      DI_INODE_FREE, DI_VALUE_NONE, DI_VALUE_NONE     // inodes	free

       di_get_scaled gets a space value	scaled according to the	scaling	unit.

       index is	the index from the di_pub_disk_info_t structure.

       scaleidx	is the scaling index to	use.  Use  a  scaling  index  returned
       from di_get_scale_max or	use one	of the following values:

	      DI_SCALE_BYTE
	      DI_SCALE_KILO
	      DI_SCALE_MEGA
	      DI_SCALE_GIGA
	      DI_SCALE_TERA
	      DI_SCALE_PETA
	      DI_SCALE_EXA
	      DI_SCALE_ZETTA
	      DI_SCALE_YOTTA
	      DI_SCALE_RONNA
	      DI_SCALE_QUETTA

       The  valueidx arguments indicate	which disk space values	to use to cal-
       culate the the space value.   The  formula  is:	A  -  (B  -  C).   See
       di_get_scale_max	for a list of valid combinations.

       di_disp_scaled gets a space value scaled	according to the scaling unit,
       and creates a string that can be	printed.

       buff is the character string where the string will be stored.

       buffsz is the size of the character string.

       index is	the index from the di_pub_disk_info_t structure.

       scaleidx	 is  the  scaling  index to use.  Use a	scaling	index returned
       from di_get_scale_max or	one of the values as listed in di_get_scaled.

       The valueidx arguments indicate which disk space	values to use to  cal-
       culate  the  the	 space	value.	 The  formula  is:  A  - (B - C).  See
       di_get_scale_max	for a list of valid combinations.

       di_get_perc retrieves the disk space value as a percentage.

       index is	the index from the di_pub_disk_info_t structure.

       The valueidx arguments indicate which disk space	values to use to  cal-
       culate the percentage.  The formula is: (A - B) / (C - (D - E)).

       Valid combinations are:

	      /* percent used */
	      DI_SPACE_TOTAL, DI_SPACE_AVAIL,
	      DI_SPACE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE
	      /* percent used */
	      DI_SPACE_TOTAL, DI_SPACE_FREE,
	      DI_SPACE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE
	      /* percent used, BSD style */
	      DI_SPACE_TOTAL, DI_SPACE_FREE,
	      DI_SPACE_TOTAL, DI_VALUE_FREE, DI_VALUE_AVAIL
	      /* percent free */
	      DI_SPACE_AVAIL, DI_VALUE_NONE,
	      DI_SPACE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE,
	      /* percent free */
	      DI_SPACE_FREE, DI_VALUE_NONE,
	      DI_SPACE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE,
	      /* inodes	used */
	      DI_INODE_TOTAL, DI_INODE_AVAIL,
	      DI_INODE_TOTAL, DI_VALUE_NONE, DI_VALUE_NONE

       di_disp_perc retrieves the disk space value as a	percentage and creates
       a string	that can be printed.

       buff is the character string where the string will be stored.

       buffsz is the size of the character string.

       index is	the index from the di_pub_disk_info_t structure.

       The  valueidx arguments indicate	which disk space values	to use to cal-
       culate the percentage.  The formula is: (A - B) / (C - (D -  E)).   See
       di_get_perc for valid combinations.

Example
	   /* this code	is in the public domain	*/
	   #include <stdio.h>
	   #include <stdlib.h>
	   #include <stdbool.h>
	   #include <math.h>

	   #include <di.h>

	   enum	{
	     HAVE_SPACE	= 0,
	     NO_SPACE =	1,
	   };

	   int
	   check_space (const char *fn,	double space_wanted) {
	     void	 *di_data;
	     int	 targc;
	     const char	 *targv	[10];
	     int	 exitflag;
	     const di_pub_disk_info_t  *pub;
	     int	 rval =	NO_SPACE;
	     int	 count;

	     targc = 1;
	     targv [0] = fn;
	     targv [1] = NULL;

	     di_data = di_initialize ();
	     exitflag =	di_process_options (di_data, targc, targv, 0);
	     if	(exitflag != DI_EXIT_NORM) {
	       di_cleanup (di_data);
	       exit (exitflag);
	     }

	     exitflag =	di_get_all_disk_info (di_data);
	     if	(exitflag != DI_EXIT_NORM) {
	       di_cleanup (di_data);
	       exit (exitflag);
	     }

	     count = di_iterate_init (di_data, DI_ITER_PRINTABLE);
	     while ((pub = di_iterate (di_data)) != NULL) {
	       double	 dval;

	       /* compare terabytes available */
	       dval = di_get_scaled (di_data, pub->index, DI_SCALE_TERA,
		   DI_SPACE_AVAIL, DI_VALUE_NONE, DI_VALUE_NONE);
	       if (dval	>= space_wanted) {
		 rval =	HAVE_SPACE;
	       }
	     }
	     di_cleanup	(di_data);

	     return rval;
	   }

	   int
	   main	(int argc, char	*argv []) {
	     const char	 *fn = "/home/bll/s/di";
	     double	 spwant	= 0.2;	 /* terabytes */
	     bool	 rval;

	     if	(argc >	1) {
	       fn = argv [1];
	     }
	     if	(argc >	2) {
	       spwant =	atof (argv [2]);
	     }

	     rval = check_space	(fn, spwant);
	     if	(rval == NO_SPACE) {
	       fprintf (stdout,	"Not enough disk space\n");
	     }
	     if	(rval == HAVE_SPACE) {
	       fprintf (stdout,	"Enough	disk space\n");
	     }

	     return rval;
	   }

   Compile and Link
	   dilibd=$HOME/local/lib
	   diinc=$(pkg-config --with-path ${dilibd}/pkgconfig --cflags di)
	   dilibs=$(pkg-config --with-path ${dilibd}/pkgconfig --libs di)
	   cc -o tt ${diinc} tt.c -Wl,-R${dilibd} ${dilibs})

   Example Run
	   bll-g7:bll$ ./tt /home/bll 0.5
	   Not enough disk space
	   bll-g7:bll$ ./tt /home/bll 0.1
	   Enough disk space

See Also
       df(1), di(1)

Bugs
       Open a ticket at	https://sourceforge.net/p/diskinfo-di/tickets/
       Send bug	reports	to: brad.lanam.di @ gmail.com

Links
       Home Page: https://diskinfo-di.sourceforge.io/
       Wiki: https://sourceforge.net/p/diskinfo-di/wiki/Home/
       Change Log: https://sourceforge.net/p/diskinfo-di/wiki/ChangeLog/

Author
       Copyright 1994-2025 by Brad Lanam Pleasant Hill,	CA

				  28 Jan 2025			      libdi(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=libdi&sektion=3&manpath=FreeBSD+Ports+15.0.quarterly>

home | help