⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 Linux 平台下
💻 C
📖 第 1 页 / 共 2 页
字号:
//===============.com===================================
// MonitorFile system 
//Copyright (C) 2008 zhouyuan (zhouyuan0828@163)
//=============================================================
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<limits.h>
#include<malloc.h>
#include<string.h>
#include<utime.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<signal.h>
#include<setjmp.h>
#include<fcntl.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#define BUFMAX 100
struct node
{
      char path[BUFMAX]; //保存文件路径
      int count;    //文件夹下共有的文件数目
      int filetype; // 文件类型:1 图形文件;2 可执行文件
      struct stat buf; //保存inode
      struct  node *link[BUFMAX]; //文件夹链接里面的文件 
     
} ;
void initial(int argc,char *argv[],struct node *manager); //初始化用户要求的文件夹,建立树的第一层
void buildtree(struct node * ref); //将用户制定文件夹下的所有目录和文件递归放入树中
void recursive(struct node *ref); 
void compare(struct node *refroot,struct node*refbackup); //比较两棵树,新的树和原来的树,判断是否修改文件,是否add文件
void cmp(struct node *refroot,struct node*refbackup); //判断是否delete文件
struct node *root; //树的根 
struct node *backup; //新的树的根
char path[BUFMAX];
FILE *fp1,*fp2; 
jmp_buf env_alrm;  //时间间隔
struct tm *tm_ptr; 
char buff[BUFMAX]={0}; 
char logfile[150]={0}; //日志文件
char type[1]; //a: graphic file; b:execute file;c:graphic file and execute file; d:all
int sockfd;
struct sockaddr_in target_addr;

char buf[BUFMAX];

int buflen;
char temp[BUFMAX]; 
int len1,len2;
char ip[BUFMAX]; //ipaddress
char tempfile[BUFMAX][100];
void alarm_handler(int signo)
{
     longjmp(env_alrm,1);
}
int main(int argc,char *argv[])
{ 
     char *a;
     int r=1;
     int i,j;
     char *val;
   if((fp2=fopen("logtext","a"))<0)  //打开logtext文件
          {
        fprintf(stderr,"error");
        getchar();
        exit(0);
         }
   if(argc<2)//读去配置文件  //处理参数 
       {
      char *ptr;
      char *ptr2;
      char *end;
       if((fp1=fopen("configure","r"))==NULL) 
                 {
        fprintf(stderr,"error");
        getchar();
        exit(0);
               }
      fgets(a,200,fp1);
      ptr=strstr(a,";");
      len1=strlen(a);
      len2=strlen(ptr);
      strncpy(temp,a,len1-len2);
      val=temp;
   //    printf("%s\n",val);
      ptr=ptr+1;
      end=strstr(a,"#");
      len1=strlen(a);
      len2=strlen(end);
      int count=0; 
      for(i=0;i<len1-len2;i++) //处理监督的文件
              {
       if(a[i]==' ')
       count++;
              }
     // printf("%d\n",count);
    for(i=1;i<=count+1;i++)
         {
      ptr2=strstr(ptr," ");
      memset(tempfile[i],'\0',sizeof(tempfile[i]));
      if(ptr2)
              {
       len1=strlen(ptr);
       len2=strlen(ptr2);
       strncpy(tempfile[i],ptr,len1-len2);
       ptr=ptr2+1;
              }
     else
              {
        ptr2=strstr(ptr,";");
        len1=strlen(ptr);
        len2=strlen(ptr2);
        strncpy(tempfile[i],ptr,len1-len2);
        ptr=ptr2+1;
              }
        }

  for(i=1;i<=count+1;i++)
     {  
      char *g;
      g=tempfile[i];
      argv[i]=g;
       }
     ptr2=strstr(ptr,";");
     strncpy(type,ptr,len1-len2-1);
     ptr=ptr2+1;
     len1=strlen(ptr);
     len2=strlen(end);
     strncpy(ip,ptr,len1-len2);
     argc=count+2;
   // printf("%s\n",type);
      }
  else   //从命令行中读取 
    {
      printf("Enter time Slot:");
      gets(val);
      printf("Enter File type: a: graphic file; b:execute file;\nc:graphic file and execute file; d:all\n");
      gets(type);
      printf("Enter IP:\n");
      gets(ip);
   }
      int len=strlen(val);
      int slot=0;
      int g;
      for(i=0;i<len;i++)
                {
           g=val[i]-'0';
           for(j=len-i-1;j>=1;j--)
            g=g*10;
           slot=slot+g;
                 }
 
      root=(struct node *)malloc(sizeof(struct node));
      strcpy(root->path,".");
      initial(argc,argv,root);
    //  return 0;
      int k,l;
      struct node *p;
     for(j=1;j<argc;j++) //建立树
            {
       p=root->link[j];
       p->count=0;
       buildtree(p); 
           }
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < -1) {

		perror("create socket error");

	 }
   bzero(&target_addr, sizeof(target_addr));

	target_addr.sin_family = AF_INET;

	target_addr.sin_addr.s_addr = inet_addr(ip);

	target_addr.sin_port = htons(8000);



	if (connect(sockfd, (struct sockaddr *)&target_addr, sizeof(target_addr)) < -1) {

		perror("connect error");

	}

 
//  for(l=1;l<=4;l++)
  for(;;)   //无限循环监测文件
    {    
      backup=(struct node *)malloc(sizeof(struct node)); //建立新的树
      strcpy(backup->path,".");
      initial(argc,argv,backup);
     for(j=1;j<argc;j++)
               {
       p=backup->link[j];
       p->count=0;
       buildtree(p); 
               }
      for(k=1;k<=root->count;k++)
               {
         //printf("监测文件 %s:\n",root->link[k]->path);
         printf("监测文件 :\n");
         compare(root->link[k],backup->link[k]);
         cmp(root->link[k],backup->link[k]);
         fflush(fp2);  //写入文件
               }
   root=backup;
   signal(SIGALRM,alarm_handler);
   alarm(slot);
   for(;;) //时间间隔 
     {  
      if(setjmp(env_alrm)!=0)
         {break;}
        }
  
     }
  memset(buf,'\0',sizeof(buf));
  strcpy(buf,"bye");
  buflen = strlen(buf);

  if (write(sockfd, buf, buflen) != buflen) {

  perror("write error");

       }  
  
   fclose(fp1);
   fclose(fp2);
   return 0;
}
void initial(int argc,char *argv[],struct node *manager)
{     
     int i;
     for(i=1;i<argc;i++)
           {
          struct node *p;
          p=(struct node *)malloc(sizeof(struct node));
          memset(p->path,'\0',sizeof(p->path));
          strcpy(p->path,argv[i]);
          manager->link[i]=p;
          }
     manager->count=argc-1;
}
void buildtree(struct node *ref)
{
         DIR *dp;
         int i;
         struct dirent *dirp;
         struct node *p=ref; 
         if(lstat(p->path,&p->buf)<0)
                       {
         printf("lstat error\n");                          
                      }                                                 
         if(S_ISREG(p->buf.st_mode)) //文件为普通文件 
                       {
         memset(p->link,'\0',sizeof(p->link));
         if(access(p->path,X_OK)==0) {p->filetype=2;} //如果文件为可执行文件
         if(strstr(p->path,"png")){p->filetype=1;} //如果文件为图形文件
                        }
         else if(S_ISDIR(p->buf.st_mode)) //文件为目录
                       {

             // printf("directory:%s\n",p->path);
              dp=opendir(p->path);  
              while((dirp=readdir(dp))!=NULL){ //遍历目录
              if(strcmp(dirp->d_name,".")==0||strcmp(dirp->d_name,"..")==0)   {
               continue; }
              p->count=p->count+1;
              struct node *q;
              q=(struct node *)malloc(sizeof(struct node));
              q->count=0;   
              memset(q->link,'0',sizeof(q->link));   
              memset(q->path,'\0',sizeof(q->path));
              memset(path,'\0',sizeof(path));
              strcpy(path,p->path);  //存到数组中
              strcat(path,"/");
              strcat(path,dirp->d_name);
              strcpy(q->path,path);
             // strcpy(q->buf,p->buf);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -