MCPcopy Create free account
hub / github.com/davidgiven/fluxengine / adfCreateNextFileBlock

Function adfCreateNextFileBlock

dep/adflib/src/adf_file.c:525–620  ·  view source on GitHub ↗

* adfCreateNextFileBlock * */

Source from the content-addressed store, hash-verified

523 *
524 */
525SECTNUM adfCreateNextFileBlock(struct File* file)
526{
527 SECTNUM nSect, extSect;
528 struct bOFSDataBlock *data;
529 unsigned int blockSize;
530 int i;
531/*puts("adfCreateNextFileBlock");*/
532 blockSize = file->volume->datablockSize;
533 data = file->currentData;
534
535 /* the first data blocks pointers are inside the file header block */
536 if (file->nDataBlock<MAX_DATABLK) {
537 nSect = adfGet1FreeBlock(file->volume);
538 if (nSect==-1) return -1;
539/*printf("adfCreateNextFileBlock fhdr %ld\n",nSect);*/
540 if (file->nDataBlock==0)
541 file->fileHdr->firstData = nSect;
542 file->fileHdr->dataBlocks[MAX_DATABLK-1-file->nDataBlock] = nSect;
543 file->fileHdr->highSeq++;
544 }
545 else {
546 /* one more sector is needed for one file extension block */
547 if ((file->nDataBlock%MAX_DATABLK)==0) {
548 extSect = adfGet1FreeBlock(file->volume);
549/*printf("extSect=%ld\n",extSect);*/
550 if (extSect==-1) return -1;
551
552 /* the future block is the first file extension block */
553 if (file->nDataBlock==MAX_DATABLK) {
554 file->currentExt=(struct bFileExtBlock*)malloc(sizeof(struct bFileExtBlock));
555 if (!file->currentExt) {
556 adfSetBlockFree(file->volume, extSect);
557 (*adfEnv.eFct)("adfCreateNextFileBlock : malloc");
558 return -1;
559 }
560 file->fileHdr->extension = extSect;
561 }
562
563 /* not the first : save the current one, and link it with the future */
564 if (file->nDataBlock>=2*MAX_DATABLK) {
565 file->currentExt->extension = extSect;
566/*printf ("write ext=%d\n",file->currentExt->headerKey);*/
567 adfWriteFileExtBlock(file->volume, file->currentExt->headerKey,
568 file->currentExt);
569 }
570
571 /* initializes a file extension block */
572 for(i=0; i<MAX_DATABLK; i++)
573 file->currentExt->dataBlocks[i] = 0L;
574 file->currentExt->headerKey = extSect;
575 file->currentExt->parent = file->fileHdr->headerKey;
576 file->currentExt->highSeq = 0L;
577 file->currentExt->extension = 0L;
578 file->posInExtBlk = 0L;
579/*printf("extSect=%ld\n",extSect);*/
580 }
581 nSect = adfGet1FreeBlock(file->volume);
582 if (nSect==-1)

Callers 1

adfWriteFileFunction · 0.85

Calls 4

adfGet1FreeBlockFunction · 0.85
adfSetBlockFreeFunction · 0.85
adfWriteFileExtBlockFunction · 0.85
adfWriteDataBlockFunction · 0.85

Tested by

no test coverage detected