示例#1
0
int dump_dives(program_options_t *options) {
    dc_family_t backend = DC_FAMILY_NULL;
    dc_loglevel_t loglevel = DC_LOGLEVEL_WARNING;
    const char *logfile = "output.log";
    const char *name = NULL;
    const char *fingerprint = NULL;
    unsigned int model = 0;

    if (options->backend != NULL) {
        backend = lookup_type(options->backend);
    }
    signal (SIGINT, sighandler);

    message_set_logfile(logfile);

    dc_context_t *context = NULL;

    /* create a new context */
    dc_status_t rc = dc_context_new(&context);
    if (rc != DC_STATUS_SUCCESS) {
        message_set_logfile(NULL);
        return EXIT_FAILURE;
    }

    dc_context_set_loglevel(context, loglevel);
    dc_context_set_logfunc(context, logfunc, NULL);

    dc_descriptor_t *descriptor = NULL;
    rc = search(&descriptor, name, backend, model);
    if (rc != DC_STATUS_SUCCESS) {
        message_set_logfile(NULL);
        return EXIT_FAILURE;
    }

    /* fail if no device descriptor found */
    if (descriptor == NULL) {
        WARNING("No matching device found");
        /* FIXME: bail out to usage information */
        message_set_logfile(NULL);
        return EXIT_FAILURE;
    }

    dc_buffer_t *fp = fpconvert(fingerprint);
    rc = dowork(context, descriptor, options, fp);
    dc_buffer_free(fp);
    /* FIXME: why aren't calls to errmsg working? */
    // message("Result: %s\n", errmsg(rc));

    dc_descriptor_free(descriptor);
    dc_context_free(context);

    message_set_logfile(NULL);

    return rc != DC_STATUS_SUCCESS ? EXIT_FAILURE : EXIT_SUCCESS;
}
示例#2
0
void
print_devices()
{
    fprintf(stderr, "Supported devices:\n\n");
    dc_iterator_t *iterator = NULL;
    dc_descriptor_t *descriptor = NULL;
    dc_descriptor_iterator (&iterator);
    while (dc_iterator_next (iterator, &descriptor) == DC_STATUS_SUCCESS) {
        fprintf (stderr, "   %s %s\n",
            dc_descriptor_get_vendor (descriptor),
            dc_descriptor_get_product (descriptor));
        dc_descriptor_free (descriptor);
    }
    dc_iterator_free (iterator);
    exit(EXIT_FAILURE);
}
示例#3
0
static dc_descriptor_t *ostc_get_data_descriptor(int data_model, dc_family_t data_fam)
{
	dc_descriptor_t *descriptor = NULL, *current = NULL;;
	dc_iterator_t *iterator = NULL;
	dc_status_t rc;

	rc = dc_descriptor_iterator(&iterator);
	if (rc != DC_STATUS_SUCCESS) {
		fprintf(stderr,"Error creating the device descriptor iterator.\n");
		return current;
	}
	while ((dc_iterator_next(iterator, &descriptor)) == DC_STATUS_SUCCESS) {
		int desc_model = dc_descriptor_get_model(descriptor);
		dc_family_t desc_fam = dc_descriptor_get_type(descriptor);
		if (data_model == desc_model && data_fam == desc_fam) {
			current = descriptor;
			break;
		}
		dc_descriptor_free(descriptor);
	}
	dc_iterator_free(iterator);
	return current;
}
示例#4
0
static dc_status_t
search(dc_descriptor_t **out, const char *name, dc_family_t backend, unsigned int model) {
    dc_status_t rc = DC_STATUS_SUCCESS;

    dc_iterator_t *iterator = NULL;
    rc = dc_descriptor_iterator(&iterator);
    if (rc != DC_STATUS_SUCCESS) {
        WARNING("Error creating the device descriptor iterator.");
        return rc;
    }

    dc_descriptor_t *descriptor = NULL, *current = NULL;
    while ((rc = dc_iterator_next(iterator, &descriptor)) == DC_STATUS_SUCCESS) {
        if (name) {
            const char *vendor = dc_descriptor_get_vendor(descriptor);
            const char *product = dc_descriptor_get_product(descriptor);

            size_t n = strlen(vendor);
            if (strncasecmp(name, vendor, n) == 0 && name[n] == ' ' &&
                    strcasecmp(name + n + 1, product) == 0) {
                current = descriptor;
                break;
            } else if (strcasecmp(name, product) == 0) {
                current = descriptor;
                break;
            }
        } else {
            if (backend == dc_descriptor_get_type(descriptor)) {
                if (model == dc_descriptor_get_model(descriptor)) {
                    /* Exact match found. Return immediately */
                    dc_descriptor_free(current);
                    current = descriptor;
                    break;
                } else {
                    /* Possible match found. Keep searching for an exact match.
                     * If no exact match is found, return the first match found.
                     */
                    if (current == NULL) {
                        current = descriptor;
                        descriptor = NULL;
                    }
                }
            }
        }

        dc_descriptor_free(descriptor);
    }

    if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_DONE) {
        dc_descriptor_free(current);
        dc_iterator_free(iterator);
        WARNING("Error iterating the device descriptor.");
        return rc;
    }

    dc_iterator_free(iterator);

    *out = current;

    return DC_STATUS_SUCCESS;
}