blob: 5a28249345bf483ead1ab3525fa682e628ee9d9d [file] [log] [blame]
Lars-Peter Clausen08633732016-02-22 14:35:17 +01001/*
2 * libiio - Library for interfacing industrial I/O (IIO) devices
3 *
4 * Copyright (C) 2016 Analog Devices, Inc.
5 * Author: Paul Cercueil <paul.cercueil@analog.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 */
17
Paul Cercueil2814ed12016-08-25 17:08:18 +020018#include "iio-config.h"
Lars-Peter Clausen08633732016-02-22 14:35:17 +010019#include "iio-private.h"
20
21#include <errno.h>
Paul Cercueil668fd032016-05-20 16:03:50 +020022#include <stdbool.h>
23#include <string.h>
Lars-Peter Clausen08633732016-02-22 14:35:17 +010024
25struct iio_scan_context {
Paul Cercueil2814ed12016-08-25 17:08:18 +020026#ifdef WITH_USB_BACKEND
Lars-Peter Clausen794ba032016-04-25 15:07:00 +020027 struct iio_scan_backend_context *usb_ctx;
Lars-Peter Clausen794ba032016-04-25 15:07:00 +020028#endif
Paul Cercueil668fd032016-05-20 16:03:50 +020029 bool scan_local;
Lars-Peter Clausen08633732016-02-22 14:35:17 +010030};
31
32const char * iio_context_info_get_description(
33 const struct iio_context_info *info)
34{
35 return info->description;
36}
37
38const char * iio_context_info_get_uri(
39 const struct iio_context_info *info)
40{
41 return info->uri;
42}
43
44ssize_t iio_scan_context_get_info_list(struct iio_scan_context *ctx,
45 struct iio_context_info ***info)
46{
47 struct iio_scan_result scan_result = { 0, NULL };
48
Paul Cercueil2814ed12016-08-25 17:08:18 +020049#ifdef WITH_LOCAL_BACKEND
Paul Cercueil668fd032016-05-20 16:03:50 +020050 if (ctx->scan_local) {
Lars-Peter Clausen3db58d62016-04-25 15:00:54 +020051 int ret = local_context_scan(&scan_result);
52 if (ret < 0) {
53 if (scan_result.info)
54 iio_context_info_list_free(scan_result.info);
55 return ret;
56 }
57 }
58#endif
Lars-Peter Clausen08633732016-02-22 14:35:17 +010059
Paul Cercueil2814ed12016-08-25 17:08:18 +020060#ifdef WITH_USB_BACKEND
Lars-Peter Clausen794ba032016-04-25 15:07:00 +020061 if (ctx->usb_ctx) {
62 int ret = usb_context_scan(ctx->usb_ctx, &scan_result);
63 if (ret < 0) {
64 if (scan_result.info)
65 iio_context_info_list_free(scan_result.info);
66 return ret;
67 }
68 }
69#endif
70
Lars-Peter Clausen08633732016-02-22 14:35:17 +010071 *info = scan_result.info;
72
73 return (ssize_t) scan_result.size;
74}
75
76void iio_context_info_list_free(struct iio_context_info **list)
77{
78 struct iio_context_info **it;
79
Paul Cercueilb91538a2016-05-20 16:15:39 +020080 if (!list)
81 return;
82
Lars-Peter Clausen08633732016-02-22 14:35:17 +010083 for (it = list; *it; it++) {
84 struct iio_context_info *info = *it;
85
86 if (info->description)
87 free(info->description);
88 if (info->uri)
89 free(info->uri);
90 free(info);
91 }
92
Paul Cercueilb91538a2016-05-20 16:15:39 +020093 free(list);
Lars-Peter Clausen08633732016-02-22 14:35:17 +010094}
95
96struct iio_context_info ** iio_scan_result_add(
97 struct iio_scan_result *scan_result, size_t num)
98{
99 struct iio_context_info **info;
100 size_t old_size, new_size;
101 size_t i;
102
103 old_size = scan_result->size;
104 new_size = old_size + num;
105
106 info = realloc(scan_result->info, (new_size + 1) * sizeof(*info));
107 if (!info)
108 goto err_free_info_list;
109
110 for (i = old_size; i < new_size; i++) {
111 /* Make sure iio_context_info_list_free won't overflow */
112 info[i + 1] = NULL;
113
114 info[i] = zalloc(sizeof(**info));
115 if (!info[i])
116 goto err_free_info_list;
117 }
118
119 scan_result->info = info;
120 scan_result->size = new_size;
121
122 return &info[old_size];
123
124err_free_info_list:
125 scan_result->size = 0;
126 iio_context_info_list_free(scan_result->info);
127 return NULL;
128}
129
130struct iio_scan_context * iio_create_scan_context(
131 const char *backend, unsigned int flags)
132{
133 struct iio_scan_context *ctx;
134
135 /* "flags" must be zero for now */
136 if (flags != 0) {
137 errno = EINVAL;
138 return NULL;
139 }
140
Paul Cercueil668fd032016-05-20 16:03:50 +0200141 ctx = calloc(1, sizeof(*ctx));
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100142 if (!ctx) {
143 errno = ENOMEM;
144 return NULL;
145 }
146
Paul Cercueil668fd032016-05-20 16:03:50 +0200147 if (!backend || !strcmp(backend, "local"))
148 ctx->scan_local = true;
149
Paul Cercueil2814ed12016-08-25 17:08:18 +0200150#ifdef WITH_USB_BACKEND
Paul Cercueil668fd032016-05-20 16:03:50 +0200151 if (!backend || !strcmp(backend, "usb"))
152 ctx->usb_ctx = usb_context_scan_init();
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200153#endif
154
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100155 return ctx;
156}
157
158void iio_scan_context_destroy(struct iio_scan_context *ctx)
159{
Paul Cercueil2814ed12016-08-25 17:08:18 +0200160#ifdef WITH_USB_BACKEND
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200161 if (ctx->usb_ctx)
162 usb_context_scan_free(ctx->usb_ctx);
163#endif
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100164 free(ctx);
165}