Merge pull request #393 from pizhenwei/on-fd-dup
Add iscsi_set_fd_dup_cb
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <basetsd.h>
|
||||
@@ -171,6 +172,8 @@ struct iscsi_context {
|
||||
struct iscsi_context *old_iscsi;
|
||||
int retry_cnt;
|
||||
int no_ua_on_reconnect;
|
||||
void (*fd_dup_cb)(struct iscsi_context *iscsi, void *opaque);
|
||||
void *fd_dup_opaque;
|
||||
};
|
||||
|
||||
#define ISCSI_PDU_IMMEDIATE 0x40
|
||||
@@ -397,6 +400,15 @@ typedef struct iscsi_transport {
|
||||
int (*which_events)(struct iscsi_context *iscsi);
|
||||
} iscsi_transport;
|
||||
|
||||
static inline int iscsi_dup2(struct iscsi_context *iscsi, int oldfd, int newfd)
|
||||
{
|
||||
int ret = dup2(oldfd, newfd);
|
||||
if ((ret >= 0) && iscsi->fd_dup_cb)
|
||||
iscsi->fd_dup_cb(iscsi, iscsi->fd_dup_opaque);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1648,6 +1648,12 @@ iscsi_set_reconnect_max_retries(struct iscsi_context *iscsi, int count);
|
||||
EXTERN void
|
||||
iscsi_set_no_ua_on_reconnect(struct iscsi_context *iscsi, int state);
|
||||
|
||||
/* Set callback on iscsi file descriptor on duplicating */
|
||||
EXTERN void
|
||||
iscsi_set_fd_dup_cb(struct iscsi_context *iscsi,
|
||||
void (*cb)(struct iscsi_context *iscsi, void *opaque),
|
||||
void *opaque);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -454,6 +454,8 @@ static int reconnect(struct iscsi_context *iscsi, int force)
|
||||
tmp_iscsi->cache_allocations = iscsi->cache_allocations;
|
||||
tmp_iscsi->scsi_timeout = iscsi->scsi_timeout;
|
||||
tmp_iscsi->no_ua_on_reconnect = iscsi->no_ua_on_reconnect;
|
||||
tmp_iscsi->fd_dup_cb = iscsi->fd_dup_cb;
|
||||
tmp_iscsi->fd_dup_opaque = iscsi->fd_dup_opaque;
|
||||
|
||||
tmp_iscsi->reconnect_max_retries = iscsi->reconnect_max_retries;
|
||||
|
||||
|
||||
@@ -831,3 +831,12 @@ iscsi_set_timeout(struct iscsi_context *iscsi, int timeout)
|
||||
iscsi->scsi_timeout = timeout;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
iscsi_set_fd_dup_cb(struct iscsi_context *iscsi,
|
||||
void (*cb)(struct iscsi_context *iscsi, void *opaque),
|
||||
void *opaque)
|
||||
{
|
||||
iscsi->fd_dup_cb = cb;
|
||||
iscsi->fd_dup_opaque = opaque;
|
||||
}
|
||||
|
||||
@@ -1525,7 +1525,7 @@ static int iser_connected_handler(struct rdma_cm_id *cma_id) {
|
||||
struct iscsi_context *iscsi = cma_id->context;
|
||||
struct iser_conn *iser_conn = iscsi->opaque;
|
||||
|
||||
if (dup2(iser_conn->comp_channel->fd, iscsi->fd) == -1) {
|
||||
if (iscsi_dup2(iscsi, iser_conn->comp_channel->fd, iscsi->fd) == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1683,7 +1683,7 @@ iscsi_iser_connect(struct iscsi_context *iscsi, union socket_address *sa,__attri
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (dup2(iser_conn->cma_channel->fd, iscsi->fd) < 0) {
|
||||
if (iscsi_dup2(iscsi, iser_conn->cma_channel->fd, iscsi->fd) < 0) {
|
||||
iscsi_set_error(iscsi, "Failed dup event channel fd");
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -286,3 +286,4 @@ scsi_task_set_iov_out
|
||||
scsi_version_to_str
|
||||
scsi_version_descriptor_to_str
|
||||
win32_poll
|
||||
iscsi_set_fd_dup_cb
|
||||
|
||||
@@ -228,7 +228,7 @@ static int iscsi_tcp_connect(struct iscsi_context *iscsi, union socket_address *
|
||||
}
|
||||
|
||||
if (iscsi->old_iscsi && iscsi->fd != iscsi->old_iscsi->fd) {
|
||||
if (dup2(iscsi->fd, iscsi->old_iscsi->fd) == -1) {
|
||||
if (iscsi_dup2(iscsi, iscsi->fd, iscsi->old_iscsi->fd) == -1) {
|
||||
return -1;
|
||||
}
|
||||
close(iscsi->fd);
|
||||
|
||||
Reference in New Issue
Block a user