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
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(+)
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
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
24 * This program is free software; you can redistribute it and/or modify
25 @@ -469,6 +470,130 @@ leave:
29 +struct libiscsi_session_array {
32 + struct libiscsi_session_info *data;
35 +static void libiscsi_session_array_init(struct libiscsi_session_array *arr)
42 +static int libiscsi_session_array_grow(struct libiscsi_session_array *arr)
49 + arr->data = (struct libiscsi_session_info *) realloc(
51 + arr->size * sizeof(struct libiscsi_session_info));
53 + return arr->data ? 0 : 1;
56 +static int libiscsi_session_array_grow_ondemand(struct libiscsi_session_array *arr)
58 + if (arr->size == arr->cnt)
59 + return libiscsi_session_array_grow(arr);
63 +static int libiscsi_session_array_resize_precize(struct libiscsi_session_array *arr)
65 + arr->data = (struct libiscsi_session_info *) realloc(
67 + arr->cnt * sizeof(struct libiscsi_session_info));
68 + arr->size = arr->cnt;
70 + return arr->data ? 0 : 1;
73 +static void copy_session_info_to_libiscsi_session_info(
74 + struct libiscsi_session_info *info,
75 + struct session_info *s_info)
77 + /* Copy session info to public struct. */
78 + info->sid = s_info->sid;
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;
91 +static int get_sessions_helper(void *data, struct session_info *s_info)
93 + struct libiscsi_session_array *arr = (struct libiscsi_session_array *) data;
95 + if (libiscsi_session_array_grow_ondemand(arr) != 0)
98 + copy_session_info_to_libiscsi_session_info(&arr->data[arr->cnt++], s_info);
103 +int libiscsi_get_session_infos(struct libiscsi_context *context,
104 + struct libiscsi_session_info **infos,
109 + struct libiscsi_session_array arr;
111 + if (!context || !infos || !nr_sessions)
114 + libiscsi_session_array_init(&arr);
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");
123 + if (libiscsi_session_array_resize_precize(&arr) != 0) {
124 + strcpy(context->error_str, "Can't allocate memory for session infos");
129 + *nr_sessions = nr_found;
134 +int libiscsi_get_session_info_by_id(struct libiscsi_context *context,
135 + struct libiscsi_session_info *info,
136 + const char *session)
138 + struct session_info s_info;
140 + if (!context || !info || !session)
143 + if (iscsi_sysfs_get_sessioninfo_by_id(&s_info, (char*) session) != 0) {
144 + strcpy(context->error_str, "No matching session");
148 + copy_session_info_to_libiscsi_session_info(info, &s_info);
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
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
167 * This program is free software; you can redistribute it and/or modify
168 @@ -56,6 +57,17 @@ enum libiscsi_auth_t {
170 struct libiscsi_context;
172 +/** \brief iSCSI session timeouts
174 + * Struct holding session timeouts.
176 +struct libiscsi_session_timeout {
183 /** \brief iSCSI node record
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 */;
190 +/** \brief iSCSI session
192 + * Struct hoding iSCSI session information.
194 +struct libiscsi_session_info {
197 + struct libiscsi_session_timeout tmo;
198 + struct libiscsi_chap_auth_info chap;
200 + char targetname[LIBISCSI_VALUE_MAXLEN];
202 + char address[NI_MAXHOST];
204 + char persistent_address[NI_MAXHOST];
205 + int persistent_port;
208 /** \brief generic libiscsi authentication information struct
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);
215 +/** \brief Get an array of iSCSI sessions.
217 + * Get the array containing iSCSI sessions' information.
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
226 +PUBLIC int libiscsi_get_session_infos(struct libiscsi_context *context,
227 + struct libiscsi_session_info **infos, int *nr_sessions);
229 +/** \brief Get session information by session ID.
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
237 +PUBLIC int libiscsi_get_session_info_by_id(struct libiscsi_context *context,
238 + struct libiscsi_session_info *info,
239 + const char *session);
241 /** \brief Set an iSCSI parameter for the given node
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
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>
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:
260 +const char *iscsi_sysfs_get_session_path(void)
262 + return ISCSI_SESSION_DIR;
265 int iscsi_sysfs_for_each_iface_on_host(void *data, uint32_t host_no,
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
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>
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 *,
282 typedef int (iscsi_sysfs_iface_op_fn)(void *, struct iface_rec *);
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,
287 iscsi_sysfs_iface_op_fn *fn);