#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <utmp.h>
#include <string.h>
#include <time.h>
void show_info(const struct utmp *info);
int main(int argc, char *argv[])
{
if(argc != 1 && argc != 3)
return 0;
int utmpfd;
struct utmp current_record;
int reclen = sizeof(current_record);
if((utmpfd = open(UTMP_FILE, O_RDONLY)) == 0)
perror(UTMP_FILE);
char hostname[256];
char *login_name = getlogin();
gethostname(hostname, 256);
while(read(utmpfd, ¤t_record, sizeof(struct utmp)) == reclen)
{
if(argc == 1 || (argc == 3 &&
strcmp(login_name, current_record.ut_user) == 0 &&
strcmp(hostname, current_record.ut_host) == 0))
show_info(¤t_record);
} close(utmpfd);
return 0;
}
void show_info(const struct utmp *info)
{
char out_time[50];
struct tm *tm_t;
if(info->ut_type != USER_PROCESS)
return;
printf("%-8.8s", info->ut_user);
printf(" ");
printf("%-8.8s", info->ut_line);
printf(" ");
time_t t = info->ut_tv.tv_sec;
tm_t = localtime(&t);
strftime(out_time, 50, "%Y-%m-%d %H:%M", tm_t);
printf("%20.20s", out_time);
printf(" ");
printf("(%s)\n", info->ut_host);
}
who命令的简单实现
最新推荐文章于 2023-10-24 08:36:00 发布