/* * adfUndelFile * */ RETCODE adfUndelFile(struct Volume* vol, SECTNUM pSect, SECTNUM nSect, struct bFileHeaderBlock* entry) { long i; char name[MAXNAMELEN+1]; struct bEntryBlock parent; RETCODE rc; struct FileBlocks fileBlocks; /* check if the given parent sector pointer seems OK */ if ( (rc=adfCheckParent(vol,pSect)) != RC_OK) return rc; if (pSect!=entry->parent) { (*adfEnv.wFct)("adfUndelFile : the given parent sector isn't the entry parent"); return RC_ERROR; } adfGetFileBlocks(vol, entry, &fileBlocks); for(i=0; i<fileBlocks.nbData; i++) if ( !adfIsBlockFree(vol,fileBlocks.data[i]) ) return RC_ERROR; else adfSetBlockUsed(vol, fileBlocks.data[i]); for(i=0; i<fileBlocks.nbExtens; i++) if ( !adfIsBlockFree(vol,fileBlocks.extens[i]) ) return RC_ERROR; else adfSetBlockUsed(vol, fileBlocks.extens[i]); free(fileBlocks.data); free(fileBlocks.extens); if (adfReadEntryBlock(vol, pSect, &parent)!=RC_OK) return RC_ERROR; strncpy(name, entry->fileName, entry->nameLen); name[(int)entry->nameLen] = '\0'; /* insert the entry in the parent hashTable, with the headerKey sector pointer */ adfCreateEntry(vol, &parent, name, entry->headerKey); if (isDIRCACHE(vol->dosType)) adfAddInCache(vol, &parent, (struct bEntryBlock *)entry); adfUpdateBitmap(vol); return RC_OK; }
/* * adfCreateDir * */ RETCODE adfCreateDir(struct Volume* vol, SECTNUM nParent, char* name) { SECTNUM nSect; struct bDirBlock dir; struct bEntryBlock parent; if (adfReadEntryBlock(vol, nParent, &parent)!=RC_OK) return RC_ERROR; /* -1 : do not use a specific, already allocated sector */ nSect = adfCreateEntry(vol, &parent, name, -1); if (nSect==-1) { (*adfEnv.wFct)("adfCreateDir : no sector available"); return RC_ERROR; } memset(&dir, 0, sizeof(struct bDirBlock)); dir.nameLen = (char)min(MAXNAMELEN, strlen(name)); memcpy(dir.dirName,name,dir.nameLen); dir.headerKey = nSect; if (parent.secType==ST_ROOT) dir.parent = vol->rootBlock; else dir.parent = parent.headerKey; adfTime2AmigaTime(adfGiveCurrentTime(),&(dir.days),&(dir.mins),&(dir.ticks)); if (isDIRCACHE(vol->dosType)) { /* for adfCreateEmptyCache, will be added by adfWriteDirBlock */ dir.secType = ST_DIR; adfAddInCache(vol, &parent, (struct bEntryBlock *)&dir); adfCreateEmptyCache(vol, (struct bEntryBlock *)&dir, -1); } /* writes the dirblock, with the possible dircache assiocated */ if (adfWriteDirBlock(vol, nSect, &dir)!=RC_OK) return RC_ERROR; adfUpdateBitmap(vol); if (adfEnv.useNotify) (*adfEnv.notifyFct)(nParent,ST_DIR); return RC_OK; }
/* * adfUndelDir * */ RETCODE adfUndelDir(struct Volume* vol, SECTNUM pSect, SECTNUM nSect, struct bDirBlock* entry) { RETCODE rc; struct bEntryBlock parent; char name[MAXNAMELEN+1]; /* check if the given parent sector pointer seems OK */ if ( (rc=adfCheckParent(vol,pSect)) != RC_OK) return rc; if (pSect!=entry->parent) { (*adfEnv.wFct)("adfUndelDir : the given parent sector isn't the entry parent"); return RC_ERROR; } if (!adfIsBlockFree(vol, entry->headerKey)) return RC_ERROR; if (isDIRCACHE(vol->dosType) && !adfIsBlockFree(vol,entry->extension)) return RC_ERROR; if (adfReadEntryBlock(vol, pSect, &parent)!=RC_OK) return RC_ERROR; strncpy(name, entry->dirName, entry->nameLen); name[(int)entry->nameLen] = '\0'; /* insert the entry in the parent hashTable, with the headerKey sector pointer */ adfSetBlockUsed(vol,entry->headerKey); adfCreateEntry(vol, &parent, name, entry->headerKey); if (isDIRCACHE(vol->dosType)) { adfAddInCache(vol, &parent, (struct bEntryBlock *)entry); adfSetBlockUsed(vol,entry->extension); } adfUpdateBitmap(vol); return RC_OK; }
/* * adfCreateFile * */ RETCODE adfCreateFile(struct Volume* vol, SECTNUM nParent, char *name, struct bFileHeaderBlock *fhdr) { SECTNUM nSect; struct bEntryBlock parent; /*puts("adfCreateFile in");*/ if (adfReadEntryBlock(vol, nParent, &parent)!=RC_OK) return RC_ERROR; /* -1 : do not use a specific, already allocated sector */ nSect = adfCreateEntry(vol, &parent, name, -1); if (nSect==-1) return RC_ERROR; /*printf("new fhdr=%d\n",nSect);*/ memset(fhdr,0,512); fhdr->nameLen = (char)min(MAXNAMELEN, strlen(name)); memcpy(fhdr->fileName,name,fhdr->nameLen); fhdr->headerKey = nSect; if (parent.secType==ST_ROOT) fhdr->parent = vol->rootBlock; else if (parent.secType==ST_DIR) fhdr->parent = parent.headerKey; else (*adfEnv.wFct)("adfCreateFile : unknown parent secType"); adfTime2AmigaTime(adfGiveCurrentTime(), &(fhdr->days),&(fhdr->mins),&(fhdr->ticks)); if (adfWriteFileHdrBlock(vol,nSect,fhdr)!=RC_OK) return RC_ERROR; if (isDIRCACHE(vol->dosType)) adfAddInCache(vol, &parent, (struct bEntryBlock *)fhdr); adfUpdateBitmap(vol); if (adfEnv.useNotify) (*adfEnv.notifyFct)(nParent,ST_FILE); return RC_OK; }