Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
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;
}
Exemplo n.º 6
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;
}
Exemplo n.º 7
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;
}
Exemplo n.º 8
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 );

}
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
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;
}