/*
* ÆÄÀϽýºÅÛ Á¤º¸ ¾ò¾î¿À±â
* /proc/mounts Á¤º¸¿Í statfs¸¦ ÀÌ¿ëÇÑ´Ù.
*/
#include <stdio.h>
#include <string.h>
#include <libgen.h>
#include <sys/vfs.h>
#include <sys/stat.h>
#include <sys/types.h>
const char *MMOUNT = "/proc/mounts";
struct f_size
{
long blocks;
long avail;
};
typedef struct _mountinfo
{
FILE *fp; // ÆÄÀÏ ½ºÆ®¸² Æ÷ÀÎÅÍ
char devname[80]; // ÀåÄ¡ À̸§
char mountdir[80]; // ¸¶¿îÆ® µð·ºÅ丮 À̸§
char fstype[12]; // ÆÄÀÏ ½Ã½ºÅÛ Å¸ÀÔ
struct f_size size; // ÆÄÀÏ ½Ã½ºÅÛÀÇ ÃÑÅ©±â/»ç¿ëÀ²
} MOUNTP;
MOUNTP *dfopen()
{
MOUNTP *MP;
// /proc/mounts ÆÄÀÏÀ» ¿¬´Ù.
MP = (MOUNTP *)malloc(sizeof(MOUNTP));
if(!(MP->fp = fopen(MMOUNT, "r")))
{
return NULL;
}
else
return MP;
}
MOUNTP *dfget(MOUNTP *MP)
{
char buf[256];
char *bname;
char null[16];
struct statfs lstatfs;
struct stat lstat;
int is_root = 0;
// /proc/mounts·Î ºÎÅÍ ¸¶¿îÆ®µÈ ÆÄƼ¼ÇÀÇ Á¤º¸¸¦ ¾ò¾î¿Â´Ù.
while(fgets(buf, 255, MP->fp))
{
is_root = 0;
sscanf(buf, "%s%s%s",MP->devname, MP->mountdir, MP->fstype);
if (strcmp(MP->mountdir,"/") == 0) is_root=1;
if (stat(MP->devname, &lstat) == 0 || is_root)
{
if (strstr(buf, MP->mountdir) && S_ISBLK(lstat.st_mode) || is_root)
{
// ÆÄÀϽýºÅÛÀÇ ÃÑ ÇÒ´çµÈ Å©±â¿Í »ç¿ë·®À» ±¸ÇÑ´Ù.
statfs(MP->mountdir, &lstatfs);
MP->size.blocks = lstatfs.f_blocks * (lstatfs.f_bsize/1024);
MP->size.avail = lstatfs.f_bavail * (lstatfs.f_bsize/1024);
return MP;
}
}
}
rewind(MP->fp);
return NULL;
}
int dfclose(MOUNTP *MP)
{
fclose(MP->fp);
}
int main()
{
MOUNTP *MP;
if ((MP=dfopen()) == NULL)
{
perror("error");
return 1;
}
while(1)
{
while(dfget(MP))
{
printf("%-14s%-20s%10lu%10lu\n", MP->mountdir, MP->devname,
MP->size.blocks,
MP->size.avail);
}
printf("=========================\n\n");
sleep(1);
}
}
|