]> git.pld-linux.org Git - packages/open-iscsi.git/blob - 0010-libiscsi-introduce-sessions-API.patch
- updated to 2.1.4 + current Fedora patch set
[packages/open-iscsi.git] / 0010-libiscsi-introduce-sessions-API.patch
1 From 2c28c620727e522f022689312d76f107eb8ef18f Mon Sep 17 00:00:00 2001
2 From: Peter Hatina <phatina@redhat.com>
3 Date: Mon, 5 Oct 2015 16:50:36 -0700
4 Subject: [PATCH] libiscsi introduce sessions API
5
6 ---
7  libiscsi/libiscsi.c | 125 ++++++++++++++++++++++++++++++++++++++++++++
8  libiscsi/libiscsi.h |  56 ++++++++++++++++++++
9  usr/iscsi_sysfs.c   |   6 +++
10  usr/iscsi_sysfs.h   |   2 +
11  4 files changed, 189 insertions(+)
12
13 diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c
14 index 064e4b5..755c18c 100644
15 --- a/libiscsi/libiscsi.c
16 +++ b/libiscsi/libiscsi.c
17 @@ -3,6 +3,7 @@
18   *
19   * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
20   * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
21 + * Copyright (C) 2015      Peter Hatina <phatina@redhat.com>
22   * maintained by open-iscsi@googlegroups.com
23   *
24   * This program is free software; you can redistribute it and/or modify
25 @@ -469,6 +470,130 @@ leave:
26         return rc;
27  }
28  
29 +struct libiscsi_session_array {
30 +       int cnt;
31 +       int size;
32 +       struct libiscsi_session_info *data;
33 +};
34 +
35 +static void libiscsi_session_array_init(struct libiscsi_session_array *arr)
36 +{
37 +       arr->cnt = 0;
38 +       arr->size = 0;
39 +       arr->data = NULL;
40 +}
41 +
42 +static int libiscsi_session_array_grow(struct libiscsi_session_array *arr)
43 +{
44 +       if (arr->size == 0)
45 +               arr->size = 4;
46 +       else
47 +               arr->size *= 2;
48 +
49 +       arr->data = (struct libiscsi_session_info *) realloc(
50 +               arr->data,
51 +               arr->size * sizeof(struct libiscsi_session_info));
52 +
53 +       return arr->data ? 0 : 1;
54 +}
55 +
56 +static int libiscsi_session_array_grow_ondemand(struct libiscsi_session_array *arr)
57 +{
58 +       if (arr->size == arr->cnt)
59 +               return libiscsi_session_array_grow(arr);
60 +       return 0;
61 +}
62 +
63 +static int libiscsi_session_array_resize_precize(struct libiscsi_session_array *arr)
64 +{
65 +       arr->data = (struct libiscsi_session_info *) realloc(
66 +               arr->data,
67 +               arr->cnt * sizeof(struct libiscsi_session_info));
68 +       arr->size = arr->cnt;
69 +
70 +       return arr->data ? 0 : 1;
71 +}
72 +
73 +static void copy_session_info_to_libiscsi_session_info(
74 +       struct libiscsi_session_info *info,
75 +       struct session_info *s_info)
76 +{
77 +       /* Copy session info to public struct. */
78 +       info->sid = s_info->sid;
79 +       /* Timeouts */
80 +       memcpy(&info->tmo, &s_info->tmo, sizeof(struct libiscsi_session_timeout));
81 +       /* CHAP authentication information */
82 +       memcpy(&info->chap, &s_info->chap, sizeof(struct libiscsi_chap_auth_info));
83 +       /* Target information */
84 +       strncpy(info->targetname, s_info->targetname, LIBISCSI_VALUE_MAXLEN);
85 +       strncpy(info->address, s_info->address, NI_MAXHOST);
86 +       strncpy(info->persistent_address, s_info->persistent_address, NI_MAXHOST);
87 +       info->tpgt = s_info->tpgt;
88 +       info->persistent_port = s_info->persistent_port;
89 +}
90 +
91 +static int get_sessions_helper(void *data, struct session_info *s_info)
92 +{
93 +       struct libiscsi_session_array *arr = (struct libiscsi_session_array *) data;
94 +
95 +       if (libiscsi_session_array_grow_ondemand(arr) != 0)
96 +               return 1;
97 +
98 +       copy_session_info_to_libiscsi_session_info(&arr->data[arr->cnt++], s_info);
99 +
100 +       return 0;
101 +}
102 +
103 +int libiscsi_get_session_infos(struct libiscsi_context *context,
104 +       struct libiscsi_session_info **infos,
105 +       int *nr_sessions)
106 +{
107 +       int rc = 0;
108 +       int nr_found = 0;
109 +       struct libiscsi_session_array arr;
110 +
111 +       if (!context || !infos || !nr_sessions)
112 +               return 1;
113 +
114 +       libiscsi_session_array_init(&arr);
115 +
116 +       rc = iscsi_sysfs_for_each_session((void *) &arr, &nr_found,
117 +               get_sessions_helper, 0);
118 +       if (rc != 0 || nr_found == 0) {
119 +               strcpy(context->error_str, "No matching session");
120 +               return ENODEV;
121 +       }
122 +
123 +       if (libiscsi_session_array_resize_precize(&arr) != 0) {
124 +               strcpy(context->error_str, "Can't allocate memory for session infos");
125 +               return ENOMEM;
126 +       }
127 +
128 +       *infos = arr.data;
129 +       *nr_sessions = nr_found;
130 +
131 +       return 0;
132 +}
133 +
134 +int libiscsi_get_session_info_by_id(struct libiscsi_context *context,
135 +       struct libiscsi_session_info *info,
136 +       const char *session)
137 +{
138 +       struct session_info s_info;
139 +
140 +       if (!context || !info || !session)
141 +               return 1;
142 +
143 +       if (iscsi_sysfs_get_sessioninfo_by_id(&s_info, (char*) session) != 0) {
144 +               strcpy(context->error_str, "No matching session");
145 +               return ENODEV;
146 +       }
147 +
148 +       copy_session_info_to_libiscsi_session_info(info, &s_info);
149 +
150 +       return 0;
151 +}
152 +
153  int libiscsi_node_set_parameter(struct libiscsi_context *context,
154         const struct libiscsi_node *node,
155         const char *parameter, const char *value)
156 diff --git a/libiscsi/libiscsi.h b/libiscsi/libiscsi.h
157 index 756590e..a9891f4 100644
158 --- a/libiscsi/libiscsi.h
159 +++ b/libiscsi/libiscsi.h
160 @@ -3,6 +3,7 @@
161   *
162   * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
163   * Copyright (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
164 + * Copyright (C) 2015      Peter Hatina <phatina@redhat.com>
165   * maintained by open-iscsi@googlegroups.com
166   *
167   * This program is free software; you can redistribute it and/or modify
168 @@ -56,6 +57,17 @@ enum libiscsi_auth_t {
169   */
170  struct libiscsi_context;
171  
172 +/** \brief iSCSI session timeouts
173 + *
174 + * Struct holding session timeouts.
175 + */
176 +struct libiscsi_session_timeout {
177 +    int abort_tmo;
178 +    int lu_reset_tmo;
179 +    int recovery_tmo;
180 +    int tgt_reset_tmo;
181 +};
182 +
183  /** \brief iSCSI node record
184   *
185   * Struct holding data uniquely identifying an iSCSI node.
186 @@ -84,6 +96,24 @@ struct libiscsi_chap_auth_info {
187      char reverse_password[LIBISCSI_VALUE_MAXLEN] /** Reverse Password */;
188  };
189  
190 +/** \brief iSCSI session
191 + *
192 + * Struct hoding iSCSI session information.
193 + */
194 +struct libiscsi_session_info {
195 +    int sid;
196 +
197 +    struct libiscsi_session_timeout tmo;
198 +    struct libiscsi_chap_auth_info chap;
199 +
200 +    char targetname[LIBISCSI_VALUE_MAXLEN];
201 +    int tpgt;
202 +    char address[NI_MAXHOST];
203 +    int port;
204 +    char persistent_address[NI_MAXHOST];
205 +    int persistent_port;
206 +};
207 +
208  /** \brief generic libiscsi authentication information struct
209   *
210   * Struct holding authentication information for discovery and login.
211 @@ -248,6 +278,32 @@ PUBLIC int libiscsi_node_login(struct libiscsi_context *context,
212  PUBLIC int libiscsi_node_logout(struct libiscsi_context *context,
213      const struct libiscsi_node *node);
214  
215 +/** \brief Get an array of iSCSI sessions.
216 + *
217 + * Get the array containing iSCSI sessions' information.
218 + *
219 + * \param context       libiscsi context to operate on.
220 + * \param infos         Array of iSCSI sessions' information.
221 + *                      Release with free().
222 + * \param nr_sessions   The number of elements in \e infos.
223 + * \return              0 on success, otherwise a standard error code
224 + *                      (from errno.h).
225 + */
226 +PUBLIC int libiscsi_get_session_infos(struct libiscsi_context *context,
227 +    struct libiscsi_session_info **infos, int *nr_sessions);
228 +
229 +/** \brief Get session information by session ID.
230 + *
231 + * \param context       libiscsi context to operate on.
232 + * \param info          iSCSI session information.
233 + * \param session       Session name.
234 + * \return              0 on success, otherwise a standard error code
235 + *                      (from errno.h)
236 + */
237 +PUBLIC int libiscsi_get_session_info_by_id(struct libiscsi_context *context,
238 +    struct libiscsi_session_info *info,
239 +    const char *session);
240 +
241  /** \brief Set an iSCSI parameter for the given node
242   *
243   * Set the given nodes iSCSI parameter named by \e parameter to value \e value.
244 diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c
245 index 435c576..e549afe 100644
246 --- a/usr/iscsi_sysfs.c
247 +++ b/usr/iscsi_sysfs.c
248 @@ -3,6 +3,7 @@
249   *
250   * Copyright (C) 2006 Mike Christie
251   * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
252 + * Copyright (C) 2015      Peter Hatina <phatina@redhat.com>
253   *
254   * This program is free software; you can redistribute it and/or modify
255   * it under the terms of the GNU General Public License as published
256 @@ -1151,6 +1152,11 @@ free_info:
257         return rc;
258  }
259  
260 +const char *iscsi_sysfs_get_session_path(void)
261 +{
262 +       return ISCSI_SESSION_DIR;
263 +}
264 +
265  int iscsi_sysfs_for_each_iface_on_host(void *data, uint32_t host_no,
266                                        int *nr_found,
267                                        iscsi_sysfs_iface_op_fn *fn)
268 diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h
269 index 1d0377f..909db34 100644
270 --- a/usr/iscsi_sysfs.h
271 +++ b/usr/iscsi_sysfs.h
272 @@ -3,6 +3,7 @@
273   *
274   * Copyright (C) 2006 Mike Christie
275   * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
276 + * Copyright (C) 2015      Peter Hatina <phatina@redhat.com>
277   *
278   * This program is free software; you can redistribute it and/or modify
279   * it under the terms of the GNU General Public License as published
280 @@ -47,6 +48,7 @@ typedef int (iscsi_sysfs_flashnode_op_fn)(void *, struct flashnode_rec *,
281                                           uint32_t, uint32_t);
282  typedef int (iscsi_sysfs_iface_op_fn)(void *, struct iface_rec *);
283  
284 +extern const char *iscsi_sysfs_get_session_path(void);
285  extern int iscsi_sysfs_for_each_iface_on_host(void *data, uint32_t host_no,
286                                               int *nr_found,
287                                               iscsi_sysfs_iface_op_fn *fn);
288 -- 
289 2.26.2
290
This page took 0.134995 seconds and 3 git commands to generate.