예제 #1
0
파일: rle.c 프로젝트: Jack19881218/cavan
char *funrle_data_to(const u8 *data, ssize_t size, int fd_out)
{
	int ret;
	const u8 *data_end;
	u8 tmp;
	char buff[MAX_BUFFER_LEN];
	char *p, *end_p;
	struct progress_bar prg_bar;

	progress_bar_init(&prg_bar, size);
	p = buff;
	end_p = buff + sizeof(buff);

	for (data_end = data + size; data < data_end; data += 2)
	{
		tmp = *data;

		println("tmp = %d", tmp);

		while (p + tmp >= end_p)
		{
			memset(p, data[1], end_p - p);

			ret = ffile_writeto(fd_out, buff, MAX_BUFFER_LEN, 0);
			if (ret < 0)
			{
				error_msg("write file failed");
				return NULL;
			}

			tmp -= end_p - p;
			p = buff;
		}

		memset(p, data[1], tmp);
		p += tmp;

		progress_bar_add(&prg_bar, 2);
	}

	progress_bar_finish(&prg_bar);

	if (p > buff)
	{
		ret = ffile_writeto(fd_out, buff, p - buff, 0);
		if (ret < 0)
		{
			error_msg("write file failed");
			return NULL;
		}
	}

	return (char *) data;
}
예제 #2
0
파일: rle.c 프로젝트: Jack19881218/cavan
char *frle_data_to(const u8 *data, ssize_t size, int fd_out)
{
	int ret;
	const u8 *data_end = data + size;
	u8 tmp;
	u8 buff[MAX_BUFFER_LEN];
	const u8 *p;
	u8 *q, *end_q;
	struct progress_bar prg_bar;

	q = buff;
	end_q = buff + sizeof(buff) - 1;

	progress_bar_init(&prg_bar, size);

	while (data < data_end)
	{
		for (p = data, tmp = *p; tmp == *p && p < data_end; p++);

		if (q >= end_q)
		{
			ret = ffile_writeto(fd_out, buff, q - buff, 0);
			if (ret < 0)
			{
				error_msg("write file failed");
				return NULL;
			}

			q = buff;
		}

		*q++ = p - data;
		*q++ = tmp;

		progress_bar_add(&prg_bar, p - data);

		data = p;
	}

	progress_bar_finish(&prg_bar);

	if (q > buff)
	{
		ret = ffile_writeto(fd_out, buff, q - buff, 0);
		if (ret < 0)
		{
			error_msg("write file failed");
			return NULL;
		}
	}

	return (char *) data;
}
예제 #3
0
int bootimg_pack(struct bootimg_pack_option *option)
{
	int fd;
	int ret;
	int image_count;
	struct bootimg_header hdr;
	struct bootimg_image images[4];
	struct bootimg_image *p, *p_end;
	struct cavan_sha_context context;

	if (option->kernel == NULL || option->ramdisk == NULL)
	{
        pr_red_info("no kernel or ramdisk image specified");
		return -EINVAL;
	}

	fd = open(option->output, O_WRONLY | O_CREAT | O_TRUNC, 0777);
	if (fd < 0)
	{
		pr_error_info("open file `%s' failed", option->output);
		return fd;
	}

	ret = lseek(fd, sizeof(hdr), SEEK_SET);
	if (ret < 0)
	{
		pr_red_info("cavan_file_seek_page_align");
		goto out_close_fd;
	}

	cavan_sha1_context_init(&context);

	ret = cavan_sha_init(&context);
	if (ret < 0)
	{
		pr_red_info("cavan_sha_init");
		goto out_close_fd;
	}

	memset(&hdr, 0, sizeof(hdr));
	memcpy(hdr.magic, BOOT_MAGIC, sizeof(hdr.magic));

	if (option->config)
	{
		ret = bootimg_parse_config_file(&hdr, option->config);
		if (ret < 0)
		{
			pr_red_info("bootimg_parse_config_file");
			goto out_close_fd;
		}
	}
	else
	{
		memcpy(hdr.unused, option->unused, sizeof(hdr.unused));

		hdr.page_size = option->page_size;
		hdr.kernel_addr = option->kernel_addr ?: option->base + option->kernel_offset;
		hdr.ramdisk_addr = option->ramdisk_addr ?: option->base + option->ramdisk_offset;
		hdr.second_addr = option->second_addr ?: option->base + option->second_offset;
		hdr.tags_addr = option->tags_addr ?: option->base + option->tags_offset;

		if (option->name)
		{
			strncpy((char *) hdr.name, option->name, sizeof(hdr.name));
		}

		if (option->cmdline)
		{
			bootimg_copy_cmdline(&hdr, option->cmdline);
		}
	}

	images[0].name = option->kernel;
	images[0].size_addr = &hdr.kernel_size;

	images[1].name = option->ramdisk;
	images[1].size_addr = &hdr.ramdisk_size;

	images[2].name = option->second;
	images[2].size_addr = &hdr.second_size;

	image_count = 3;

	if (option->dt)
	{
		images[image_count].name = option->dt;
		images[image_count++].size_addr = &hdr.dt_size;
	}

	for (p = images, p_end = p + image_count; p < p_end; p++)
	{
		if (p->name)
		{
			println("write image %s", p->name);

			ret = bootimg_write_image(fd, p->name, p->size_addr, hdr.page_size, &context);
			if (ret < 0)
			{
				pr_red_info("bootimg_write_image");
				goto out_close_fd;
			}
		}
		else
		{
			*p->size_addr = 0;
		}

		cavan_sha_update(&context, p->size_addr, sizeof(unsigned));
	}

	if (option->remain)
	{
		println("write remain image %s", option->remain);

		ret = file_copy3(option->remain, fd);
		if (ret < 0)
		{
			pr_red_info("file_copy3");
			goto out_close_fd;
		}
	}

	if (option->check_all)
	{
		cavan_sha_update(&context, &hdr.tags_addr, sizeof(hdr.tags_addr));
		cavan_sha_update(&context, &hdr.page_size, sizeof(hdr.page_size));
		cavan_sha_update(&context, hdr.unused, sizeof(hdr.unused));
		cavan_sha_update(&context, hdr.name, sizeof(hdr.name));
		cavan_sha_update(&context, hdr.cmdline, sizeof(hdr.cmdline));

		if (hdr.extra_cmdline[0])
		{
			cavan_sha_update(&context, hdr.extra_cmdline, sizeof(hdr.extra_cmdline));
		}
	}

	cavan_sha_finish(&context, (u8 *) hdr.id);

	bootimg_header_dump(&hdr);

	ret = ffile_writeto(fd, &hdr, sizeof(hdr), 0);
	if (ret < 0)
	{
		pr_red_info("ffile_writeto");
		goto out_close_fd;
	}

	pr_green_info("pack %s successfull", option->output);

out_close_fd:
	close(fd);
	return ret;
}
예제 #4
0
static ssize_t ext2_write_block(struct ext2_desc *desc, u64 index, const void *blocks, size_t count)
{
	off_t offset = block_index_to_offset(desc, index);

	return ffile_writeto(desc->fd, blocks, desc->block_size * count, offset);
}
예제 #5
0
파일: vfat.c 프로젝트: Jack19881218/cavan
static ssize_t vfat_app_device_write_byte(struct cavan_block_device *bdev, u64 index, u32 offset, const void *buff, size_t size)
{
	return ffile_writeto(*(int *) bdev->context, buff, size, (index << bdev->block_shift) + offset);
}
예제 #6
0
파일: vfat.c 프로젝트: Jack19881218/cavan
static ssize_t vfat_app_device_write_block(struct cavan_block_device *bdev, u64 index, const void *buff, size_t count)
{
	return ffile_writeto(*(int *) bdev->context, buff, count << bdev->block_shift, index << bdev->block_shift);
}