当前位置:  技术问答>linux和unix

怎么用C或JAVA实现读取LINUX的 /var/log/wtmp 日志文件

    来源: 互联网  发布时间:2015-09-05

    本文导语:  谢谢 | #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #define OUT_NAMESIZE 8 #define OUT_LINESIZE 8 #define OUT_HOSTSIZE 16 struct olastlog { time_t ll_time; char ll_li...

谢谢

|
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


#define OUT_NAMESIZE 8
#define OUT_LINESIZE 8
#define OUT_HOSTSIZE 16

struct olastlog {
time_t ll_time;
char ll_line[OUT_LINESIZE];
char ll_host[OUT_HOSTSIZE];
};

struct outmp {
char ut_line[OUT_LINESIZE];
char ut_name[OUT_NAMESIZE];
char ut_host[OUT_HOSTSIZE];
long ut_time;
};

void usage(void);
void convert(const char *, int, int);

/*
 * NB: We cannot convert lastlog yet, but we don't need either.
 */

void
usage(void)
{
  errx(EX_USAGE, "usage: wtmp [-f] [-n] /var/log/wtmp*");
}


int
main(int argc, char **argv)
{
  int errs, i, nflag, forceflag, rv;

  errs = nflag = forceflag = 0;
  while ((i = getopt(argc, argv, "fn")) != -1)
    switch (i)
      {
      case 'f':
forceflag++;
break;

      case 'n':
nflag++;
break;

      default:
errs++;
      }
  argc -= optind;
  argv += optind;

  if (argc  0; argc--, argv++)
    convert(*argv, nflag, forceflag);

  return 0;
}

void
convert(const char *name, int nflag, int forceflag)
{
  struct stat sb;
  struct timeval tv[2];
  char xname[1024], yname[1024];
  unsigned char buf[128]; /* large enough to hold one wtmp record */
  int fd1, fd2;
  size_t off, shouldbe;
  int old, new;
  time_t now, early, *t;
  struct tm tm;
  struct utmp u;
  struct outmp *ou;
  enum { OLD, NEW } which = OLD; /* what we're defaulting to */

  if (stat(name, &sb) == -1)
    {
      warn("Cannot stat file "%s", continuing.", name);
      return;
    }

  now = time(NULL);
  /* some point in time very early, before 386BSD 0.0 */
  tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0;
  tm.tm_mday = 1; tm.tm_mon = 2; tm.tm_year = 92;
  tm.tm_isdst = 0;
  early = mktime(&tm);

  tv[0].tv_sec = sb.st_atimespec.tv_sec;
  tv[0].tv_usec = sb.st_atimespec.tv_nsec / 1000;
  tv[1].tv_sec = sb.st_mtimespec.tv_sec;
  tv[1].tv_usec = sb.st_mtimespec.tv_nsec / 1000;

  /* unzipping is handled best externally */
  if (strlen(name) > 3 && memcmp(&name[strlen(name) - 3], ".gz", 3) == 0)
    {
      warnx("Cannot handle gzipped files, ignoring "%s".", name);
      return;
    }

  (void) snprintf(xname, sizeof xname, "%s.new", name);
  if (!nflag && (fd1 = open(xname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
    err(EX_CANTCREAT, "Can't create new wtmp file");

  if ((fd2 = open(name, O_RDONLY, 0)) == -1)
    err(EX_UNAVAILABLE, "input file magically disappeared, i'm confused");

  old = new = 0; off = 0;
  memset(buf, 0, sizeof buf);

  while (read(fd2, &buf[off], sizeof(time_t)) == sizeof(time_t))
    {
      t = (time_t *)&buf[off];
      off += sizeof(time_t);
      if (off  sizeof buf)
    {
      if (!forceflag)
{
         (void) unlink(xname);
  errx(EX_UNAVAILABLE, "I can't seem to make sense out of file "%s",n"
       "Could have forced using -f.",
     name);
}
      else
{
  warnx("Record # %d in file "%s" seems bogusn"
"(time: %d, previous time: %d, now: %d),n"
"continuing anyway.",
old + new + 1, name, *t, early, now);
  if (which == NEW)
    {
      (void)lseek(fd2, sizeof(struct utmp) - sizeof buf, SEEK_CUR);
      goto write_new;
    }
  else
    {
      (void)lseek(fd2, sizeof(struct outmp) - sizeof buf, SEEK_CUR);
      goto write_old;
    }
}
    }
  continue;
}
      /* time is reasonable, we seem to have collected a full entry */
      if (off == sizeof(struct utmp))
{
  /* new wtmp record */
  which = NEW;
write_new:
  new++;
  if (!nflag)
    {
      if (write(fd1, buf, sizeof(struct utmp)) != sizeof(struct utmp))
err(EX_IOERR, "writing file "%s"", xname);
    }
}
      else if (off == sizeof(struct outmp))
{
  /* old fart */
  which = OLD;
write_old:
  old++;
  if (!nflag)
    {
      ou = (struct outmp *)buf;
      memset(&u, 0, sizeof u);
      memcpy(&u.ut_line, ou->ut_line, OUT_LINESIZE);
      memcpy(&u.ut_name, ou->ut_name, OUT_NAMESIZE);
      memcpy(&u.ut_host, ou->ut_host, OUT_HOSTSIZE);
      memcpy(&u.ut_time, &ou->ut_time, sizeof u.ut_time);
      if (write(fd1, &u, sizeof(struct utmp)) != sizeof(struct utmp))
err(EX_IOERR, "writing file "%s"", xname);
    }
}
      else
{
  if (!forceflag)
    {
      warnx("Illegal record in file "%s", ignoring.", name);
      off = 0;
      continue;
    }
  else
    {
      warnx("Illegal record in file "%s", considering it %s one.",
    name, (which == OLD? "an old": "a new"));
      shouldbe = (which == OLD? sizeof(struct outmp): sizeof(struct utmp));
      if (off 

    
 
 

您可能感兴趣的文章:

  • java中读取.txt和读取.ini文件的方式和命令是否一样
  • 请问在Java程序中能否直接读取ini文件,如何读取?
  • 高手帮忙:如何用java读取数据(从ftp服务器上一个文本文件)但不采用get的方式直接读取,打印数据内容(web方式)
  • 请问在Linux里,如何用JAVA读取内存里的PATH设置
  • 可以用Java读取Notes的数据么?急,定给分!!!
  • 有没有人晓得怎么用JAVA实现读取UTMP或WTMP等日志文件!!!!!!!!!!!!!
  • 哪里有用JAVA读取 MS-Excel文件的包?谢谢谢谢
  • java自动根据文件内容的编码来读取避免乱码
  • Java读取二维条码
  • 编程技术其它 iis7站长之家
  • 如何用JAVA读取Doc文档?(必给分)
  • 急!送分求助,java程序中如何读取系统环境变量?
  • 如何在java应用程序中读取键盘的输入?闪电给分。
  • 请问各位大虾: 如何用java读取一个xml文档
  • 请问如何用Java从数据库中读取媒体文件,如图片,mpeg 等
  • 如何读取java文件?
  • 谁有读取cad文件的java源程序?谢谢了!
  • 哪为做过读取PDF格式文件的JAVA程序
  • 用java读取位图
  • 笨苯问题:java类中如何读取xml中定义的属性信息。
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • java.util.Date 和 java.slq.Date 如何最简单实现互换?
  • java tomcat实现Session对象的持久化原理及配置方法介绍
  • 不太明白,利用RMI实现JAVA分布式应用 和 EJB实现JAVA分布式应用有什么区别。
  • java实现判断字符串是否全是数字的四种方法代码举例
  • java的API中有没有既实现了Map接口又实现了List接口的类?
  • java序列化实现Serializable接口
  • 我是java新手,请问java中与平台相关的操作是怎样实现的
  • java中Spring框架介绍及如何实现对Bean的管理
  • java文件复制代码片断(java实现文件拷贝)
  • java Servlet实现Session创建存取以及url重写代码示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java读写包括中文的txt文件时不同编码格式问题解决
  • JAVA编译的CLASS文件可以反编译为JAVA文件吗?
  • 保存java.sh文件时,多出一个java.sh~文件
  • 用什么工具可以把JAVA的.CLASS文件反编译成.JAVA文件??
  • 请问把.class文件反编译为.java文件的工具有什么???能恢复到原来的.java文件吗???
  • 一个.java文件中怎样来调用另一个.java文件中的变量及其它东西!
  • 用java读中文linux中的文件是正确的,用java读英文linux版本中的文件是乱码,如何使英文linux读出的文件数据也是中文的?
  • 我刚学java,想请教一下,我在文本中创建了一个接口,一个类,还有一个扩展类,保存为.java文件时,如何给文件名?
  • 请教:有没有把java编译好的.java和.class文件编译成各个平台下的可执行文件??.exe?着急着急
  • java文件操作之java写文件简单示例
  • java复制文件和java移动文件的示例分享
  • java读取文件内容的三种方法代码片断分享(java文件操作)
  • 编译前的java文件没有,只有class文件
  • 我用java编了一个程序,是多个java文件,属于一个包,需要联编,但我不会
  • 低级问题:.java文件交付用户怎么运行,难道也是DOS下:java xx.java?有没有.exe?
  • 我在jbuilder中新建一个servlet,源程序为java文件,是怎么从java到servler转换的?
  • 求救!!如何在java程序中调用外部非java的exe文件?
  • 谁有办法用java执行于java.exe不在一个目录的class文件?
  • 怎样把CLASS文件转成JAVA文件
  • 不让用户选择文件,程序指定本地文件,Java可以实现上传到服务器吗?
  • 如何从一个.class文件得到它的.java文件?
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3