who命令的实现 (二)

2014-11-24 00:40:30 · 作者: · 浏览: 13
, utbufp->ut_user); /* The user name */
printf(" ");
printf("%-8.8s", utbufp->ut_line); /* The tty name */
printf(" ");
showtime(utbufp->ut_time); /* utime */
#ifdef SHOWHOST
if (utbufp->ut_host[0] != '\0')
printf(" (%s)", utbufp->ut_host); /* the host */
#endif
printf("\n");
}
/* displays time in a format */
void showtime(long timeva l)
{
char *cp;
cp = ctime(&timeva l); /* convert time to string */
printf("%20.20s", cp+4); /* %12.12s prints a string 20 chars wide and LIMITS it to 20 chars. cp+4是为了把最前面的星期去掉 */
}

#include
#include
#include
#include
#include
#include
#include /* 包含实现缓冲的文件 */

void show_info(struct utmp *);
void showtime(long);

int main()
{
int fd;
struct utmp *utbufp;
int reclen = sizeof(struct utmp);

/* UTMP_FILE就是/var/run/utmp.在/usr/include/paths.h下 */
if (utmp_open(UTMP_FILE) == -1)
{
perror(UTMP_FILE);
exit(1);
}

while((utbufp = utmp_next()) != ((struct utmp *)NULL))
show_info(utbufp);
utmp_close();
return 0;
}

/* displays the contents of the utmp struct, display nothing if utmp has no user name */
void show_info(struct utmp *utbufp)
{
if (utbufp->ut_type != USER_PROCESS)
return;

printf("%-8.8s", utbufp->ut_user); /* The user name */
printf(" ");
printf("%-8.8s", utbufp->ut_line); /* The tty name */
printf(" ");
showtime(utbufp->ut_time); /* utime */
#ifdef SHOWHOST
if (utbufp->ut_host[0] != '\0')
printf(" (%s)", utbufp->ut_host); /* the host */
#endif
printf("\n");
}
/* displays time in a format */
void showtime(long timeva l)
{
char *cp;
cp = ctime(&timeva l); /* convert time to string */
printf("%20.20s", cp+4); /* %12.12s prints a string 20 chars wide and LIMITS it to 20 chars. cp+4是为了把最前面的星期去掉 */
}实现缓冲的文件:utmplib.c


[cpp] #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_re