num_recs = amt_read/UTSIZE; /* 读到的真实个数 */
cur_rec = 0; /* 重置为0 */
return num_recs;
}
utmp_close()
{
if (fd_utmp != -1) /* 只有在打开之后才关闭 */
close(fd_utmp);
}
#include
#include
#include
#include
#define NRECS 16
#define NULLUT ((struct utmp *)NULL)
#define UTSIZE ((sizeof(struct utmp)))
static char utmpbuf[NRECS * UTSIZE]; /* storage */
static int num_recs; /* num stored */
static int cur_rec; /* next to go */
static int fd_utmp = -1; /* read from */
utmp_open(char *filename)
{
fd_utmp = open(filename, O_RDONLY);
cur_rec = num_recs = 0;
return fd_utmp;
}
struct utmp *utmp_next()
{
struct utmp *recp;
if (fd_utmp == -1)
return NULLUT;
if (cur_rec == num_recs && utmp_reload() == 0)
return NULLUT;
recp = (struct utmp *)&utmpbuf[cur_rec * UTSIZE]; /* 依次获取下一个记录的地址 */
cur_rec++;
return recp;
}
int utmp_reload()
{
int amt_read;
/* 不是第一次读时都是从上次读到的位置继续读 */
amt_read = read(fd_utmp, utmpbuf, NRECS * UTSIZE);
num_recs = amt_read/UTSIZE; /* 读到的真实个数 */
cur_rec = 0; /* 重置为0 */
return num_recs;
}
utmp_close()
{
if (fd_utmp != -1) /* 只有在打开之后才关闭 */
close(fd_utmp);
}