Пример #1
0
Файл: fs.c Проект: CunNH3/oslab
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;
	}
}
Пример #2
0
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);
}
Пример #3
0
/*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);
}