/* * adfWriteDataBlock * */ RETCODE adfWriteDataBlock(struct Volume *vol, SECTNUM nSect, void *data) { unsigned char buf[512]; uint32_t newSum; struct bOFSDataBlock *dataB; RETCODE rc = RC_OK; newSum = 0L; if (isOFS(vol->dosType)) { dataB = (struct bOFSDataBlock *)data; dataB->type = T_DATA; memcpy(buf,dataB,512); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_DATA); #endif newSum = adfNormalSum(buf,20,512); swLong(buf+20,newSum); /* *(int32_t*)(buf+20) = swapLong((unsigned char*)&newSum);*/ adfWriteBlock(vol,nSect,buf); } else { adfWriteBlock(vol,nSect,data); } /*printf("adfWriteDataBlock %ld\n",nSect);*/ return rc; }
/* * adfWriteBootBlock * * * write bootcode ? */ RETCODE adfWriteBootBlock(struct Volume* vol, struct bBootBlock* boot) { unsigned char buf[LOGICAL_BLOCK_SIZE*2]; unsigned long newSum; boot->dosType[0] = 'D'; boot->dosType[1] = 'O'; boot->dosType[2] = 'S'; memcpy(buf, boot, LOGICAL_BLOCK_SIZE*2); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_BOOT); #endif if (boot->rootBlock==880 || boot->data[0]!=0) { newSum = adfBootSum(buf); /*fprintf(stderr,"sum %x %x\n",newSum,adfBootSum2(buf));*/ swLong(buf+4,newSum); /* *(unsigned long*)(buf+4) = swapLong((unsigned char*)&newSum);*/ } /* dumpBlock(buf); dumpBlock(buf+512); */ if (adfWriteBlock(vol, 0, buf)!=RC_OK) return RC_ERROR; if (adfWriteBlock(vol, 1, buf+512)!=RC_OK) return RC_ERROR; /*puts("adfWriteBootBlock");*/ return RC_OK; }
/* * adfWriteRootBlock * * */ RETCODE adfWriteRootBlock(struct Volume* vol, long nSect, struct bRootBlock* root) { unsigned char buf[LOGICAL_BLOCK_SIZE]; unsigned long newSum; root->type = T_HEADER; root->headerKey = 0L; root->highSeq = 0L; root->hashTableSize = HT_SIZE; root->firstData = 0L; /* checkSum, hashTable */ /* bmflag */ /* bmPages, bmExt */ root->nextSameHash = 0L; root->parent = 0L; root->secType = ST_ROOT; memcpy(buf, root, LOGICAL_BLOCK_SIZE); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_ROOT); #endif newSum = adfNormalSum(buf,20,LOGICAL_BLOCK_SIZE); swLong(buf+20, newSum); /* *(unsigned long*)(buf+20) = swapLong((unsigned char*)&newSum);*/ /* dumpBlock(buf);*/ if (adfWriteBlock(vol, nSect, buf)!=RC_OK) return RC_ERROR; /*printf("adfWriteRootBlock %ld\n",nSect);*/ return RC_OK; }
/* * adfWriteBitmapExtBlock * */ RETCODE adfWriteBitmapExtBlock(struct Volume* vol, SECTNUM nSect, struct bBitmapExtBlock* bitme) { uint8_t buf[LOGICAL_BLOCK_SIZE]; memcpy(buf,bitme, LOGICAL_BLOCK_SIZE); #ifdef LITT_ENDIAN /* little to big */ swapEndian(buf, SWBL_BITMAPE); #endif /* dumpBlock((uint8_t*)buf);*/ if (adfWriteBlock(vol, nSect, (uint8_t*)buf)!=RC_OK) return RC_ERROR; return RC_OK; }
/* * adfWriteEntryBlock * */ RETCODE adfWriteEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock *ent) { unsigned char buf[512]; uint32_t newSum; memcpy(buf, ent, sizeof(struct bEntryBlock)); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_ENTRY); #endif newSum = adfNormalSum(buf,20,sizeof(struct bEntryBlock)); swLong(buf+20, newSum); if (adfWriteBlock(vol, nSect, buf)!=RC_OK) return RC_ERROR; return RC_OK; }
/* * adfWriteBitmapBlock * * OK */ RETCODE adfWriteBitmapBlock(struct Volume* vol, SECTNUM nSect, struct bBitmapBlock* bitm) { uint8_t buf[LOGICAL_BLOCK_SIZE]; uint32_t newSum; memcpy(buf,bitm,LOGICAL_BLOCK_SIZE); #ifdef LITT_ENDIAN /* little to big */ swapEndian(buf, SWBL_BITMAP); #endif newSum = adfNormalSum(buf, 0, LOGICAL_BLOCK_SIZE); swLong(buf,newSum); /* dumpBlock((uint8_t*)buf);*/ if (adfWriteBlock(vol, nSect, (uint8_t*)buf)!=RC_OK) return RC_ERROR; return RC_OK; }
/* * adfWriteFileHdrBlock * */ RETCODE adfWriteFileHdrBlock(struct Volume *vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr) { unsigned char buf[512]; uint32_t newSum; RETCODE rc = RC_OK; /*printf("adfWriteFileHdrBlock %ld\n",nSect);*/ fhdr->type = T_HEADER; fhdr->dataSize = 0; fhdr->secType = ST_FILE; memcpy(buf, fhdr, sizeof(struct bFileHeaderBlock)); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_FILE); #endif newSum = adfNormalSum(buf,20,sizeof(struct bFileHeaderBlock)); swLong(buf+20, newSum); /* *(uint32_t*)(buf+20) = swapLong((unsigned char*)&newSum);*/ adfWriteBlock(vol, nSect, buf); return rc; }
/* * adfWriteDirCblock * */ RETCODE adfWriteDirCBlock(struct Volume* vol, int32_t nSect, struct bDirCacheBlock* dirc) { unsigned char buf[LOGICAL_BLOCK_SIZE]; uint32_t newSum; dirc->type = T_DIRC; dirc->headerKey = nSect; memcpy(buf, dirc, LOGICAL_BLOCK_SIZE); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_CACHE); #endif newSum = adfNormalSum(buf, 20, LOGICAL_BLOCK_SIZE); swLong(buf+20,newSum); /* *(int32_t*)(buf+20) = swapLong((unsigned char*)&newSum);*/ if (adfWriteBlock(vol, nSect, buf)!=RC_OK) return RC_ERROR; /*puts("adfWriteDirCBlock");*/ return RC_OK; }
/* * adfWriteFileExtBlock * */ RETCODE adfWriteFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext) { unsigned char buf[512]; uint32_t newSum; RETCODE rc = RC_OK; fext->type = T_LIST; fext->secType = ST_FILE; fext->dataSize = 0L; fext->firstData = 0L; memcpy(buf,fext,512); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_FEXT); #endif newSum = adfNormalSum(buf,20,512); swLong(buf+20,newSum); /* *(int32_t*)(buf+20) = swapLong((unsigned char*)&newSum);*/ adfWriteBlock(vol,nSect,buf); return rc; }
/* * adfWriteDirBlock * */ RETCODE adfWriteDirBlock(struct Volume* vol, SECTNUM nSect, struct bDirBlock *dir) { unsigned char buf[512]; uint32_t newSum; /*printf("wdirblk=%d\n",nSect);*/ dir->type = T_HEADER; dir->highSeq = 0; dir->hashTableSize = 0; dir->secType = ST_DIR; memcpy(buf, dir, sizeof(struct bDirBlock)); #ifdef LITT_ENDIAN swapEndian(buf, SWBL_DIR); #endif newSum = adfNormalSum(buf,20,sizeof(struct bDirBlock)); swLong(buf+20, newSum); if (adfWriteBlock(vol, nSect, buf)!=RC_OK) return RC_ERROR; return RC_OK; }