📄 file.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 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 + -