diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..986eafb --- /dev/null +++ b/include/utils.h @@ -0,0 +1,37 @@ +/* + Utility helper functions. + + Copyright (C) 2023 by zhenwei pi + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ +#ifndef __iscsi_utils_h__ +#define __iscsi_utils_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct iscsi_value_string { + int value; + const char *string; +}; + +const char *iscsi_value_string_find(struct iscsi_value_string *values, int value, const char *not_found); + +#ifdef __cplusplus +} +#endif + +#endif /* __iscsi_utils_h__ */ diff --git a/lib/Makefile.am b/lib/Makefile.am index 29f5dfd..b81fd3d 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -6,7 +6,7 @@ libiscsipriv_la_SOURCES = \ connect.c crc32c.c discovery.c init.c \ login.c nop.c pdu.c iscsi-command.c \ scsi-lowlevel.c socket.c sync.c task_mgmt.c \ - logging.c + logging.c utils.c if TARGET_OS_IS_WIN32 libiscsipriv_la_SOURCES += ../win32/win32_compat.c diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 1e2a7af..1b49853 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -56,6 +56,7 @@ #include #include "slist.h" #include "scsi-lowlevel.h" +#include "utils.h" void scsi_task_set_iov_out(struct scsi_task *task, struct scsi_iovec *iov, int niov); @@ -116,26 +117,10 @@ scsi_malloc(struct scsi_task *task, size_t size) return &mem->buf[0]; } -struct value_string { - int value; - const char *string; -}; - -static const char * -value_string_find(struct value_string *values, int value) -{ - for (; values->string; values++) { - if (value == values->value) { - return values->string; - } - } - return NULL; -} - const char * scsi_sense_key_str(int key) { - static struct value_string keys[] = { + static struct iscsi_value_string keys[] = { {SCSI_SENSE_NO_SENSE, "NO SENSE"}, {SCSI_SENSE_RECOVERED_ERROR, @@ -167,13 +152,13 @@ scsi_sense_key_str(int key) {0, NULL} }; - return value_string_find(keys, key); + return iscsi_value_string_find(keys, key, "UNKNOWN"); } const char * scsi_sense_ascq_str(int ascq) { - static struct value_string ascqs[] = { + static struct iscsi_value_string ascqs[] = { {SCSI_SENSE_ASCQ_SANITIZE_IN_PROGRESS, "SANITIZE_IN_PROGRESS"}, {SCSI_SENSE_ASCQ_WRITE_AFTER_SANITIZE_REQUIRED, @@ -239,13 +224,13 @@ scsi_sense_ascq_str(int ascq) {0, NULL} }; - return value_string_find(ascqs, ascq); + return iscsi_value_string_find(ascqs, ascq, "UNKNOWN"); } const char * scsi_pr_type_str(enum scsi_persistent_out_type pr_type) { - static struct value_string pr_type_strings[] = { + static struct iscsi_value_string pr_type_strings[] = { {SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE, "Write Exclusive"}, {SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS, @@ -261,13 +246,13 @@ scsi_pr_type_str(enum scsi_persistent_out_type pr_type) {0, NULL} }; - return value_string_find(pr_type_strings, pr_type); + return iscsi_value_string_find(pr_type_strings, pr_type, "UNKNOWN"); } const char * scsi_opcode_str(int opcode) { - static struct value_string opcode_strings[] = { + static struct iscsi_value_string opcode_strings[] = { {SCSI_OPCODE_TESTUNITREADY, "TESTUNITREADY"}, {SCSI_OPCODE_READ6, @@ -361,7 +346,7 @@ scsi_opcode_str(int opcode) {0, NULL} }; - return value_string_find(opcode_strings, opcode); + return iscsi_value_string_find(opcode_strings, opcode, "UNKNOWN"); } uint64_t diff --git a/lib/utils.c b/lib/utils.c new file mode 100644 index 0000000..64c625e --- /dev/null +++ b/lib/utils.c @@ -0,0 +1,35 @@ +/* + Utility helper functions. + + Copyright (C) 2023 by zhenwei pi + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see . +*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "utils.h" + +const char *iscsi_value_string_find(struct iscsi_value_string *values, + int value, const char *not_found) +{ + for ( ; values->string; values++) { + if (value == values->value) { + return values->string; + } + } + + return not_found; +}