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

📄 dir.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 100struct 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:allint sockfd;
struct sockaddr_in target_addr;
char buf[BUFMAX];
int buflen;char temp[BUFMAX]; int len1,len2;char ip[BUFMAX]; //ipaddresschar 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; }

⌨️ 快捷键说明

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