int statistiche(char *dev,int ino) { INODE=ino; struct passwd *pwd; struct group *grp; if((fd=open(dev,O_RDONLY,0))<0) { fprintf(stderr,"Impossibile aprire %s\n",dev); _exit(1); } lseek(fd,1024,0); //SALTO IL BOOT RECORD if(read(fd,&sb,sizeof(sb))!=sizeof(sb)) { fprintf(stderr,"Impossibile leggere il superblocco\n"); _exit(1); } if(sb.s_log_block_size==0) sb.s_log_block_size=1024; else if(sb.s_log_block_size==1) sb.s_log_block_size=2048; else if(sb.s_log_block_size==2) sb.s_log_block_size=4096; uint32_t group = (INODE -1) / sb.s_inodes_per_group; uint32_t index = (INODE -1) % sb.s_inodes_per_group; //VADO AL GROUP DESCRIPTOR if(sb.s_log_block_size==1024) lseek(fd,(sb.s_log_block_size+BOOTSECTOR)+32*group,0); else lseek(fd,sb.s_log_block_size+32*group,0); if(read(fd,&gd,sizeof(gd))!=sizeof(gd)) { fprintf(stderr,"Impossibile leggere il group descriptor\n"); _exit(1); } fprintf(output,"Inode: %d\n",INODE); //VADO ALL'INODE DESIDERATO lseek(fd,gd.bg_inode_table*sb.s_log_block_size+index*sb.s_inode_size,0); char *tipo,*utente,*gruppo; read(fd,&inode,sizeof(inode)); if((pwd = getpwuid(inode.i_uid)) != NULL) utente = pwd->pw_name; if((grp = getgrgid(inode.i_gid)) != NULL) gruppo = grp->gr_name; indirezione(0,0); switch (inode.i_mode & S_IFMT) { case S_IFDIR: tipo="Directory"; break; case S_IFLNK: tipo="Link simbolico"; break; case S_IFCHR: tipo="Device di carattere"; break; case S_IFIFO: tipo="Fifo"; break; case S_IFBLK: tipo="Device di blocco"; break; case S_IFREG: tipo="File regolare"; break; case S_IFSOCK: tipo="Socket"; break; } fprintf(output,"Tipo file: %s\n",tipo); if(!strcmp(tipo,"Link simbolico")){ lseek(fd,gd.bg_inode_table*sb.s_log_block_size+ index*sb.s_inode_size+40,0); unsigned char b[inode.i_size]; read(fd,&b,inode.i_size); b[inode.i_size]='\0'; fprintf(output,"link punta a -> %s\n",b); } else if((!strcmp(tipo,"Device di carattere")) || (!strcmp(tipo,"Device di blocco")) ){ fprintf(output,"Major number %d\n",(((int)buf.st_rdev & 0xFF00) >> 8)); fprintf(output,"Minor number %d\n",(((int)buf.st_rdev & 0x00FF) >> 0)); } else if(!strcmp(tipo,"File regolare")){ fprintf(output,"N. discontinuita': %d\n",discont); fprintf(output,"Dimensione: %d\n",inode.i_size); } else if(!strcmp(tipo,"Socket")){ } else if(!strcmp(tipo,"Fifo")){ } else if(!strcmp(tipo,"Directory")){ } discont=0; fprintf(output,"Proprietario: %s\n",utente); fprintf(output,"Gruppo: %s\n",gruppo); fprintf(output,"%s\n",permessi(inode.i_mode)); fprintf(output,"------------------------------------------------\n"); close(fd); return 0; }