Beispiel #1
0
void *slice_read(const unsigned char *sha1, size_t *outsize)
{
	struct slice_file *file = slice_file_read(sha1);
	struct strbuf buf = STRBUF_INIT;
	void *object;

	if (!file)
		goto err;

	*outsize = 0;
	for (uint32_t i = 0; i < file->nr_slices; i++) {
		size_t size;
		void *sbuf;

		sbuf = sha1_file_read(file->slices[i].sha1, &size);
		if (!sbuf)
			goto err;
		strbuf_add(&buf, sbuf, size);
		free(sbuf);
		*outsize += size;
	}

	object = xmalloc(*outsize);
	strbuf_copyout(&buf, object, *outsize);
	free(file);
	strbuf_release(&buf);
	return object;
err:
	free(file);
	strbuf_release(&buf);
	return NULL;
}
Beispiel #2
0
int snap_init(const char *farm_dir)
{
	int fd, ret = -1;
	struct strbuf buf = STRBUF_INIT;

	strbuf_addstr(&buf, farm_dir);
	strbuf_addf(&buf, "/%s", "user_snap");

	if (!strlen(snap_log_path))
		strbuf_copyout(&buf, snap_log_path, sizeof(snap_log_path));

	fd = open(snap_log_path, O_CREAT | O_EXCL, 0666);
	if (fd < 0) {
		if (errno != EEXIST) {
			sd_err("%m");
			goto out;
		}
	}

	ret = 0;
	close(fd);
out:
	strbuf_release(&buf);
	return ret;
}
Beispiel #3
0
static int create_directory(char *p)
{
	int i, ret = 0;
	struct strbuf buf = STRBUF_INIT;

	strbuf_addstr(&buf, p);
	strbuf_addstr(&buf, ".farm");
	if (mkdir(buf.buf, 0755) < 0) {
		if (errno != EEXIST) {
			eprintf("%m\n");
			ret = -1;
			goto err;
		}
	}

	if (!strlen(farm_dir))
		strbuf_copyout(&buf, farm_dir, sizeof(farm_dir));

	strbuf_addstr(&buf, "/objects");
	if (mkdir(buf.buf, 0755) < 0) {
		if (errno != EEXIST) {
			eprintf("%m\n");
			ret = -1;
			goto err;
		}
	}
	for (i = 0; i < 256; i++) {
		strbuf_addf(&buf, "/%02x", i);
		if (mkdir(buf.buf, 0755) < 0) {
			if (errno != EEXIST) {
				eprintf("%m\n");
				ret = -1;
				goto err;
			}
		}
		strbuf_remove(&buf, buf.len - 3, 3);
	}

	if (!strlen(farm_obj_dir))
		strbuf_copyout(&buf, farm_obj_dir, sizeof(farm_obj_dir));
err:
	strbuf_release(&buf);
	return ret;
}