mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 10:37:22 +00:00
ID:333 - Set read timeout to 15s in OpenIPMI interface
Commit sets read timeout in OpenIPMI interface to 15s in order to eliminate possible infinite hang.
This commit is contained in:
parent
c04aa9bb4e
commit
4a8691f477
@ -83,6 +83,9 @@
|
|||||||
*/
|
*/
|
||||||
#define IPMI_OPENIPMI_MAX_RS_DATA_SIZE 35
|
#define IPMI_OPENIPMI_MAX_RS_DATA_SIZE 35
|
||||||
|
|
||||||
|
/* Timeout for reading data from BMC in seconds */
|
||||||
|
#define IPMI_OPENIPMI_READ_TIMEOUT 15
|
||||||
|
|
||||||
extern int verbose;
|
extern int verbose;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -174,11 +177,13 @@ ipmi_openipmi_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
};
|
};
|
||||||
struct ipmi_req _req;
|
struct ipmi_req _req;
|
||||||
static struct ipmi_rs rsp;
|
static struct ipmi_rs rsp;
|
||||||
|
struct timeval read_timeout;
|
||||||
static int curr_seq = 0;
|
static int curr_seq = 0;
|
||||||
fd_set rset;
|
fd_set rset;
|
||||||
|
|
||||||
uint8_t * data = NULL;
|
uint8_t * data = NULL;
|
||||||
int data_len = 0;
|
int data_len = 0;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
|
|
||||||
if (intf == NULL || req == NULL)
|
if (intf == NULL || req == NULL)
|
||||||
@ -327,14 +332,23 @@ ipmi_openipmi_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
|
|
||||||
FD_ZERO(&rset);
|
FD_ZERO(&rset);
|
||||||
FD_SET(intf->fd, &rset);
|
FD_SET(intf->fd, &rset);
|
||||||
|
read_timeout.tv_sec = IPMI_OPENIPMI_READ_TIMEOUT;
|
||||||
if (select(intf->fd+1, &rset, NULL, NULL, NULL) < 0) {
|
read_timeout.tv_usec = 0;
|
||||||
|
retval = select(intf->fd+1, &rset, NULL, NULL, &read_timeout);
|
||||||
|
if (retval < 0) {
|
||||||
lperror(LOG_ERR, "I/O Error");
|
lperror(LOG_ERR, "I/O Error");
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
free(data);
|
free(data);
|
||||||
data = NULL;
|
data = NULL;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
} else if (retval == 0) {
|
||||||
|
lprintf(LOG_ERR, "No data available");
|
||||||
|
if (data != NULL) {
|
||||||
|
free(data);
|
||||||
|
data = NULL;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
if (FD_ISSET(intf->fd, &rset) == 0) {
|
if (FD_ISSET(intf->fd, &rset) == 0) {
|
||||||
lprintf(LOG_ERR, "No data available");
|
lprintf(LOG_ERR, "No data available");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user