int write_block(partition_map_header *map, unsigned long num, char *buf) { int f; f = map->logical_block / PBLOCK_SIZE; return write_media(map->fd, num*f, buf); }
long write_deblock_media(MEDIA m, long long offset, unsigned long count, void *address) { DEBLOCK_MEDIA a; long rtn_value; unsigned long next_size; unsigned long partial_offset; unsigned long partial_count; long long cur_offset; unsigned long remainder; unsigned char *addr; a = (DEBLOCK_MEDIA) m; rtn_value = 0; if (a == 0) { /* no media */ } else if (a->m.kind != deblock_info.kind) { /* wrong kind - XXX need to error here - this is an internal problem */ } else if (count <= 0 || count % a->m.grain != 0) { /* can't handle size */ } else if (offset < 0 || offset % a->m.grain != 0) { /* can't handle offset */ } else if (a->need_filtering == 0) { rtn_value = write_media(a->next_media, offset, count, address); } else { next_size = a->next_block_size; addr = address; cur_offset = offset; remainder = count; rtn_value = 1; /* write partial */ partial_offset = cur_offset % next_size; if (partial_offset != 0) { partial_count = next_size - partial_offset; if (partial_count > remainder) { partial_count = remainder; } rtn_value = read_media(a->next_media, cur_offset - partial_offset, next_size, a->buffer); if (rtn_value != 0) { memcpy (a->buffer + partial_offset, addr, partial_count); rtn_value = write_media(a->next_media, cur_offset - partial_offset, next_size, a->buffer); addr += partial_count; cur_offset += partial_count; remainder -= partial_count; } } /* write fulls as long as needed */ if (rtn_value != 0 && remainder > next_size) { partial_count = remainder - (remainder % next_size); rtn_value = write_media(a->next_media, cur_offset, partial_count, addr); addr += partial_count; cur_offset += partial_count; remainder -= partial_count; } /* write partial */ if (rtn_value != 0 && remainder > 0) { partial_count = remainder; rtn_value = read_media(a->next_media, cur_offset, next_size, a->buffer); if (rtn_value != 0) { memcpy (a->buffer, addr, partial_count); rtn_value = write_media(a->next_media, cur_offset, next_size, a->buffer); } } } /* recompute size to handle file media */ a->m.size_in_bytes = media_total_size(a->next_media); return rtn_value; }
int write_block(partition_map_header *map, unsigned long num, char *buf) { return write_media(map->m, ((long long) num) * map->logical_block, PBLOCK_SIZE, (void *)buf); }