int cli_compact_dz(int argc, char **argv) { int status = 0; for (int i = 0; i < argc; i++) { dz_t dz; int saved; if (dz_open(&dz, argv[i], O_RDWR) < 0) { return -1; } saved = dz_compact(&dz); if (saved < 0) { LOGERROR("dz_compact failed."); status = -1; } if (dz_close(&dz) < 0) { LOGERROR("dz_close failed"); status = -1; } if (status == 0) { LOGINFO("%s: %d bytes saved.", argv[i], saved); } else { break; } } return status; }
int cli_rm_tlv(int argc, char **argv) { dz_t dz; int status = -1; char **offset; int nb_tlv; char *file; if (argc < 2) { LOGERROR("Missing parameter(s)."); return -1; } file = argv[argc - 1]; offset = argv; nb_tlv = argc - 1; if (dz_open(&dz, file, O_RDWR) < 0) { LOGERROR("dz_open failed."); return -1; } for (int i = 0; i < nb_tlv; i++) { char *endptr = NULL; long long int off = strtoll(offset[i], &endptr, 10); if (endptr != NULL && *endptr != '\0') { LOGERROR("Invalid argument: %s\n", offset[i]); goto CLOSE; } if (off == LLONG_MIN || off == LLONG_MAX) { LOGERROR("Overflow: %s\n", offset[i]); goto CLOSE; } if (dz_rm_tlv(&dz, (off_t)off) < 0) { LOGERROR("dz_rm_tlv failed (%d/%d tlv removed).", i, nb_tlv); goto CLOSE; } } /* If no error occurred */ status = 0; CLOSE: if (dz_close(&dz) < 0) { LOGERROR("dz_close failed."); status = -1; goto OUT; } OUT: return status; }
int cli_dump_dz(int argc, char **argv) { int status = 0; long long int depth = -1; int debug = 0; struct s_option opt[] = { {"--depth", ARG_TYPE_LLINT, (void *)&depth}, {"--debug", ARG_TYPE_FLAG, (void *)&debug}, }; struct s_args args = {&argc, &argv, opt}; if (jparse_args(argc, argv, &args, sizeof(opt)/sizeof(*opt)) != 0) { LOGERROR("jparse_args failed"); return -1; } if (argv == NULL) { LOGERROR("Wrong arguments."); return -1; } for (int i = 0; i < argc; i++) { dz_t dz; if (argc > 1) { printf("%s:\n", argv[i]); } if (dz_open(&dz, argv[i], O_RDONLY) != 0) { LOGERROR("Failed opening %s.", argv[i]); return -1; } if (cli_print_dz(&dz, 0, depth, debug) != 0) { LOGERROR("cli_print_dz failed"); status = -1; } if (dz_close(&dz) == -1) { LOGERROR("Failed closing dazibao."); status = -1; } if (status == -1) { break; } } return status; }
int choose_tlv_extract(dz_t *dz, tlv_t *tlv, long off) { if (dz_tlv_at(dz, tlv, off) < 0) { printf("error to read type and length tlv\n"); dz_close(dz); tlv_destroy(tlv); return -1; } if (tlv_get_type(tlv) == TLV_DATED) { off = off + TLV_SIZEOF_HEADER + TLV_SIZEOF_DATE; return choose_tlv_extract(dz,tlv,off); } if (dz_read_tlv(dz, tlv, off) < 0) { printf("error to read value tlv\n"); dz_close(dz); tlv_destroy(tlv); return -1; } return 0; }
int cli_create_dz(int argc, char **argv) { for (int i = 0; i < argc; i++) { dz_t dz; if (dz_create(&dz, argv[i]) != 0) { LOGERROR("dz_create failed"); return -1; } if (dz_close(&dz) < 0) { LOGERROR("dz_close failed"); return -1; } } return 0; }
int cmd_extract(int argc , char **argv, char *dz_path) { dz_t dz; tlv_t tlv; long off; int fd; size_t real_size; char *data; char *path; if (argc != 2) { fprintf(stderr, "cmd extract : <offset> <path> <dazibao>\n"); return DZ_ARGS_ERROR; } /* If the offset doesn't start with a character between '0' and '9', it * must be wrong. */ if (argv[0][0] < 48 || argv[0][0] > 57) { fprintf(stderr, "Usage:\n extract <offset> <file> <dazibao>\n"); return DZ_ARGS_ERROR; } off = str2dec_positive(argv[0]); if (off < DAZIBAO_HEADER_SIZE) { fprintf(stderr, "wrong offset\n"); return DZ_OFFSET_ERROR; } if (dz_open(&dz, dz_path, O_RDWR) < 0) { fprintf(stderr, "Error while opening the dazibao\n"); return -1; } if (dz_check_tlv_at(&dz, off, -1,NULL) <= 0) { fprintf(stderr, "no such TLV\n"); dz_close(&dz); return DZ_OFFSET_ERROR; } if (tlv_init(&tlv) < 0) { printf("error to init tlv\n"); dz_close(&dz); return -1; } if (choose_tlv_extract(&dz,&tlv,off) < 0) { printf("error to init tlv\n"); tlv_destroy(&tlv); dz_close(&dz); return -1; } if (dz_close(&dz) < 0) { fprintf(stderr, "Error while closing the dazibao\n"); tlv_destroy(&tlv); return -1; } if (tlv_get_type(&tlv) == TLV_COMPOUND) { real_size = (size_t)tlv_get_length(&tlv) + DAZIBAO_HEADER_SIZE; } else { real_size = (size_t)tlv_get_length(&tlv); } path = argv[1]; fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644); if (fd == -1) { tlv_destroy(&tlv); ERROR("open", -1); } if (ftruncate(fd, real_size) < 0) { fprintf(stderr, "Error while ftruncate path"); close(fd); return -1; } data = (char*)mmap(NULL, real_size, PROT_WRITE, MAP_SHARED, fd, 0); if (data == MAP_FAILED) { fprintf(stderr, "Error while mmap "); close(fd); tlv_destroy(&tlv); return -1; } if (tlv_get_type(&tlv) == TLV_COMPOUND) { data[0] = MAGIC_NUMBER; memset(data + 1, 0, DAZIBAO_HEADER_SIZE - 1); real_size = real_size - DAZIBAO_HEADER_SIZE; memcpy(data + DAZIBAO_HEADER_SIZE, tlv_get_value_ptr(&tlv), real_size); } else { memcpy(data , tlv_get_value_ptr(&tlv), real_size); } tlv_destroy(&tlv); close(fd); return 0; }
int action_add(int argc, char **argv, int f_co, int f_dz, int f_d, int f_in, char *type, char *daz) { dz_t daz_buf; unsigned int buff_size_co = 0; tlv_t tlv = NULL; tlv_t buff_co = NULL; tlv_t buff_d = NULL; int i,j = 0; if (dz_open(&daz_buf, daz, O_RDWR) < 0) { fprintf(stderr, "failed open the dazibao\n"); return -1; } f_d = (f_d == -1 ? argc : f_d); f_co = (f_co == -1 ? argc : f_co); for (i = 0; i < argc; i++) { int tlv_size = 0; /* inizialized tlv */ if (tlv_init(&tlv) < 0) { printf("error to init tlv\n"); return -1; } /* different possibility to create a standard tlv*/ if (i == f_in) { tlv_size = tlv_create_input(&tlv, &type[j]); j++; } else if (i == f_dz) { tlv_size = dz2tlv(argv[i], &tlv); } else { tlv_size = tlv_create_path(argv[i], &tlv, &type[j]); j++; } /* if not tlv as create error */ if (tlv_size < 0) { printf("error to create tlv with path %s\n", argv[i]); return -1; } /* other option who use tlv created */ if ( i >= f_co ) { /* if tlv to insert to compound it type dated*/ if ((i >= f_d) && (f_d > f_co)) { if (tlv_init(&buff_d) < 0) { printf("error to init tlv compound"); return -1; } tlv_size = tlv_create_date(&buff_d, &tlv, tlv_size); if (tlv_size < 0) { printf("error to create tlv dated" "%s\n", argv[i]); return -1; } tlv_destroy(&tlv); tlv = buff_d; buff_d = NULL; } unsigned int size_realloc = TLV_SIZEOF_HEADER; if ((f_co == i) && (tlv_init(&buff_co) < 0)) { printf("error to init tlv compound\n"); return -1; } size_realloc += buff_size_co + tlv_size; buff_co = (tlv_t) safe_realloc(buff_co, sizeof(*buff_co) * size_realloc); if (buff_co == NULL) { ERROR("realloc", -1); } memcpy(buff_co + buff_size_co, tlv, tlv_size); buff_size_co += tlv_size; tlv_destroy(&tlv); /*when all tlv is insert, create tlv compound*/ if (i == argc -1) { if (tlv_init(&tlv) < 0) { printf(" error to init tlv"); return -1; } tlv_size = tlv_create_compound(&tlv, &buff_co, buff_size_co); if (tlv_size < 0) { printf(" error to create compound" " %s\n", argv[i]); return -1; } tlv_destroy(&buff_co); } else { continue; } } if ((i >= f_d) && (f_d <= f_co)) { if (tlv_init(&buff_d) < 0) { printf(" error to init tlv dated\n"); return -1; } tlv_size = tlv_create_date(&buff_d, &tlv, tlv_size); if (tlv_size < 0) { printf(" error to create tlv dated" "%s\n", argv[i]); return -1; } tlv_destroy(&tlv); tlv = buff_d; buff_d = NULL; } if (tlv_size > 0) { if (dz_add_tlv(&daz_buf, &tlv) == -1) { fprintf(stderr, "failed adding the tlv\n"); tlv_destroy(&tlv); return -1; } tlv_destroy(&tlv); } } if (dz_close(&daz_buf) < 0) { fprintf(stderr, "failed closing the dazibao\n"); return -1; } return 0; }
dz_dev_t * dz_open(char *path) { dz_dev_t *dzd = NULL; int i, ret; /* Get an unused device */ for(i = 0; i < DZ_MAX_DEV; i++) { if ( ! dz.dev[i].dev ) { dzd = &dz.dev[i]; break; } } if ( ! dzd ) { return( NULL ); } /* Open device file */ strncpy(dzd->path, path, sizeof(dzd->path) - 1); ret = zbc_open(dzd->path, O_RDONLY, &dzd->dev); if ( ret != 0 ) { return( NULL ); } ret = zbc_get_device_info(dzd->dev, &dzd->info); if ( ret != 0 ) { fprintf(stderr, "zbc_get_device_info failed\n"); goto out; } dzd->block_size = dz.block_size; if ( dzd->block_size ) { if ( ((unsigned int) dzd->block_size < dzd->info.zbd_logical_block_size) && (dzd->info.zbd_logical_block_size % dzd->block_size) ) { dzd->block_size = 0; } else if ( ((unsigned int) dzd->block_size >= dzd->info.zbd_logical_block_size) && (dzd->block_size % dzd->info.zbd_logical_block_size) ) { dzd->block_size = 0; } } if ( ! dzd->block_size ) { dzd->block_size = dzd->info.zbd_logical_block_size; } /* Get zone information */ ret = dz_get_zones(dzd); if ( ret != 0 ) { goto out; } dz.nr_devs++; out: if ( ret != 0 ) { dz_close(dzd); dzd = NULL; } return( dzd ); }
int cli_extract(int argc, char **argv) { dz_t dz; int status = -1; char value = 0; char **offset; int nb_tlv; char *file; if (argc < 1) { LOGERROR("Missing parameter(s)."); return -1; } file = argv[argc - 1]; nb_tlv = argc - 1; offset = argv; if (dz_open(&dz, file, O_RDWR) != 0) { LOGERROR("Failed opening %s.", argv[0]); return -1; } if (nb_tlv == 0) { /* TODO: handle error */ if (cli_extract_all(&dz, 0) != 0) { LOGERROR("cli_extract_all failed "); } goto CLOSE; } for (int i = 0; i < nb_tlv; i++) { char *endptr = NULL; long long int off = strtoll(offset[i], &endptr, 10); if (endptr != NULL && *endptr != '\0') { LOGERROR("Invalid argument: %s\n", offset[i]); goto CLOSE; } if (off == LLONG_MIN || off == LLONG_MAX) { LOGERROR("Overflow: %s\n", offset[i]); goto CLOSE; } if (cli_extract_tlv(&dz, off, 0) == -1) { LOGERROR("cli_extract failed (%d/%d tlv extracted).", i, nb_tlv); goto CLOSE; } } /* If no error occurred */ status = 0; CLOSE: if (dz_close(&dz) == -1) { LOGERROR("Failed closing dazibao."); status = -1; } return status; }
int cli_add(int argc, char **argv) { int status = -1; dz_t dz; tlv_t tlv; char date = 0; char *type = NULL; char *file; char **inputs; int nb_inputs = 0; /* Parsing arguments. */ struct s_option opt[] = { {"--date", ARG_TYPE_FLAG, (void *)&date}, {"--type", ARG_TYPE_STRING, (void *)&type}, }; struct s_args args = {&nb_inputs, &inputs, opt}; if (jparse_args(argc, argv, &args, sizeof(opt)/sizeof(*opt)) == -1) { LOGERROR("jparse_args failed."); goto OUT; } if (nb_inputs < 2) { LOGERROR("Missing parameters (see manual)."); goto OUT; } file = inputs[--nb_inputs]; if (dz_open(&dz, file, O_RDWR) != 0) { LOGERROR("Failed opening %s.", file); goto OUT; } if (tlv_init(&tlv) == -1) { LOGERROR("tlv_init failed."); goto CLOSE; } if (cli_mk_tlv(&tlv, nb_inputs, inputs, type, date) == -1) { LOGERROR("cli_mk_tlv failed."); goto DESTROY; } if (dz_add_tlv(&dz, &tlv) != 0) { LOGERROR("Failed adding TLV."); goto DESTROY; } /* If no error occurred */ status = 0; DESTROY: if (tlv_destroy(&tlv) != 0) { LOGERROR("tlv_destroy failed"); status = -1; } CLOSE: if (dz_close(&dz) == -1) { LOGERROR("Failed closing dazibao."); status = -1; } OUT: return status; }