예제 #1
0
cn_t write_file_record (cn_t lcn, cn_t vcn, file_record* fd ){
  cn_t lcn_written;
  if(lcn>MFT_VCN){
    lcn_written = vcn_to_lcn(lcn,vcn);
    write_cluster(lcn_written, (u_int8_t*)fd);
    return lcn_written;
  }
  lcn_written = vcn_to_lcn(MFT_VCN, vcn);
  write_cluster(lcn_written, (u_int8_t*)fd);
  return lcn_written;

}
예제 #2
0
파일: fs.c 프로젝트: mukadr/ghostfs
static int write_header(struct ghostfs *gfs, struct cluster *cluster0)
{
	MD5_CTX md5_ctx;
	unsigned char md5[16];
	int ret;

	MD5_Init(&md5_ctx);
	MD5_Update(&md5_ctx, &gfs->hdr, sizeof(gfs->hdr));
	MD5_Update(&md5_ctx, cluster0, sizeof(*cluster0));
	MD5_Final(md5, &md5_ctx);

	// write md5 of header+root
	ret = stegger_write(gfs->stegger, md5, sizeof(md5), 0);
	if (ret < 0)
		return ret;

	// write header
	ret = stegger_write(gfs->stegger, &gfs->hdr, sizeof(gfs->hdr), 16);
	if (ret < 0)
		return ret;

	// write first cluster
	ret = write_cluster(gfs, cluster0, 0);
	if (ret < 0)
		return ret;

	return 0;
}
예제 #3
0
파일: fs.c 프로젝트: mukadr/ghostfs
int ghostfs_sync(struct ghostfs *gfs)
{
	struct cluster *c;
	int ret, i;

	ret = cluster_get(gfs, 0, &c);
	if (ret < 0)
		return ret;

	ret = write_header(gfs, c);
	if (ret < 0)
		return ret;

	if (!gfs->clusters) // nothing more to sync
		return 0;

	for (i = 1; i < gfs->hdr.cluster_count; i++) {
		c = gfs->clusters[i];

		if (!c || !cluster_dirty(c))
			continue;

		ret = write_cluster(gfs, c, i);
		if (ret < 0)
			return ret;
	}

	return 0;
}
예제 #4
0
파일: fs.c 프로젝트: mukadr/ghostfs
// create a new filesystem
int ghostfs_format(struct stegger *stegger)
{
	struct ghostfs gfs;
	size_t count;
	struct cluster cluster;
	int ret, i;
	const int HEADER_SIZE = 16 + sizeof(struct ghostfs_header);

	gfs.stegger = stegger;

	if (gfs.stegger->capacity < HEADER_SIZE + CLUSTER_SIZE)
		return -ENOSPC;

	count = (gfs.stegger->capacity - HEADER_SIZE) / CLUSTER_SIZE;
	if (count > 0xFFFF) {
		warnx("fs: %lu clusters available, using only %d", count, 0xFFFF);
		count = 0xFFFF;
	}

	gfs.hdr.cluster_count = count;

	ret = read_cluster(&gfs, &cluster, 0);
	if (ret < 0)
		return ret;

	cluster.hdr.next = 0;

	for (i = 0; i < CLUSTER_DATA; i += sizeof(struct dir_entry)) {
		struct dir_entry *e = (struct dir_entry *)&cluster.data[i];
		e->filename[0] = '\0';
	}

	ret = write_header(&gfs, &cluster);
	if (ret < 0)
		return ret;

	for (i = 1; i < count; i++) {
		ret = read_cluster(&gfs, &cluster, i);
		if (ret < 0)
			return ret;

		cluster.hdr.used = 0;

		ret = write_cluster(&gfs, &cluster, i);
		if (ret < 0)
			return ret;
	}

	return 0;
}