int command_add(args_t * args) { assert(args != NULL); /* ========================= */ int add(args_t * args, off_t poffset) { int rc = 0; off_t offset = 0; size_t size = 0; uint32_t flags = 0; rc = parse_offset(args->offset, &offset); if (rc < 0) return rc; rc = parse_size(args->size, &size); if (rc < 0) return rc; rc = parse_size(args->flags, &flags); if (rc < 0) return rc; ffs_type_t type = FFS_TYPE_DATA; if (args->logical == f_LOGICAL) type = FFS_TYPE_LOGICAL; const char * target = args->target; int debug = args->debug; RAII(FILE *, file, fopen_generic(target, "r+", debug), fclose); RAII(ffs_t *, ffs, __ffs_fopen(file, poffset), __ffs_fclose); rc = __ffs_entry_add(ffs, args->name, offset, size, type, flags); if (rc < 0) return rc; if (args->verbose == f_VERBOSE) printf("%llx: %s: add partition at offset '%llx' size " "'%x' type '%d' flags '%x'\n", poffset, args->name, offset, size, type, flags); return rc; }
int ffs_entry_add(ffs_t * self, const char *path, off_t offset, size_t size, ffs_type_t type, uint32_t flags) { int rc = __ffs_entry_add(self, path, offset, size, type, flags); if (rc < 0) { err_t *err = err_get(); assert(err != NULL); __error.errnum = err_code(err); snprintf(__error.errstr, sizeof __error.errstr, "%s: %s : %s(%d) : (code=%d) %.*s\n", program_invocation_short_name, err_type_name(err), err_file(err), err_line(err), err_code(err), err_size(err), (char *)err_data(err)); rc = -1; } return rc; }