who命令的实现 (三)

2014-11-24 00:40:30 · 作者: · 浏览: 14
ad = 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);
}

#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);
}