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; }
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; }
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; }