Exemplo n.º 1
0
/*
 * 生成文件。该程序将硬盘中文件系统之后的附加文件数据读取出来,并以
 * 文件形式写入文件系统。关于附加文件数据参见mkfs。NOTE! 这是一个重
 * 要的函数,在这些调试函数中占有重要地位,千万别删除它,谨慎修改,
 * 保持与mkfs同步!
 */
void produce_files(unsigned char dev)
{
	struct addition * psadd;/* 附加数据的格式说明数据结构指针 */
	unsigned long nrblock;	/* 要读取的硬盘块号,硬盘块从0编号 */
	struct buffer_head * bh;
	FILEDESC desc;
	char filename[256] = "/";
	char buff[BUFFER_SIZE] = {0};
	int i, onewc, leftc;/* onewc: 一次写入字节数,leftc: 剩余字节数 */
	unsigned short oldfs;
	
	nrblock = super.size;
	psadd = (struct addition *)buff;
	/* 不停读取附加数据块,生成文件 */
	while(1) {
		bh = bread(dev, nrblock++);
		memcpy(buff, bh->p_data, BUFFER_SIZE);
		brelse(bh);
		
		/* 处理文件对应的第一个硬盘块 */
		if(!psadd->fileflag)
			break;
		i = sizeof(struct addition);
		/* filename[0] -- '/' */
		memcpy(&filename[1], &buff[i], psadd->namelen);
		filename[psadd->namelen+1] = 0;
		oldfs = set_fs_kernel();
		desc = sys_creat(filename, FILE_FILE | FILE_RW);
		set_fs(oldfs);
		i += psadd->namelen;
		leftc = psadd->datalen;
		onewc = BUFFER_SIZE-i;
		onewc = onewc>leftc ? leftc : onewc;
		leftc -= onewc;
		oldfs = set_fs_kernel();
		sys_write(desc, &buff[i], onewc);
		set_fs(oldfs);

		/* 处理文件数据对应的后续硬盘块 */
		while(leftc) {
			onewc = BUFFER_SIZE;
			onewc = onewc>leftc ? leftc : onewc;
			leftc -= onewc;
			bh = bread(dev, nrblock++);
			oldfs = set_fs_kernel();
			sys_write(desc, bh->p_data, onewc);
			set_fs(oldfs);
			brelse(bh);
		}
		
		sys_close(desc);
	}
}
int rdr_save_8m(const char *dir, const char *name, char *postfix,
			const void *address, u32 length)
{
	int fd;
	long bytes;
	mm_segment_t old_fs;
	char xname[RDR_FNAME_LEN] = {0};

	if (NULL == dir || NULL == name || postfix == NULL) {
		pr_err("rdr:%s():file name and dir shouldnt null\n", __func__);
		return -1;
	}

	if ((strlen((const char *)dir) + strlen((const char *)name) +
		strlen(postfix) + 1) >= RDR_FNAME_LEN) {
		pr_err("rdr:%s():error:dir is too long, exit.\n", __func__);
		return -1;
	}

	old_fs = get_fs();
	set_fs(KERNEL_DS);

	memset(xname, 0, sizeof(xname));
	snprintf(xname, sizeof(xname), "%s%s/", dir, name);
	rdr_create_dir(xname);
	memset(xname, 0, sizeof(xname));
	snprintf(xname, sizeof(xname), "%s%s/%s.bin", dir, name, postfix);

	fd = sys_creat(xname, 0644);
	if (fd < 0) {
		pr_err("rdr:%s():create file %s err.\n", __func__, xname);
		set_fs(old_fs);
		return -1;
	}

	bytes = sys_write((unsigned int)fd, (const char *)address, length);
	if ((u32)bytes != length) {
		DUMP_LOG((int)bytes);
		rdr_file_close(fd);
		set_fs(old_fs);
		return -1;
	}
	sys_fsync(fd);
	rdr_file_close(fd);
	set_fs(old_fs);
	pr_info("rdr:save file %s success ...", xname);

	return 0;
}
Exemplo n.º 3
0
bool syscall(uint32_t sysno, uint32_t *args)
{
	uint8_t *readbuf = (uint8_t *)args[1];
        switch (sysno) {
                case SYS_EXIT:
			sys_exit((uint32_t)args[0]);
                        break;
                case SYS_OPEN:
			Return = sys_open((uint8_t *)args[0], (uint32_t)args[1]);
			printf("fd = %d\n", Return);
                        break;
                case SYS_CLOSE:
			Return = sys_close((uint32_t)args[0]);
                        break;
                case SYS_READ:
			readbuf = sys_read((uint32_t)args[0], (uint8_t *)args[1], (uint32_t)args[2]);
                        printf("always read buf:%s\n", readbuf);
			break;
                case SYS_WRITE:
			Return = sys_write((uint32_t)args[0], (uint8_t *)args[1], (uint32_t)args[2]);
                        break;
                case SYS_KILL:
			sys_kill((uint32_t)args[0], (uint32_t)args[1]);
                        break;
                case SYS_MALLOC:
			ReturnVoid = sys_malloc((uint32_t)args[0]);
			break;
                case SYS_FREE:
			sys_free((uint8_t *)args[0]);
                        break;
                case SYS_CREAT:
			Return = sys_creat((uint8_t *)args[0], (uint32_t)args[1]);
                        break;
                case SYS_LSEEK:
			sys_lseek((uint32_t)args[0], (uint32_t)args[1], (uint32_t)args[2]);
                        break;
                default:
                        // Error sysno
                        break;
        }
        
        return true;
}
Exemplo n.º 4
0
/* Note: it is necessary to treat mode as an unsigned int,
 * with the corresponding cast to a signed int to insure that the 
 * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
 * and the register representation of a signed int (msr in 64-bit mode) is performed.
 */
asmlinkage long compat_sys_creat(const char __user * pathname, u32 mode)
{
	return sys_creat(pathname, (int)mode);
}
Exemplo n.º 5
0
int wsys_creat(const smb_ucs2_t *wfname, mode_t mode)
{
	pstring fname;
	return sys_creat(unicode_to_unix(fname,wfname,sizeof(fname)), mode);
}
int bsp_om_save_loop_file(char * dirName, char *fileHeader, void * address, u32 length)
{
    int ret = BSP_OK;
    int fd;
    int bytes;
    mm_segment_t old_fs;
    char newFileName[OM_DUMP_FILE_NAME_LENGTH] = {0};

    /* 进入目录 */
    if (NULL == dirName || NULL == fileHeader)
    {
        om_error("<bsp_om_save_loop_file>, file name NULL!\n");
        return BSP_ERROR;
    }
    if ((strlen((const char*)dirName) + strlen((const char*)fileHeader)) >= OM_DUMP_FILE_NAME_LENGTH)
    {
        om_error("<bsp_om_save_loop_file>, file name too long!\n");
        return BSP_ERROR;
    }

    old_fs = get_fs();
    set_fs(KERNEL_DS);

    fd = om_open_dir(dirName);
    if(fd < 0)
    {
        om_error("<bsp_om_save_loop_file>, open om dir failed! ret = %d\n", ret);
        ret = BSP_ERROR;
        goto out;
    }

    ret = om_clear_old_file(fd, fileHeader);
    if(BSP_OK != ret)
    {
        om_error("<bsp_om_save_loop_file>, clear old file failed! ret = %d\n", ret);
        ret = BSP_ERROR;
        goto out;
    }

    om_close_dir(fd);

    //新文件名:0
    memset(newFileName, 0, sizeof(newFileName));
    snprintf(newFileName, sizeof(newFileName), "%s%s%02d.bin", dirName, fileHeader, 0);
    fd = sys_creat(newFileName, 0755);
    if(fd < 0)
    {
        om_error("<bsp_om_save_loop_file>, creat file failed! ret = %d\n", ret);
        ret = BSP_ERROR;
        goto out;
    }

    bytes = sys_write(fd, address, length);

    if(bytes != length)
    {
        om_error("<bsp_om_save_loop_file>, write data to file failed! ret = %d\n", bytes);
        ret = BSP_ERROR;
        (void)sys_close(fd);
        goto out;
    }

     ret = sys_close(fd);
    if(0 != ret)
    {
        om_error("<bsp_om_save_loop_file>, close file failed! ret = %d\n", ret);
        ret = BSP_ERROR;
        goto out;
    }

    ret = BSP_OK;

out:
    set_fs(old_fs);
    return ret;
}
Exemplo n.º 7
0
}

void creat_lseek_read_write_open_close_file_test(void)
{
	int count = 0;
	char buff_in[100] = "Hello world!\nI'm writing a small OS.\nThanks.";
	char buff_out[100] = {0};
	char filename[50] = {0};
	unsigned short oldfs;

	/* 已创建了内核默认的最多磁盘存储文件数,则停止 */
	while((++count) < NR_D_INODE) {

		_k_printf("This is the content will be written: \n%s\n\n", buff_in);

		
		sprintf(filename, "/hello--%d.txt", count);
		_k_printf("%s\n", filename);
		/* 创建文件并写入 */
		oldfs = set_fs_kernel();
		FILEDESC desc = sys_creat(filename, FILE_FILE | FILE_RW);
		set_fs(oldfs);
		if(-1 == desc) {
			k_printf("creat_lseek_...: Create file failed!");
			return;
		}
		d_printf("Create file return.\n");
		if(-1 == sys_lseek(desc, 995920, SEEK_SET)) {
			k_printf("creat_lseek_...: Lseek file failed!");
			return;
		}
		d_printf("Lseek file return.\n");
		oldfs = set_fs_kernel();
		if(-1 == sys_write(desc, buff_in, 1 + strlen(buff_in))) {
			set_fs(oldfs);
			k_printf("creat_lseek_...: Write file failed!");
			return;
		}
		set_fs(oldfs);
		d_printf("Write file return.\n");
		if(-1 == sys_close(desc)) {
			k_printf("creat_lseek_...: Close file failed!");
			return;
		}
		d_printf("Close file return.\n");


		/* 打印根目录含有的文件 */
		print_dir("/");

		/* 打开之前创建的文件,读取 */
		oldfs = set_fs_kernel();
		if(-1 == (desc = sys_open(filename, O_RW))) {
			set_fs(oldfs);
			k_printf("creat_lseek_...: Open file failed!");
			return;
		}
		set_fs(oldfs);
		d_printf("Open file return.\n");
		if(-1 == sys_lseek(desc, 995920, SEEK_SET)) {
			k_printf("creat_lseek_...: Lseek file failed!");
			return;
		}
		d_printf("Lseek file return.\n");
		oldfs = set_fs_kernel();
		if(-1 == sys_read(desc, buff_out, 1 + strlen(buff_in))) {
			set_fs(oldfs);
			k_printf("creat_lseek_...: Read file failed!");
			return;
		}
		set_fs(oldfs);
		d_printf("Read file return.\n");
		if(-1 == sys_close(desc)) {
			k_printf("creat_lseek_...: Close file failed!");
			return;
		}
		d_printf("Close file return.\n");

		
		_k_printf("This is the content of READ file: \n%s\n\n", buff_out);
/*
 * Will be obsoleted ...
 */
int rdr_save_file(const char *dir, const char *file_header,
			const void *address, u32 length)
{
	int fd, ret;
	long bytes;
	mm_segment_t old_fs;
	char new_filename[RDR_FNAME_LEN] = {0};

	if (NULL == dir || NULL == file_header) {
		DUMP_LOG(0);
		return -1;
	}

	if ((strlen((const char *)dir) + strlen((const char *)file_header))
				>= RDR_FNAME_LEN) {
		DUMP_LOG(0);
		return -1;
	}

	old_fs = get_fs();
	set_fs(KERNEL_DS);

	fd = rdr_open_dir(dir);
	if (fd < 0) {
		DUMP_LOG(fd);
		set_fs(old_fs);
		return -1;
	}

	ret = del_old_file(dir, file_header, (unsigned int)fd, file_header);
	if (0 != ret) {
		DUMP_LOG(ret);
		rdr_file_close(fd);
		set_fs(old_fs);
		return -1;
	}

	rdr_file_close(fd);

	memset(new_filename, 0, sizeof(new_filename));
	snprintf(new_filename, sizeof(new_filename), "%s%s%02d.bin",
			dir, file_header, 0);

	fd = sys_creat(new_filename, 0644);
	if (fd < 0) {
		DUMP_LOG(fd);
		set_fs(old_fs);
		return -1;
	}

	bytes = sys_write((unsigned int)fd, (const char *)address, length);
	if ((u32)bytes != length) {
		DUMP_LOG((int)bytes);
		rdr_file_close(fd);
		set_fs(old_fs);
		return -1;
	}
	sys_fsync(fd);
	rdr_file_close(fd);
	set_fs(old_fs);
	pr_info("rdr:save file %s success ...", new_filename);

	return 0;
}