void qfree(void **root) { LINK *this; while (*root) { this = (LINK *) * root; *root = this->next; vffree(this->data); vffree(this); } }
void fs_read(loff_t pos,int size,void *data) { CHANGE *walk; int got; #if 1 // TMN const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size; // TMN: const loff_t seekpos_aligned = pos - (pos % 512); // TMN: const size_t seek_delta = (size_t)(pos - seekpos_aligned); // TMN: const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN: char* tmpBuf = vfalloc(readsize_aligned); // TMN: if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",pos); if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %I64d",size,pos); assert(got >= size); got = size; assert(seek_delta + size <= readsize); memcpy(data, tmpBuf+seek_delta, size); vffree(tmpBuf); #else // TMN: if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos); if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos); #endif // TMN: if (got != size) die("Got %d bytes instead of %d at %I64d",got,size,pos); for (walk = changes; walk; walk = walk->next) { if (walk->pos < pos+size && walk->pos+walk->size > pos) { if (walk->pos < pos) memcpy(data,(char *) walk->data+pos-walk->pos,min((size_t)size, (size_t)(walk->size-pos+walk->pos))); else memcpy((char *) data+walk->pos-pos,walk->data,min((size_t)walk->size, (size_t)(size+pos-walk->pos))); } } }
int fs_test(loff_t pos,int size) { void *scratch; int okay; #if 1 // TMN const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size; // TMN: const loff_t seekpos_aligned = pos - (pos % 512); // TMN: scratch = vfalloc(readsize_aligned); if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos); okay = read(fd,scratch,readsize_aligned) == (int)readsize_aligned; vffree(scratch); #else // TMN: if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos); scratch = vfalloc(size); okay = read(fd,scratch,size) == size; vffree(scratch); #endif // TMN: return okay; }
void file_modify(FDSC **curr,unsigned char *fixed) { FDSC **this,*next; if (!(this = file_find(curr,(char *)fixed))) die("Internal error: file_find failed"); switch ((*this)->type) { case fdt_drop: VfatPrint("Dropping %s\n",file_name(fixed)); *fixed = DELETED_FLAG; break; case fdt_undelete: *fixed = *(*this)->name; VfatPrint("Undeleting %s\n",file_name(fixed)); break; default: die("Internal error: file_modify"); } next = (*this)->next; vffree(*this); *this = next; }