blob: 3fe270ce0c9e0032886d58079e2334dfbba3ed61 [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
18#include "iio-private.h"
19
20#include <errno.h>
21
22struct iio_scan_context {
Lars-Peter Clausen794ba032016-04-25 15:07:00 +020023#if USB_BACKEND
24 struct iio_scan_backend_context *usb_ctx;
25#else
Lars-Peter Clausen08633732016-02-22 14:35:17 +010026 int foo; /* avoid complaints about empty structure */
Lars-Peter Clausen794ba032016-04-25 15:07:00 +020027#endif
Lars-Peter Clausen08633732016-02-22 14:35:17 +010028};
29
30const char * iio_context_info_get_description(
31 const struct iio_context_info *info)
32{
33 return info->description;
34}
35
36const char * iio_context_info_get_uri(
37 const struct iio_context_info *info)
38{
39 return info->uri;
40}
41
42ssize_t iio_scan_context_get_info_list(struct iio_scan_context *ctx,
43 struct iio_context_info ***info)
44{
45 struct iio_scan_result scan_result = { 0, NULL };
46
Lars-Peter Clausen3db58d62016-04-25 15:00:54 +020047#if LOCAL_BACKEND
48 {
49 int ret = local_context_scan(&scan_result);
50 if (ret < 0) {
51 if (scan_result.info)
52 iio_context_info_list_free(scan_result.info);
53 return ret;
54 }
55 }
56#endif
Lars-Peter Clausen08633732016-02-22 14:35:17 +010057
Lars-Peter Clausen794ba032016-04-25 15:07:00 +020058#if USB_BACKEND
59 if (ctx->usb_ctx) {
60 int ret = usb_context_scan(ctx->usb_ctx, &scan_result);
61 if (ret < 0) {
62 if (scan_result.info)
63 iio_context_info_list_free(scan_result.info);
64 return ret;
65 }
66 }
67#endif
68
Lars-Peter Clausen08633732016-02-22 14:35:17 +010069 *info = scan_result.info;
70
71 return (ssize_t) scan_result.size;
72}
73
74void iio_context_info_list_free(struct iio_context_info **list)
75{
76 struct iio_context_info **it;
77
78 for (it = list; *it; it++) {
79 struct iio_context_info *info = *it;
80
81 if (info->description)
82 free(info->description);
83 if (info->uri)
84 free(info->uri);
85 free(info);
86 }
87
88 free(list);
89}
90
91struct iio_context_info ** iio_scan_result_add(
92 struct iio_scan_result *scan_result, size_t num)
93{
94 struct iio_context_info **info;
95 size_t old_size, new_size;
96 size_t i;
97
98 old_size = scan_result->size;
99 new_size = old_size + num;
100
101 info = realloc(scan_result->info, (new_size + 1) * sizeof(*info));
102 if (!info)
103 goto err_free_info_list;
104
105 for (i = old_size; i < new_size; i++) {
106 /* Make sure iio_context_info_list_free won't overflow */
107 info[i + 1] = NULL;
108
109 info[i] = zalloc(sizeof(**info));
110 if (!info[i])
111 goto err_free_info_list;
112 }
113
114 scan_result->info = info;
115 scan_result->size = new_size;
116
117 return &info[old_size];
118
119err_free_info_list:
120 scan_result->size = 0;
121 iio_context_info_list_free(scan_result->info);
122 return NULL;
123}
124
125struct iio_scan_context * iio_create_scan_context(
126 const char *backend, unsigned int flags)
127{
128 struct iio_scan_context *ctx;
129
130 /* "flags" must be zero for now */
131 if (flags != 0) {
132 errno = EINVAL;
133 return NULL;
134 }
135
136 ctx = malloc(sizeof(*ctx));
137 if (!ctx) {
138 errno = ENOMEM;
139 return NULL;
140 }
141
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200142#if USB_BACKEND
143 ctx->usb_ctx = usb_context_scan_init();
144#endif
145
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100146 return ctx;
147}
148
149void iio_scan_context_destroy(struct iio_scan_context *ctx)
150{
Lars-Peter Clausen794ba032016-04-25 15:07:00 +0200151#if USB_BACKEND
152 if (ctx->usb_ctx)
153 usb_context_scan_free(ctx->usb_ctx);
154#endif
Lars-Peter Clausen08633732016-02-22 14:35:17 +0100155 free(ctx);
156}