2016-10-21 07:15:37 +00:00
|
|
|
diff -uNr ipmitool-1.8.17/lib/ipmi_main.c ipmitool-1.8.17-signal/lib/ipmi_main.c
|
|
|
|
--- ipmitool-1.8.17/lib/ipmi_main.c 2016-05-06 10:48:54.000000000 -0400
|
|
|
|
+++ ipmitool-1.8.17-signal/lib/ipmi_main.c 2016-11-03 22:38:41.868914065 -0400
|
|
|
|
@@ -92,6 +92,7 @@
|
2016-09-26 19:26:39 +00:00
|
|
|
|
2016-10-21 07:15:37 +00:00
|
|
|
extern int verbose;
|
|
|
|
extern int csv_output;
|
|
|
|
+extern int sol_activated;
|
|
|
|
extern const struct valstr ipmi_privlvl_vals[];
|
|
|
|
extern const struct valstr ipmi_authtype_session_vals[];
|
2016-09-26 19:26:39 +00:00
|
|
|
|
2016-10-21 07:15:37 +00:00
|
|
|
@@ -271,24 +272,30 @@
|
2016-09-26 19:26:39 +00:00
|
|
|
if (cmdlist != NULL)
|
|
|
|
ipmi_cmd_print(cmdlist);
|
|
|
|
}
|
|
|
|
-/* ipmi_catch_sigint - Handle the interrupt signal (Ctrl-C), close the
|
|
|
|
- * interface, and exit ipmitool with error (-1)
|
2016-10-21 07:15:37 +00:00
|
|
|
+ /* ipmi_catch_sig - Handle the interrupt signal (Ctrl-C),TERM signal,
|
2016-09-26 19:26:39 +00:00
|
|
|
+ * and HUP signal. Close the interface, and exit
|
|
|
|
+ * ipmitool with error (-1)
|
|
|
|
*
|
|
|
|
- * This insures that the IOL session gets freed
|
|
|
|
- * for other callers.
|
|
|
|
+ * This insures that the IOL session gets freed
|
|
|
|
+ * for other callers.
|
|
|
|
*
|
|
|
|
* returns -1
|
|
|
|
*/
|
|
|
|
-void ipmi_catch_sigint()
|
|
|
|
+void ipmi_catch_sig(const int sig)
|
|
|
|
{
|
2016-10-21 07:15:37 +00:00
|
|
|
- if (ipmi_main_intf != NULL) {
|
2016-09-26 19:26:39 +00:00
|
|
|
- printf("\nSIGN INT: Close Interface %s\n",ipmi_main_intf->desc);
|
2016-10-21 07:15:37 +00:00
|
|
|
- /* reduce retry count to a single retry */
|
|
|
|
- ipmi_main_intf->ssn_params.retry = 1;
|
|
|
|
- /* close interface */
|
|
|
|
- ipmi_main_intf->close(ipmi_main_intf);
|
|
|
|
- }
|
|
|
|
- exit(-1);
|
|
|
|
+ if (sol_activated == 1) {
|
|
|
|
+ printf("\nSIGN %s: Deactivate sol session\r\n",strsignal(sig));
|
|
|
|
+ sol_activated = 0;
|
|
|
|
+ } else {
|
|
|
|
+ if (ipmi_main_intf != NULL) {
|
|
|
|
+ printf("\nSIGN %s: Close Interface %s\n",strsignal(sig), ipmi_main_intf->desc);
|
|
|
|
+ /* reduce retry count to a single retry */
|
|
|
|
+ ipmi_main_intf->ssn_params.retry = 1;
|
|
|
|
+ /* close interface */
|
|
|
|
+ ipmi_main_intf->close(ipmi_main_intf);
|
|
|
|
+ }
|
|
|
|
+ exit(-1);
|
|
|
|
+ }
|
2016-09-26 19:26:39 +00:00
|
|
|
}
|
|
|
|
|
2016-10-21 07:15:37 +00:00
|
|
|
/* ipmi_parse_hex - convert hexadecimal numbers to ascii string
|
|
|
|
@@ -420,7 +427,9 @@
|
2016-09-26 19:26:39 +00:00
|
|
|
/* save program name */
|
|
|
|
progname = strrchr(argv[0], '/');
|
|
|
|
progname = ((progname == NULL) ? argv[0] : progname+1);
|
|
|
|
- signal(SIGINT, ipmi_catch_sigint);
|
|
|
|
+ signal(SIGINT, ipmi_catch_sig);
|
|
|
|
+ signal(SIGTERM, ipmi_catch_sig);
|
|
|
|
+ signal(SIGHUP, ipmi_catch_sig);
|
|
|
|
|
|
|
|
while ((argflag = getopt(argc, (char **)argv, OPTION_STRING)) != -1)
|
|
|
|
{
|
2016-10-21 07:15:37 +00:00
|
|
|
diff -uNr ipmitool-1.8.17/lib/ipmi_sol.c ipmitool-1.8.17-signal/lib/ipmi_sol.c
|
|
|
|
--- ipmitool-1.8.17/lib/ipmi_sol.c 2016-11-03 22:31:55.998893852 -0400
|
|
|
|
+++ ipmitool-1.8.17-signal/lib/ipmi_sol.c 2016-11-04 01:18:45.669370142 -0400
|
|
|
|
@@ -46,6 +46,7 @@
|
|
|
|
#include <time.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
+#include <errno.h>
|
|
|
|
|
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
|
|
# include <config.h>
|
|
|
|
@@ -98,7 +99,7 @@
|
|
|
|
static int _use_sol_for_keepalive = 0;
|
|
|
|
|
|
|
|
extern int verbose;
|
|
|
|
-
|
|
|
|
+int sol_activated = 0;
|
|
|
|
/*
|
|
|
|
* ipmi_sol_payload_access
|
|
|
|
*/
|
|
|
|
@@ -1556,6 +1557,11 @@
|
|
|
|
FD_SET(0, &read_fds);
|
|
|
|
FD_SET(intf->fd, &read_fds);
|
|
|
|
|
|
|
|
+ if (sol_activated == 0) {
|
|
|
|
+ bBmcClosedSession = 0;
|
|
|
|
+ keepAliveRet = 0;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
if (!ipmi_oem_active(intf,"i82571spt"))
|
|
|
|
{
|
|
|
|
/* Send periodic keepalive packet */
|
|
|
|
@@ -1584,6 +1590,11 @@
|
|
|
|
{
|
|
|
|
if (retval == -1)
|
|
|
|
{
|
|
|
|
+ if (errno == EINTR) {
|
|
|
|
+ bBmcClosedSession = 0;
|
|
|
|
+ keepAliveRet = 0;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
/* ERROR */
|
|
|
|
perror("select");
|
|
|
|
return -1;
|
|
|
|
@@ -1629,6 +1640,10 @@
|
|
|
|
{
|
|
|
|
output(rs);
|
|
|
|
}
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ bShouldExit = bBmcClosedSession = 1;
|
|
|
|
+ }
|
|
|
|
/*
|
|
|
|
* Should recv_sol come back null, the incoming packet was not ours.
|
|
|
|
* Just fall through, the keepalive logic will determine if
|
|
|
|
@@ -1647,24 +1662,23 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- leave_raw_mode();
|
|
|
|
-
|
|
|
|
- if (keepAliveRet != 0)
|
|
|
|
- {
|
|
|
|
- lprintf(LOG_ERR, "Error: No response to keepalive - Terminating session");
|
|
|
|
- /* attempt to clean up anyway */
|
|
|
|
- ipmi_sol_deactivate(intf, instance);
|
|
|
|
- exit(1);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (bBmcClosedSession)
|
|
|
|
- {
|
|
|
|
- lprintf(LOG_ERR, "SOL session closed by BMC");
|
|
|
|
- exit(1);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- ipmi_sol_deactivate(intf, instance);
|
|
|
|
+
|
|
|
|
+ leave_raw_mode();
|
|
|
|
+ ipmi_sol_deactivate(intf, instance);
|
|
|
|
+ if (keepAliveRet != 0)
|
|
|
|
+ {
|
|
|
|
+ lprintf(LOG_ERR, "Error: No response to keepalive - Terminating session");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ if (bBmcClosedSession)
|
|
|
|
+ {
|
|
|
|
+ lprintf(LOG_ERR, "SOL session closed by BMC");
|
|
|
|
+ return -1;
|
|
|
|
+ } else if (sol_activated == 0)
|
|
|
|
+ {
|
|
|
|
+ lprintf(LOG_ERR, "SOL session closed by signal");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
@@ -1748,7 +1762,8 @@
|
|
|
|
data[3] = 0x00; /* reserved */
|
|
|
|
data[4] = 0x00; /* reserved */
|
|
|
|
data[5] = 0x00; /* reserved */
|
|
|
|
-
|
|
|
|
+ /* Make sure deactivate code sent to BMC no matter what the status is */
|
|
|
|
+ sol_activated = 1;
|
|
|
|
rsp = intf->sendrecv(intf, &req);
|
|
|
|
|
|
|
|
if (NULL != rsp) {
|