diff options
-rw-r--r-- | include/iscsi_err.h | 2 | ||||
-rw-r--r-- | usr/iscsi_err.c | 1 | ||||
-rw-r--r-- | usr/iscsi_sysfs.c | 20 |
3 files changed, 20 insertions, 3 deletions
diff --git a/include/iscsi_err.h b/include/iscsi_err.h index 125f443..506bd8c 100644 --- a/include/iscsi_err.h +++ b/include/iscsi_err.h @@ -66,6 +66,8 @@ enum { ISCSI_ERR_AGAIN = 29, /* unknown discovery type */ ISCSI_ERR_UNKNOWN_DISCOVERY_TYPE = 30, + /* child process terminated */ + ISCSI_ERR_CHILD_TERMINATED = 31, /* Always last. Indicates end of error code space */ ISCSI_MAX_ERR_VAL, diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c index 11e0348..1ba9e64 100644 --- a/usr/iscsi_err.c +++ b/usr/iscsi_err.c @@ -53,6 +53,7 @@ static char *iscsi_err_msgs[] = { /* 28 */ "device or resource in use", /* 29 */ "operation failed but retry may succeed", /* 30 */ "unknown discovery type", + /* 31 */ "child process terminated", }; char *iscsi_err_to_str(int err) diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c index 3a37a48..a8fe156 100644 --- a/usr/iscsi_sysfs.c +++ b/usr/iscsi_sysfs.c @@ -1472,13 +1472,27 @@ int iscsi_sysfs_for_each_session(void *data, int *nr_found, break; } - if ((chldrc > 0) && (rc == 0)) { + if (!WIFEXITED(chldrc)) { /* + * abnormal termination (signal, exception, etc.) + * * The non-parallel code path returns the first * error so this keeps the same semantics. */ - rc = chldrc; - } else if (chldrc == 0) { + if (rc == 0) + rc = ISCSI_ERR_CHILD_TERMINATED; + } else if ((WEXITSTATUS(chldrc) != 0) && + (WEXITSTATUS(chldrc) != 255)) { + /* + * 0 is success + * 255 is a truncated return code from exit(-1) + * and means no match + * anything else (this case) is an error + */ + if (rc == 0) + rc = WEXITSTATUS(chldrc); + } else if (WEXITSTATUS(chldrc) == 0) { + /* success */ (*nr_found)++; } } |