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