int fs_write(int fd, void *buf, int len) { if ((fd >= 0) && (fd < NR_FILES) && (curenv->file[fd].opened == true)) { int i; struct inode node; unsigned int ioff = directory_d.entries[fd].inode_offset; readsect((void*)node.data_block_offsets,ioff + 201); int length = min(len,directory_d.entries[fd].file_size-curenv->file[fd].offset); unsigned int begin = curenv->file[fd].offset / 512; unsigned int begin_off = curenv->file[fd].offset % 512; unsigned int end = (curenv->file[fd].offset + length) / 512; unsigned int end_off = (curenv->file[fd].offset + length) % 512; if (begin == end) { char sect[512]; readsect((void*)sect,node.data_block_offsets[begin] + 201); for (i = 0;i < len;i++) { sect[begin_off + i] = ((char*)buf)[i]; } writesect((void*)sect,node.data_block_offsets[begin] + 201); } else { char sect[512]; readsect((void*)sect,node.data_block_offsets[begin] + 201); for (i = 0;i < 512 - begin_off;i++) { sect[begin_off + i] = ((char*)buf)[i]; } writesect((void*)sect,node.data_block_offsets[begin]); buf = ((char*)buf) + 512 - begin_off; for (i = begin + 1;i < end;i++) { writesect(buf,node.data_block_offsets[i] + 201); buf = ((char*)buf)+512; } readsect((void*)sect,node.data_block_offsets[end] + 201); for (i = 0;i < end_off;i++) { sect[i] = ((char*)buf)[i]; } writesect((void*)sect,node.data_block_offsets[end] + 201); } curenv->file[fd].offset += length; return length; } else { printk("fs_write fails!\n"); return -1; } }
void writesector(int sectornumber, char* buffer) { int sec,head,cyl; sec=mod(sectornumber,0x12)+1; head=mod(div(sectornumber,0x12),2); cyl=div(sectornumber,0x24); writesect(buffer,sec,head,cyl); }
/*writes buffer to a sector*/ void writesector(int sectornumber, char* buffer) { int sec,head,cyl; /*convert to CHS*/ sec=mod(sectornumber,0x12)+1; head=mod(mydiv(sectornumber,0x12),2); cyl=mydiv(sectornumber,0x24); writesect(buffer,sec,head,cyl); }