#include #include #include #include #include #include #include #include "main.h" #include "disk.h" #include "config.h" int is_correct_inode(struct ext2_inode * ino) { int i; if (ino->i_dtime) return 0; /* if ( ino->i_atime < (ATIME_MIN) || ino->i_atime >= (ATIME_MAX) || ino->i_ctime < (CTIME_MIN) || ino->i_ctime >= (CTIME_MAX) || ino->i_mtime < (MTIME_MIN) || ino->i_mtime >= (MTIME_MAX) ) return 0; */ if (ino->i_size > (FILE_SIZE_MAX)) return 0; // if (!(ino->i_flags & S_IFDIR) && ino->i_links_count>(LINKS_COUNT_MAX)) // return 0; if ( ((ino->i_mode&S_IFMT)==S_IFREG || (ino->i_mode&S_IFMT)==S_IFDIR) && ino->i_blocks>0 ) { if (!(ino->i_block[0])) return 0; for (i=1; ii_block[i]>=nr_blocks ) return 0; if (!(ino->i_block[i])) break; } for (i++; ii_block[i]) return 0; } if( ((ino->i_mode&S_IFMT)!=S_IFREG) && ((ino->i_mode&S_IFMT)!=S_IFDIR) && ((ino->i_mode&S_IFMT)!=S_IFLNK) && ((ino->i_mode&S_IFMT)!=S_IFBLK) && ((ino->i_mode&S_IFMT)!=S_IFCHR) && ((ino->i_mode&S_IFMT)!=S_IFIFO) ) return 0; /* for (i=0; uid_list[i].min != -1; i++) if (ino->i_uid>=uid_list[i].min && ino->i_uid<=uid_list[i].max) break; if (uid_list[i].min == -1) return 0; for (i=0; gid_list[i].min != -1; i++) if (ino->i_gid>=gid_list[i].min && ino->i_gid<=gid_list[i].max) break; if (gid_list[i].min == -1) return 0; */ return 1; } static int fix_unused_inodes_on_disk( int fd ) { int g,i; off_t pos; struct ext2_inode inode; for(g=0;g=0 && read(fd,&inode,sizeof(inode))==sizeof(inode) ) { if( !is_correct_inode(&inode) ) { memset(&inode,0,sizeof(inode)); inode.i_mode=0777|S_IFLNK; inode.i_size=13; inode.i_atime=inode.i_ctime=inode.i_mtime=time(NULL); inode.i_links_count=1; inode.i_blocks=0; strcpy((char*)(&(inode.i_block[0])),"Inode deleted"); lseek(fd,pos,SEEK_SET); write(fd,&inode,sizeof(inode)); } } } } return(1); } static int write_inode( int fd, struct mem_inode_s *inode ) { struct mem_inode_ind_s *ind; if( lseek(fd,(inode->to_block)*blocksize+(inode->block_offset)*sizeof(struct ext2_inode),SEEK_SET)<0 ) { fprintf(stderr,"Write Error: Can't seek\n"); return(0); } if( write(fd,&(inode->inode),sizeof(struct ext2_inode))!=sizeof(struct ext2_inode) ) { fprintf(stderr,"Write Error!\n"); return(0); } for(ind=inode->indirect;ind!=NULL;ind=ind->next) { if( ind->to_block==0 ) continue; if( lseek(fd,(ind->to_block)*blocksize,SEEK_SET)<0 ) { fprintf(stderr,"Write Error: Can't seek\n"); return(0); } if( write(fd,&(ind->data[0]),blocksize)!=blocksize ) { fprintf(stderr,"Write Error!\n"); return(0); } } return(1); } int write_inodes( int fd ) { struct mem_inode_s *ii; int n=0; fix_unused_inodes_on_disk(fd); for(ii=mem_inodes;ii!=NULL;ii=ii->next) { if( ii->need_to_write && ii->to_block>0 ) write_inode(fd,ii); else if( ii->to_block!=ii->block ) n++; } fprintf(stderr,"Error: %d outside inodes not writed!\n",n); return(1); }