📄 dir.c
字号:
//===============.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 + -