From 0eef5be7938283298bd0f14722b168ef77b9200c Mon Sep 17 00:00:00 2001 From: Arjen de Korte Date: Tue, 27 Jan 2009 21:29:20 +0000 Subject: [PATCH] Cancel any pending shutdowns before sending a new shutdown command Fossil-ID: SVN r1756 --- drivers/blazer.c | 43 +++++++++++++++++++++++++++---------------- drivers/blazer_usb.c | 2 +- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/drivers/blazer.c b/drivers/blazer.c index eaf6da917a..7a7112bea3 100644 --- a/drivers/blazer.c +++ b/drivers/blazer.c @@ -384,13 +384,16 @@ static int blazer_instcmd(const char *cmdname, const char *extra) snprintf(buf, sizeof(buf), "%s", instcmd[i].ups); - if (blazer_command(buf, buf, sizeof(buf)) == 0) { - upslogx(LOG_INFO, "instcmd: command [%s] handled", cmdname); - return STAT_INSTCMD_HANDLED; + /* + * If a command is invalid, it will be echoed back + */ + if (blazer_command(buf, buf, sizeof(buf)) > 0) { + upslogx(LOG_ERR, "instcmd: command [%s] failed", cmdname); + return STAT_INSTCMD_FAILED; } - upslogx(LOG_ERR, "instcmd: command [%s] failed", cmdname); - return STAT_INSTCMD_FAILED; + upslogx(LOG_INFO, "instcmd: command [%s] handled", cmdname); + return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "shutdown.return")) { @@ -418,14 +421,16 @@ static int blazer_instcmd(const char *cmdname, const char *extra) return STAT_INSTCMD_UNKNOWN; } - if (blazer_command(buf, buf, sizeof(buf)) == 0) { - upslogx(LOG_INFO, "instcmd: command [%s] handled", cmdname); - return STAT_INSTCMD_HANDLED; + /* + * If a command is invalid, it will be echoed back + */ + if (blazer_command(buf, buf, sizeof(buf)) > 0) { + upslogx(LOG_ERR, "instcmd: command [%s] failed", cmdname); + return STAT_INSTCMD_FAILED; } - upslogx(LOG_ERR, "instcmd: command [%s] failed", cmdname); - return STAT_INSTCMD_FAILED; - + upslogx(LOG_INFO, "instcmd: command [%s] handled", cmdname); + return STAT_INSTCMD_HANDLED; } @@ -590,12 +595,18 @@ void upsdrv_shutdown(void) { int retry; - for (retry = 0; retry < MAXTRIES; retry++) { + for (retry = 1; retry <= MAXTRIES; retry++) { - if (blazer_instcmd("shutdown.return", NULL) == STAT_INSTCMD_HANDLED) { - return; + if (blazer_instcmd("shutdown.stop", NULL) != STAT_INSTCMD_HANDLED) { + continue; } - } - upsdebugx(2, "Shutdown failed after %d retries!", retry); + if (blazer_instcmd("shutdown.return", NULL) != STAT_INSTCMD_HANDLED) { + continue; + } + + fatalx(EXIT_SUCCESS, "Shutting down in %d seconds", offdelay); + } + + fatalx(EXIT_FAILURE, "Shutdown failed!"); } diff --git a/drivers/blazer_usb.c b/drivers/blazer_usb.c index d0ce199682..b789d4d272 100644 --- a/drivers/blazer_usb.c +++ b/drivers/blazer_usb.c @@ -81,7 +81,7 @@ static int phoenix_command(const char *cmd, char *buf, size_t buflen) if (ret <= 0) { upsdebugx(3, "read: %s", ret ? usb_strerror() : "timeout"); - return ret; + return 0; } }