/* * traverseDir() * For use with all FATs outside of the initial root directory on * 12 and 16 bit FAT file systems. This is a general purpose routine * that can be used simply to visit all of the nodes in the metadata or * to find the first instance of something, e.g., the first directory * entry where the file is marked deleted. * * Unique Input is: * startAt * starting cluster of the directory * * This is the cluster that is the first one in this directory. * We read it right away, so we can provide it as data to visitNodes(). * Note that we cache this cluster as we read it, because it is * metadata and we cache all metadata. By doing so, we can * keep pointers to directory entries for quickly moving around and * fixing up any problems we find. Of course if we get a big * filesystem with a huge amount of metadata we may be hosed, as * we'll likely run out of memory. * * I believe in the future this will have to be addressed. It * may be possible to do more of the processing of problems * within directories as they are cached, so that when memory * runs short we can free cached directories we are already * finished visiting. * * The remainder of inputs are described in visitNodes() comments. */ void traverseDir(int fd, int32_t startAt, int depth, int descend, int operation, char matchRequired, struct pcdir **found, int32_t *lastDirCluster, struct pcdir **dirEnd, char *recordPath, int *pathLen) { ClusterContents dirdata; int32_t dirdatasize = 0; if (startAt < FIRST_CLUSTER || startAt > LastCluster) return; if (readCluster(fd, startAt, &(dirdata.bytes), &dirdatasize, RDCLUST_DO_CACHE) != RDCLUST_GOOD) { (void) fprintf(stderr, gettext("Unable to get more directory entries!\n")); return; } if (operation == PCFS_TRAVERSE_ALL) { if (Verbose) (void) fprintf(stderr, gettext("Directory traversal enters " "allocation unit %d.\n"), startAt); } visitNodes(fd, startAt, &dirdata, dirdatasize, depth, descend, operation, matchRequired, found, lastDirCluster, dirEnd, recordPath, pathLen); }
SigDenseSet * density(int flag, char *cluster_filename, float par_density,SigDenseSet *sds){ Graph *g; SigDense *sd; char line[MAXLINE]; char clusterName[10]; char edgesNumber[10]; char dump[10]; float dense; if(flag==0){ //einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio sds = initSigDenseSet(); FILE *fp = fopen(cluster_filename, "r"); if(fp == NULL){ cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl; system("pause"); } while(fgets(line, MAXLINE, fp)){ if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = STREND; sscanf (line,"%s %s %s",clusterName,dump,edgesNumber); //diavazei tin proti grammi tou kathe cluster g=readCluster(fp, edgesNumber); //(format:#cluster : #edges) dense= (float)g->edgecount/(g->nodecount*(g->nodecount-1)); /* if(dense>=par_density){*/ //elegxos an einai piknos i oxi o cluster. SigDense *sd = new SigDense(); // an nai apothikeuse allios katestrepse sd->sg = g; insertSigDense(sds, sd); /*} else{ destroyGraph(g); }*/ } fclose (fp); } else if(flag==1){ //den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds for (sd = sds->first->next; sd != NULL; sd=sd->next){ if(sd->sg->nodecount>2){ //elegxos gia to plithos ton korifon dense= (float)sd->sg->edgecount/(sd->sg->nodecount*(sd->sg->nodecount-1)); } else{ dense=0; } if(dense<par_density){ //elegxos an einai piknos i oxi o cluster. sd->prev->next=sd->next; // an oxi, parekampse ton. PROSOXI!!dimiourgia skoupidion(den svino) if(sd->next!=NULL) sd->next->prev=sd->prev; } } } else{ cout<<"The flag is WRONG in density function"<<endl; system("pause"); } return sds; }
/** * Reads the specified cluster into memory. The buffer array should be the size * of a cluster. * TODO: allow buffer size to be smaller than a cluster if there is less than a * full cluster's worth of data. * * * @param fatfs * @param uint the cluster to read * @param unsigned char the buffer to read into * @param uint the size of the buffer * * @return bool true on success, false on failure */ bool readClusterSafe( fatfs* fs, uint cluster, unsigned char* buffer, uint size ){ int startLocation = SEEK_CUR; fseek( fs->fp, fs->clusterSize * cluster, SEEK_SET ); bool result = readCluster( fs, buffer, size ); fseek( fs->fp, startLocation, SEEK_SET ); return result; }
/*--------------------------------------------------------------------------- This function reads the entire file pointed to by handle into buffer. int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize) Where: FileHandle *handle - Pointer to an open file handle uint8_t *buffer - Pointer to a buffer to store the file uint32_t bufferSize - The size of the buffer Returns: -1 for error or the file size for success ---------------------------------------------------------------------------*/ int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize) { if(bufferSize >= handle->FileSize) { uint32_t clusterId = handle->startingCluster; uint32_t read = 0; while(clusterId < FAT32_LAST_CLUSTER) { read += readCluster(clusterId, buffer+read); clusterId = nextFatEntry(clusterId); } return handle->FileSize; } return -1; } // End fatRead()
bool Parser::readCluster( Graph &G, ClusterGraph &C, ClusterGraphAttributes *CA, cluster rootCluster, const XmlTagObject &rootTag) { List<XmlTagObject *> nodeTags; rootTag.findSonXmlTagObjectByName("node", nodeTags); for(XmlTagObject *obj : nodeTags) { const XmlTagObject &nodeTag = *obj; XmlAttributeObject *idAttr; nodeTag.findXmlAttributeObjectByName("id", idAttr); if(!idAttr) { OGDF_ERROR("node is missing an attribute " << "(line " << nodeTag.getLine() << ")."); } // Node is a cluster iff it contains other nodes. XmlTagObject *nodesTag; nodeTag.findSonXmlTagObjectByName("nodes", nodesTag); if(nodesTag) { // Node tag found, therefore it is a cluster. const cluster c = C.newCluster(rootCluster); m_clusterId[idAttr->getValue()] = c; if(!readCluster(G, C, CA, c, *nodesTag)) { return false; } } else { // Node tag not found, therefore it is "normal" node. const node v = G.newNode(); C.reassignNode(v, rootCluster); m_nodeId[idAttr->getValue()] = v; if(CA) { readAttributes(*CA, v, nodeTag); } } } return true; }
/*--------------------------------------------------------------------------- This function reads the entire file pointed to by handle into buffer. int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize) Where: FileHandle *handle - Pointer to an open file handle uint8_t *buffer - Pointer to a buffer to store the file uint32_t bufferSize - The size of the buffer Returns: -1 for error or the file size for success ---------------------------------------------------------------------------*/ int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize) { if(bufferSize >= handle->FileSize){ uint32_t clusterId = handle->startingCluster; uint32_t read = 0; uint32_t i; while(clusterId < FAT32_LAST_CLUSTER){ putStr("file name = "); for(i =0; i < 11; i++){ uart_putc(handle->fileName[i]); } putStr(", cluster = "); hexstring(clusterId); uart_putc('\n'); read += readCluster(clusterId, buffer+read); clusterId = nextFatEntry(clusterId); } return handle->FileSize; } return -1; } // End fatRead()
int main (int argc, const char * argv[]) { FILE* fp;// = fopen("samplefat.bin", "rb"); if (argc == 2) { fp = fopen(argv[1], "rb"); if(fp == NULL) { printf("Invalid file path.\n"); return 0; } } else { printf("usage: %s %s\n", argv[0], "sample.bin"); return 1; } BootStrapSector bss; readBootStrapSector(&bss, fp); if(bss.magic55AA[0] != 0x55 || bss.magic55AA[1] !=0xAA) { printf("Invalid FAT-12 file.\n"); return 1; } sector_t rootDirectorySector = FIRST_FAT_SECTOR + bss.numSectorsInFAT * bss.numCopiesFAT; size_t numSectorsInDirectory = bss.numEntriesRootDir * 32 / bss.numBytesPerSector; sector_t firstClusterSector = rootDirectorySector + numSectorsInDirectory; seekToSector(fp, rootDirectorySector, bss.numBytesPerSector); // Extract int i; int fileCounter = 0; seekToSector(fp, rootDirectorySector, bss.numBytesPerSector); printf("Extracting...\n"); for (i = 0; i < bss.numEntriesRootDir; i++) { DirectoryEntry de; readDirectoryEntry(&de, fp); if (isFile(&de)) { fileCounter++; long offsetToNextDirectoryEntry = ftell(fp); printf("%s.%s%s", de.filename, de.file_extension, (i < bss.numEntriesRootDir ? ", " : "\n")); FILE* fat_file_p = fopen(de.filename, "wb"); UINT16 curCluster = de.start_cluster; //printf("%x\n", curCluster); BYTE buffer[bss.numBytesPerSector * bss.numSectorsPerCluster]; int fileSize = de.file_size; while (curCluster < 0xFF8 && fileSize > 0) { readCluster(fp, curCluster, firstClusterSector, bss.numBytesPerSector, bss.numSectorsPerCluster, buffer); //} if(fileSize < bss.numBytesPerSector * bss.numSectorsPerCluster) { fwrite(buffer, sizeof(BYTE), fileSize, fat_file_p); } else { fwrite(buffer, sizeof(BYTE), sizeof(buffer), fat_file_p); } seekToSector(fp, FIRST_FAT_SECTOR, bss.numBytesPerSector); curCluster = extract12File(fp, curCluster); fileSize -= bss.numBytesPerSector * bss.numSectorsPerCluster; } fclose(fat_file_p); fseek(fp, offsetToNextDirectoryEntry, SEEK_SET); } } printf("\nExtracted: %i files\n", fileCounter); fclose(fp); return 0; }
SigDenseSet * hairCut(int flag, char *cluster_filename, int par_haircut,SigDenseSet *sds){ Graph *g; Node *node; SigDense *sd; int r,i; char line[MAXLINE]; char clusterName[10]; char edgesNumber[10]; char dump[10]; Node **removelist = new Node*[1000]; for(r=0;r<1000;r++){ removelist[r]=NULL; } if(flag==0){ //einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio sds = initSigDenseSet(); FILE *fp = fopen(cluster_filename, "r"); if(fp == NULL){ cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl; system("pause"); } while(fgets(line, MAXLINE, fp)){ if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = STREND; sscanf (line,"%s %s %s",clusterName,dump,edgesNumber); //diavazei tin proti grammi tou kathe cluster g=readCluster(fp, edgesNumber); //(format:#cluster : #edges) r = 0; //vriskei poies korifes tou cluster exoun mikrotero degree for (node = g->nodes; node != NULL; node = node->next){ if (node->degree < par_haircut){ removelist[r++] = node;//cout<<"eppppp "<< node->label<<endl;system("pause"); } } if (r){ //an iparxoun nodes sto removelist...svistous! for (i=0; i<r; i++) removeNode(g, removelist[i]); } if(g->nodecount!=0){ SigDense *sd = new SigDense(); // apothikeuse to ipoloipo ton clusters sti lista sd->sg = g; insertSigDense(sds, sd); } } fclose (fp); } else if(flag==1){ //den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds for (sd = sds->first->next; sd != NULL; sd=sd->next){ r = 0; //vriskei poies korifes tou cluster exoun mikrotero degree for (node = sd->sg->nodes; node != NULL; node = node->next){ if (node->degree < par_haircut){ removelist[r++] = node;//cout<<"eppppp "<< node->label<<endl;system("pause"); } } if (r){ //an iparxoun nodes sto removelist...svistous! for (i=0; i<r; i++) removeNode(sd->sg, removelist[i]); } if(g->nodecount==0){ sd->prev->next=sd->next; // an 0 nodes, parekampse ton. PROSOXI!!dimiourgia skoupidion(den svino) if(sd->next!=NULL) sd->next->prev=sd->prev; } } } delete removelist; return sds; }
SigDenseSet * bestneighbor(int flag,char *initial_filename,char *cluster_filename,float par_bestneighb,SigDenseSet *sds){ Graph *g,*tg; SigDense *sd; Node *node, *tnode,*nnode,*tnode2; char line[MAXLINE]; char clusterName[10]; char edgesNumber[10]; char dump[10]; int orig_degree=0,r,numb_neigh,exist,good_neigh; float score; Edge *edge,*nedge; g=readGraph(initial_filename); //kataskeui tou arxikou grafou Node **neighborlist = new Node*[g->nodecount]; for(r=0;r<g->nodecount;r++){ neighborlist[r]=NULL; } if(flag==0){ //einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio sds = initSigDenseSet(); FILE *fp = fopen(cluster_filename, "r"); if(fp == NULL){ cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl; system("pause"); } while(fgets(line, MAXLINE, fp)){ if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = STREND; sscanf (line,"%s %s %s",clusterName,dump,edgesNumber); //diavazei tin proti grammi tou kathe cluster tg=readCluster(fp, edgesNumber); //(format:#cluster : #edges) numb_neigh=0;exist=0;score=0;good_neigh=0; for(tnode=tg->nodes;tnode!=NULL;tnode=tnode->next){ //euresi ton geitonon ston arxiko grafo for(node=g->nodes;node!=NULL;node=node->next){ // if(strcmp(node->label,tnode->label)==0){ for(edge=node->edges;edge!=NULL;edge=edge->next){ nnode=edge->partner; for(r=0;r<numb_neigh;r++){//elegxos mipos exei xanasinatithei o geitonas if(strcmp(neighborlist[r]->label,nnode->label)==0){ exist=1; break; } } for(tnode2=tg->nodes;tnode2!=NULL;tnode2=tnode2->next){//elegxos mipos o geitonas anikei ston grafo if(strcmp(nnode->label,tnode2->label)==0){ exist=1; break; } } if(exist==0){//an oxi, ton prosthetoume ston pinaka geitonon kai vlepoume an einai best neighborlist[numb_neigh]=nnode; for(nedge=neighborlist[numb_neigh]->edges;nedge!=NULL;nedge=nedge->next){//ipologismos ton "kalon" edges for(tnode2=tg->nodes;tnode2!=NULL;tnode2=tnode2->next){ if(strcmp(nedge->partner->label,tnode2->label)==0){ score++; break; } } } if(score/neighborlist[numb_neigh]->degree>=par_bestneighb){//an mas kanei, vazoume part=1 neighborlist[numb_neigh]->part=1; good_neigh++; // cout<<"enas kalos komvos einai o: "<< neighborlist[numb_neigh]->label<< "me degree"<<neighborlist[numb_neigh]->degree<<endl;system("pause"); } numb_neigh++; score=0; } exist=0; } break; } } } for(r=0;r<numb_neigh;r++){ //prosthetoume tous kalous geitones ston cluster if(neighborlist[r]->part==1){ Node *new_node; new_node=addNode(tg,neighborlist[r]->label); } } tnode=tg->nodes; for(r=0;r<good_neigh;r++){//cout<<"ok "<<tnode->label<<endl;system("pause"); // prosthetoume tis edges gia tous kainourgious komvous for(node=g->nodes;node!=NULL;node=node->next){//cout<<"ok2"<<endl;system("pause"); // if(strcmp(node->label,tnode->label)==0){//cout<<"ok3"<<endl;system("pause"); for(edge=node->edges;edge!=NULL;edge=edge->next){//cout<<"ok4"<<endl;system("pause"); for(tnode2=tg->nodes;tnode2!=NULL;tnode2=tnode2->next){//cout<<"ok5"<<endl;system("pause"); if(strcmp(edge->partner->label,tnode2->label)==0){//cout<<"ok6"<<endl;system("pause"); addEdge(tg,tnode,tnode2,edge->weight); addEdge(tg,tnode2,tnode,edge->weight); } } } break; } } tnode=tnode->next; } if(g->nodecount!=0){ SigDense *sd = new SigDense(); // apothikeuse to ipoloipo ton clusters sti lista sd->sg = tg; insertSigDense(sds, sd); } } fclose(fp); } else if(flag==1){ //den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds for (sd = sds->first->next; sd != NULL; sd=sd->next){ numb_neigh=0;exist=0;score=0;good_neigh=0; for(tnode=sd->sg->nodes;tnode!=NULL;tnode=tnode->next){ //euresi ton geitonon ston arxiko grafo for(node=g->nodes;node!=NULL;node=node->next){ // if(strcmp(node->label,tnode->label)==0){ for(edge=node->edges;edge!=NULL;edge=edge->next){ nnode=edge->partner; for(r=0;r<numb_neigh;r++){//elegxos mipos exei xanasinatithei o geitonas if(strcmp(neighborlist[r]->label,nnode->label)==0){ exist=1; break; } } for(tnode2=sd->sg->nodes;tnode2!=NULL;tnode2=tnode2->next){//elegxos mipos o geitonas anikei ston grafo if(strcmp(nnode->label,tnode2->label)==0){ exist=1; break; } } if(exist==0){//an oxi, ton prosthetoume ston pinaka geitonon kai vlepoume an einai best neighborlist[numb_neigh]=nnode; for(nedge=neighborlist[numb_neigh]->edges;nedge!=NULL;nedge=nedge->next){//ipologismos ton "kalon" edges for(tnode2=sd->sg->nodes;tnode2!=NULL;tnode2=tnode2->next){ if(strcmp(nedge->partner->label,tnode2->label)==0){ score++; break; } } } if(score/neighborlist[numb_neigh]->degree>=par_bestneighb){//an mas kanei, vazoume part=1 neighborlist[numb_neigh]->part=1; good_neigh++; // cout<<"enas kalos komvos einai o: "<< neighborlist[numb_neigh]->label<< "me degree"<<neighborlist[numb_neigh]->degree<<endl;system("pause"); } numb_neigh++; score=0; } exist=0; } break; } } } for(r=0;r<numb_neigh;r++){ //prosthetoume tous kalous geitones ston cluster if(neighborlist[r]->part==1){ Node *new_node; new_node=addNode(sd->sg,neighborlist[r]->label); } } tnode=sd->sg->nodes; for(r=0;r<good_neigh;r++){//cout<<"ok "<<tnode->label<<endl;system("pause"); // prosthetoume tis edges gia tous kainourgious komvous for(node=g->nodes;node!=NULL;node=node->next){//cout<<"ok2"<<endl;system("pause"); // if(strcmp(node->label,tnode->label)==0){//cout<<"ok3"<<endl;system("pause"); for(edge=node->edges;edge!=NULL;edge=edge->next){//cout<<"ok4"<<endl;system("pause"); for(tnode2=sd->sg->nodes;tnode2!=NULL;tnode2=tnode2->next){//cout<<"ok5"<<endl;system("pause"); if(strcmp(edge->partner->label,tnode2->label)==0){//cout<<"ok6"<<endl;system("pause"); addEdge(sd->sg,tnode,tnode2,edge->weight); addEdge(sd->sg,tnode2,tnode,edge->weight); } } } break; } } tnode=tnode->next; } } } else{ cout<<"The flag is WRONG in density function"<<endl; system("pause"); } delete neighborlist; return sds; }
SigDenseSet * outInside(int flag,char *initial_filename,char *cluster_filename,float par_out_in,SigDenseSet *sds){ Graph *g,*tg; SigDense *sd; Node *node, *tnode; char line[MAXLINE]; char clusterName[10]; char edgesNumber[10]; char dump[10]; int orig_degree=0; g=readGraph(initial_filename); //kataskeui tou arxikou grafou if(flag==0){ //einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio sds = initSigDenseSet(); FILE *fp = fopen(cluster_filename, "r"); if(fp == NULL){ cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl; system("pause"); } while(fgets(line, MAXLINE, fp)){ if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = STREND; sscanf (line,"%s %s %s",clusterName,dump,edgesNumber); //diavazei tin proti grammi tou kathe cluster tg=readCluster(fp, edgesNumber); //(format:#cluster : #edges) //cout<<"elegxos tou cluster "<<tg->nodes->label<<endl; for(tnode=tg->nodes;tnode!=NULL;tnode=tnode->next){ //ipologismos tou sinolikou degree ton korifon pou apoteloun ton cluster for(node=g->nodes;node!=NULL;node=node->next){ // if(strcmp(node->label,tnode->label)==0){ orig_degree+=node->degree; break; } } } //cout<<"exoume kai leme: orig_degree= "<<orig_degree<<" kai ta in= "<<tg->edgecount<<endl<<(float)tg->edgecount/(float)orig_degree<<endl; if((float)(tg->edgecount/(float)orig_degree)>=par_out_in){ //elegxos an einai piknos i oxi o cluster. SigDense *sd = new SigDense(); // an nai apothikeuse allios katestrepse sd->sg = tg; insertSigDense(sds, sd); orig_degree=0; } else{ destroyGraph(tg); orig_degree=0; } } fclose (fp); } else if(flag==1){ //den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds for (sd = sds->first->next; sd != NULL; sd=sd->next){ for(tnode=sd->sg->nodes;tnode!=NULL;tnode=tnode->next){ //ipologismos tou sinolikou degree ton korifon pou apoteloun ton cluster for(node=g->nodes;node!=NULL;node=node->next){ // if(strcmp(node->label,tnode->label)==0){ orig_degree+=node->degree; break; } } } if(sd->sg->nodecount<2 || (float)sd->sg->edgecount/orig_degree<par_out_in){ //elegxos sd->prev->next=sd->next; // an oxi, parekampse ton. PROSOXI!!dimiourgia skoupidion(den svino) if(sd->next!=NULL) sd->next->prev=sd->prev; } orig_degree=0; } } else{ cout<<"The flag is WRONG in density function"<<endl; system("pause"); } return sds; }