From: <ag...@us...> - 2010-02-13 11:52:41
|
Revision: 294 http://iscsitarget.svn.sourceforge.net/iscsitarget/?rev=294&view=rev Author: agr1 Date: 2010-02-13 11:52:34 +0000 (Sat, 13 Feb 2010) Log Message: ----------- Make ioctl error checking more robust Signed-off-by: Arne Redlich <arn...@go...> Modified Paths: -------------- trunk/usr/ctldev.c Modified: trunk/usr/ctldev.c =================================================================== --- trunk/usr/ctldev.c 2010-02-12 20:50:26 UTC (rev 293) +++ trunk/usr/ctldev.c 2010-02-13 11:52:34 UTC (rev 294) @@ -72,63 +72,68 @@ static int iet_module_info(struct module_info *info) { - int err; - - err = ioctl(ctrl_fd, GET_MODULE_INFO, info); - if (err < 0 && errno == EFAULT) + int ret = ioctl(ctrl_fd, GET_MODULE_INFO, info); + if (ret < 0) { log_error("error calling ioctl GET_MODULE_INFO: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_target_create(u32 *tid, char *name) { struct target_info info; - int err; + int ret; memset(&info, 0, sizeof(info)); snprintf(info.name, sizeof(info.name), "%s", name); info.tid = *tid; - err = ioctl(ctrl_fd, ADD_TARGET, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, ADD_TARGET, &info); + if (ret < 0) { log_error("error calling ioctl ADD_TARGET: %m"); - else if (!err) - *tid = info.tid; + return -errno; + } - return (err < 0) ? -errno : 0; + *tid = info.tid; + return 0; } static int iscsi_target_destroy(u32 tid) { struct target_info info; - int err; + int ret; memset(&info, 0, sizeof(info)); info.tid = tid; - err = ioctl(ctrl_fd, DEL_TARGET, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, DEL_TARGET, &info); + if (ret < 0) { log_error("error calling ioctl DEL_TARGET: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static inline int iscsi_target_destroy_all(void) { - int err; + int ret = ioctl(ctrl_fd, DEL_TARGET_ALL, NULL); + if (ret < 0) { + log_error("error calling DEL_TARGET_ALL: %m"); + return -errno; + } - err = ioctl(ctrl_fd, DEL_TARGET_ALL, NULL); - - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_lunit_create(u32 tid, u32 lun, char *args) { struct volume_info info; char *p; - int err; + int ret; memset(&info, 0, sizeof(info)); @@ -143,74 +148,81 @@ info.args_ptr = (unsigned long)args; info.args_len = strlen(args); - err = ioctl(ctrl_fd, ADD_VOLUME, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, ADD_VOLUME, &info); + if (ret < 0) { log_error("error calling ioctl ADD_VOLUME: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_lunit_destroy(u32 tid, u32 lun) { struct volume_info info; - int err; + int ret; memset(&info, 0, sizeof(info)); info.tid = tid; info.lun = lun; - err = ioctl(ctrl_fd, DEL_VOLUME, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, DEL_VOLUME, &info); + if (ret < 0) { log_error("error calling ioctl DEL_VOLUME: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_conn_destroy(u32 tid, u64 sid, u32 cid) { struct conn_info info; - int err; + int ret; info.tid = tid; info.sid = sid; info.cid = cid; - err = ioctl(ctrl_fd, DEL_CONN, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, DEL_CONN, &info); + if (ret < 0) { log_error("error calling ioctl DEL_CONN: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_param_get(u32 tid, u64 sid, int type, struct iscsi_param *param) { struct iscsi_param_info info; - int err, i; + int ret, i; memset(&info, 0, sizeof(info)); info.tid = tid; info.sid = sid; info.param_type = type; - err = ioctl(ctrl_fd, ISCSI_PARAM_GET, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, ISCSI_PARAM_GET, &info); + if (ret < 0) { log_error("error calling ioctl ISCSI_PARAM_GET: %m"); - else if (!err) { - if (type == key_session) - for (i = 0; i < session_key_last; i++) - param[i].val = info.session_param[i]; - else - for (i = 0; i < target_key_last; i++) - param[i].val = info.target_param[i]; + return -errno; } - return (err < 0) ? -errno : 0; + if (type == key_session) + for (i = 0; i < session_key_last; i++) + param[i].val = info.session_param[i]; + else + for (i = 0; i < target_key_last; i++) + param[i].val = info.target_param[i]; + + return 0; } static int iscsi_param_set(u32 tid, u64 sid, int type, u32 partial, struct iscsi_param *param) { struct iscsi_param_info info; - int i, err; + int i, ret; memset(&info, 0, sizeof(info)); info.tid = tid; @@ -225,17 +237,19 @@ for (i = 0; i < target_key_last; i++) info.target_param[i] = param[i].val; - err = ioctl(ctrl_fd, ISCSI_PARAM_SET, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, ISCSI_PARAM_SET, &info); + if (ret < 0) { log_error("error calling ioctl ISCSI_PARAM_SET: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_session_create(u32 tid, u64 sid, u32 exp_cmd_sn, u32 max_cmd_sn, char *name) { struct session_info info; - int err; + int ret; memset(&info, 0, sizeof(info)); @@ -245,35 +259,39 @@ info.max_cmd_sn = max_cmd_sn; strncpy(info.initiator_name, name, sizeof(info.initiator_name) - 1); - err = ioctl(ctrl_fd, ADD_SESSION, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, ADD_SESSION, &info); + if (ret < 0) { log_error("error calling ioctl ADD_SESSION: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_session_destroy(u32 tid, u64 sid) { struct session_info info; - int err; + int ret; memset(&info, 0, sizeof(info)); info.tid = tid; info.sid = sid; - err = ioctl(ctrl_fd, DEL_SESSION, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, DEL_SESSION, &info); + if (ret < 0) { log_error("error calling ioctl DEL_SESSION: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_conn_create(u32 tid, u64 sid, u32 cid, u32 stat_sn, u32 exp_stat_sn, int fd, u32 hdigest, u32 ddigest) { struct conn_info info; - int err; + int ret; memset(&info, 0, sizeof(info)); @@ -286,22 +304,24 @@ info.header_digest = hdigest; info.data_digest = ddigest; - err = ioctl(ctrl_fd, ADD_CONN, &info); - if (err < 0 && errno == EFAULT) + ret = ioctl(ctrl_fd, ADD_CONN, &info); + if (ret < 0) { log_error("error calling ioctl ADD_CONN: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } static int iscsi_session_info(struct session_info *info) { - int err; - - err = ioctl(ctrl_fd, GET_SESSION_INFO, info); - if (err < 0 && errno == EFAULT) + int ret = ioctl(ctrl_fd, GET_SESSION_INFO, info); + if (ret < 0) { log_error("error calling ioctl GET_SESSION_INFO: %m"); + return -errno; + } - return (err < 0) ? -errno : 0; + return 0; } struct iscsi_kernel_interface ioctl_ki = { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |