diff --git a/clients/upsimage.c b/clients/upsimage.c index 9e92f96e8e..2739929c83 100644 --- a/clients/upsimage.c +++ b/clients/upsimage.c @@ -210,6 +210,17 @@ static void drawscale( } /* draws the bar style indicator */ +static void drawbar( + int lvllo, int lvlhi, /* min and max numbers on the scale */ + int step, int step5, int step10, /* steps for minor, submajor and major dashes */ + int redlo1, int redhi1, /* first red zone start and end */ + int redlo2, int redhi2, /* second red zone start and end */ + int grnlo, int grnhi, /* green zone start and end */ + double value, /* UPS variable value to draw */ + const char *format /* printf style format to be used when rendering summary text */ +) + __attribute__((noreturn)); + static void drawbar( int lvllo, int lvlhi, /* min and max numbers on the scale */ int step, int step5, int step10, /* steps for minor, submajor and major dashes */ @@ -284,6 +295,9 @@ static void drawbar( } /* draws the error image */ +static void noimage(const char *fmt, ...) + __attribute__((noreturn)); + static void noimage(const char *fmt, ...) { gdImagePtr im; @@ -331,6 +345,12 @@ static void noimage(const char *fmt, ...) drawimage(im); + /* NOTE: Earlier code called noimage() and then exit(EXIT_FAILURE); + * to signal an error via process exit code. Now that drawimage() + * always ends with exit(EXIT_SUCCESS) - which might make webserver + * feel good - the command-line use if any suffers no error returns. + */ + /* NOTREACHED */ } @@ -338,6 +358,10 @@ static void noimage(const char *fmt, ...) UPS variable can be determined. deviation < 0 means that values below nom should be grey instead of green */ +static void drawgeneralbar(double var, int min, int nom, int max, + int deviation, const char *format) + __attribute__((noreturn)); + static void drawgeneralbar(double var, int min, int nom, int max, int deviation, const char *format) { @@ -397,6 +421,10 @@ static void drawgeneralbar(double var, int min, int nom, int max, } /* draws input and output voltage bar style indicators */ +static void draw_utility(double var, int min, int nom, int max, + int deviation, const char *format) + __attribute__((noreturn)); + static void draw_utility(double var, int min, int nom, int max, int deviation, const char *format) { @@ -440,6 +468,10 @@ static void draw_utility(double var, int min, int nom, int max, } /* draws battery.percent bar style indicator */ +static void draw_battpct(double var, int min, int nom, + int max, int deviation, const char *format) + __attribute__((noreturn)); + static void draw_battpct(double var, int min, int nom, int max, int deviation, const char *format) { @@ -455,6 +487,10 @@ static void draw_battpct(double var, int min, int nom, } /* draws battery.voltage bar style indicator */ +static void draw_battvolt(double var, int min, int nom, int max, + int deviation, const char *format) + __attribute__((noreturn)); + static void draw_battvolt(double var, int min, int nom, int max, int deviation, const char *format) { @@ -501,6 +537,11 @@ static void draw_battvolt(double var, int min, int nom, int max, } /* draws ups.load bar style indicator */ +static void draw_upsload(double var, int min, + int nom, int max, + int deviation, const char *format) + __attribute__((noreturn)); + static void draw_upsload(double var, int min, int nom, int max, int deviation, const char *format) @@ -514,6 +555,10 @@ static void draw_upsload(double var, int min, } /* draws temperature bar style indicator */ +static void draw_temperature(double var, int min, int nom, int max, + int deviation, const char *format) + __attribute__((noreturn)); + static void draw_temperature(double var, int min, int nom, int max, int deviation, const char *format) { @@ -526,6 +571,10 @@ static void draw_temperature(double var, int min, int nom, int max, } /* draws humidity bar style indicator */ +static void draw_humidity(double var, int min, int nom, int max, + int deviation, const char *format) + __attribute__((noreturn)); + static void draw_humidity(double var, int min, int nom, int max, int deviation, const char *format) { @@ -581,13 +630,17 @@ int main(int argc, char **argv) if (upscli_splitname(monhost, &upsname, &hostname, &port) != 0) { noimage("Invalid UPS definition (upsname[@hostname[:port]])\n"); - exit(EXIT_FAILURE); +#ifndef HAVE___ATTRIBUTE__NORETURN + exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */ +#endif } if (upscli_connect(&ups, hostname, port, 0) < 0) { noimage("Can't connect to server:\n%s\n", upscli_strerror(&ups)); - exit(EXIT_FAILURE); +#ifndef HAVE___ATTRIBUTE__NORETURN + exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */ +#endif } for (i = 0; imgvar[i].name; i++) @@ -597,7 +650,9 @@ int main(int argc, char **argv) registered with this variable */ if (!imgvar[i].drawfunc) { noimage("Draw function N/A"); - exit(EXIT_FAILURE); +#ifndef HAVE___ATTRIBUTE__NORETURN + exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */ +#endif } /* get the variable value */ @@ -608,7 +663,9 @@ int main(int argc, char **argv) snprintf(str, sizeof(str), "%s N/A", imgvar[i].name); noimage(str); - exit(EXIT_FAILURE); +#ifndef HAVE___ATTRIBUTE__NORETURN + exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */ +#endif } /* when getting minimum, nominal and maximum values, @@ -661,7 +718,9 @@ int main(int argc, char **argv) } noimage("Unknown display"); +#ifndef HAVE___ATTRIBUTE__NORETURN exit(EXIT_FAILURE); +#endif } imgvar_t imgvar[] = { diff --git a/clients/upsmon.c b/clients/upsmon.c index 0f769385a6..e76fb16354 100644 --- a/clients/upsmon.c +++ b/clients/upsmon.c @@ -630,6 +630,9 @@ static void slavesync(void) } } +static void forceshutdown(void) + __attribute__((noreturn)); + static void forceshutdown(void) { utype_t *ups; diff --git a/common/common.c b/common/common.c index b51e1f5ee7..d9985dd387 100644 --- a/common/common.c +++ b/common/common.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -301,7 +302,11 @@ int snprintfcat(char *dst, size_t size, const char *fmt, ...) int ret; size--; - assert(len <= size); + if (len > size) { + /* Do not truncate existing string */ + errno = ERANGE; + return -1; + } va_start(ap, fmt); #ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL @@ -327,9 +332,14 @@ int snprintfcat(char *dst, size_t size, const char *fmt, ...) * In theory it can overflow a 64-vs-32 bit range, or signed-vs-unsigned. * In practice we hope to not have gigabytes-long config strings. */ - assert(ret >= 0); + if (ret < 0) { + return ret; + } #ifdef INT_MAX - assert ((unsigned long long)len < ((unsigned long long)INT_MAX - ret)); + if ( ( (unsigned long long)len + (unsigned long long)ret ) >= (unsigned long long)INT_MAX ) { + errno = ERANGE; + return -1; + } #endif return (int)len + ret; } diff --git a/common/str.c b/common/str.c index 092efcf427..8b58495583 100644 --- a/common/str.c +++ b/common/str.c @@ -252,7 +252,7 @@ int str_to_short(const char *string, short *number, const int base) return 0; } - *number = num; + *number = (short)num; return 1; } @@ -273,7 +273,7 @@ int str_to_short_strict(const char *string, short *number, const int base) return 0; } - *number = num; + *number = (short)num; return 1; } @@ -291,7 +291,7 @@ int str_to_ushort(const char *string, unsigned short *number, const int base) return 0; } - *number = num; + *number = (unsigned short)num; return 1; } @@ -309,7 +309,7 @@ int str_to_ushort_strict(const char *string, unsigned short *number, const int b return 0; } - *number = num; + *number = (unsigned short)num; return 1; } diff --git a/common/strerror.c b/common/strerror.c index b5cecb9673..e00f208aba 100644 --- a/common/strerror.c +++ b/common/strerror.c @@ -11,6 +11,16 @@ char *strerror(int errnum) { static char buf[32]; +#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE +#pragma GCC diagnostic push +#endif +#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_BREAK +#pragma GCC diagnostic ignored "-Wunreachable-code-break" +#endif +#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE +#pragma GCC diagnostic ignored "-Wunreachable-code" +#endif + switch (errnum) { #if defined (EPERM) case EPERM: @@ -498,6 +508,11 @@ char *strerror(int errnum) /* Fallback: just print the error number */ snprintf(buf, sizeof(buf), "Error %d", errnum); return buf; + +#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE +#pragma GCC diagnostic pop +#endif + } #endif /* HAVE_STRERROR */ diff --git a/common/upsconf.c b/common/upsconf.c index 80c2de091c..9c6ebbd1f4 100644 --- a/common/upsconf.c +++ b/common/upsconf.c @@ -29,7 +29,7 @@ static char *ups_section; /* handle arguments separated by parseconf */ -static void conf_args(int numargs, char **arg) +static void conf_args(size_t numargs, char **arg) { if (numargs < 1) return; diff --git a/drivers/al175.c b/drivers/al175.c index a705a42542..a617b919eb 100644 --- a/drivers/al175.c +++ b/drivers/al175.c @@ -191,7 +191,7 @@ typedef struct { /** * convert hex string to int * @param head input string - * @param count string length + * @param len string length * @return parsed value (>=0) if success, -1 on error */ static long from_hex(const byte_t *head, unsigned len) @@ -1000,23 +1000,23 @@ typedef int VV_t; /* voltage */ #define ACT int /* Declare to keep compiler happy even if some routines below are not used currently */ -ACT TOGGLE_PRS_ONOFF (); -ACT CANCEL_BOOST (); -ACT STOP_BATTERY_TEST (); +ACT TOGGLE_PRS_ONOFF (void); +ACT CANCEL_BOOST (void); +ACT STOP_BATTERY_TEST (void); ACT START_BATTERY_TEST (VV_t EndVolt, unsigned Minutes); ACT SET_FLOAT_VOLTAGE (VV_t v); ACT SET_BOOST_VOLTAGE (VV_t v); ACT SET_HIGH_BATTERY_LIMIT (VV_t Vhigh); ACT SET_LOW_BATTERY_LIMIT (VV_t Vlow); ACT SET_DISCONNECT_LEVEL_AND_DELAY (VV_t level, mm_t delay); -ACT RESET_ALARMS (); -ACT CHANGE_COMM_PROTOCOL (); +ACT RESET_ALARMS (void); +ACT CHANGE_COMM_PROTOCOL (void); ACT SET_VOLTAGE_AT_ZERO_T (VV_t v); ACT SET_SLOPE_AT_ZERO_T (VV_t mv_per_degree); ACT SET_MAX_TCOMP_VOLTAGE (VV_t v); ACT SET_MIN_TCOMP_VOLTAGE (VV_t v); ACT SWITCH_TEMP_COMP (int on); -ACT SWITCH_SYM_ALARM (); +ACT SWITCH_SYM_ALARM (void); /* Implement */ ACT TOGGLE_PRS_ONOFF () { return al175_do(0x81, 0x80 Z3); } @@ -1229,6 +1229,9 @@ void upsdrv_updateinfo(void) } +void upsdrv_shutdown(void) + __attribute__((noreturn)); + void upsdrv_shutdown(void) { /* TODO use TOGGLE_PRS_ONOFF for shutdown */ diff --git a/drivers/bcmxcp.c b/drivers/bcmxcp.c index cb1aa5ceaa..d52b6bf54b 100644 --- a/drivers/bcmxcp.c +++ b/drivers/bcmxcp.c @@ -2076,9 +2076,6 @@ static int instcmd(const char *cmdname, const char *extra) snprintf(success_msg, sizeof(success_msg)-1, "Outlet %d is %s",outlet_num, (cmdname[NUT_OUTLET_POSITION+8] == 'n')?"On":"Off"); return decode_instcmd_exec(res, (unsigned char)answer[0], cmdname, success_msg); - - - } upslogx(LOG_NOTICE, "instcmd: unknown command [%s]", cmdname); @@ -2099,39 +2096,32 @@ static int decode_instcmd_exec(const int res, const unsigned char exec_status, c upslogx(LOG_NOTICE, "[%s] %s", cmdname, success_msg); upsdrv_comm_good(); return STAT_INSTCMD_HANDLED; - break; } case BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST: { upslogx(LOG_NOTICE, "[%s] Parameter adjusted", cmdname); upslogx(LOG_NOTICE, "[%s] %s", cmdname, success_msg); upsdrv_comm_good(); return STAT_INSTCMD_HANDLED; - break; } case BCMXCP_RETURN_BUSY: { upslogx(LOG_NOTICE, "[%s] Busy or disbled by front panel", cmdname); return STAT_INSTCMD_FAILED; - break; } case BCMXCP_RETURN_UNRECOGNISED: { upslogx(LOG_NOTICE, "[%s] Unrecognised command byte or corrupt checksum", cmdname); return STAT_INSTCMD_FAILED; - break; } case BCMXCP_RETURN_INVALID_PARAMETER: { upslogx(LOG_NOTICE, "[%s] Invalid parameter", cmdname); return STAT_INSTCMD_INVALID; - break; } case BCMXCP_RETURN_PARAMETER_OUT_OF_RANGE: { upslogx(LOG_NOTICE, "[%s] Parameter out of range", cmdname); return STAT_INSTCMD_INVALID; - break; } default: { upslogx(LOG_NOTICE, "[%s] Not supported", cmdname); return STAT_INSTCMD_INVALID; - break; } } } @@ -2442,39 +2432,32 @@ static int decode_setvar_exec(const int res, const unsigned char exec_status, co upslogx(LOG_NOTICE, "[%s] %s", cmdname, success_msg); upsdrv_comm_good(); return STAT_SET_HANDLED; - break; } case BCMXCP_RETURN_ACCEPTED_PARAMETER_ADJUST: { upslogx(LOG_NOTICE, "[%s] Parameter adjusted", cmdname); upslogx(LOG_NOTICE, "[%s] %s", cmdname, success_msg); upsdrv_comm_good(); return STAT_SET_HANDLED; - break; } case BCMXCP_RETURN_BUSY: { upslogx(LOG_NOTICE, "[%s] Busy or disbled by front panel", cmdname); return STAT_SET_FAILED; - break; } case BCMXCP_RETURN_UNRECOGNISED: { upslogx(LOG_NOTICE, "[%s] Unrecognised command byte or corrupt checksum", cmdname); return STAT_SET_FAILED; - break; } case BCMXCP_RETURN_INVALID_PARAMETER: { upslogx(LOG_NOTICE, "[%s] Invalid parameter", cmdname); return STAT_SET_INVALID; - break; } case BCMXCP_RETURN_PARAMETER_OUT_OF_RANGE: { upslogx(LOG_NOTICE, "[%s] Parameter out of range", cmdname); return STAT_SET_INVALID; - break; } default: { upslogx(LOG_NOTICE, "[%s] Not supported", cmdname); return STAT_SET_INVALID; - break; } } } diff --git a/drivers/bestfcom.c b/drivers/bestfcom.c index c19f727045..35e28a3c7e 100644 --- a/drivers/bestfcom.c +++ b/drivers/bestfcom.c @@ -637,7 +637,6 @@ static void upsdrv_init_nofc(void) break; default: fatalx(EXIT_FAILURE, "Unknown model %s in upsdrv_init_nofc()", rstring); - break; } fc.valid = 1; } diff --git a/drivers/hidparser.c b/drivers/hidparser.c index c6f124ca02..ca36927098 100644 --- a/drivers/hidparser.c +++ b/drivers/hidparser.c @@ -157,7 +157,7 @@ static int HIDParse(HIDParser_t *pParser, HIDData_t *pData) if (pParser->Count == 0) { pParser->Item = pParser->ReportDesc[pParser->Pos++]; pParser->Value = 0; -#if WORDS_BIGENDIAN +#if (defined (WORDS_BIGENDIAN)) && (WORDS_BIGENDIAN) { int i; unsigned long valTmp = 0; diff --git a/drivers/libshut.c b/drivers/libshut.c index 65ffd5f568..c723466771 100644 --- a/drivers/libshut.c +++ b/drivers/libshut.c @@ -274,7 +274,7 @@ static int shut_control_msg(int upsfd, int requesttype, int request, int value, #define BYTESWAP(in) (((in & 0xFF) << 8) + ((in & 0xFF00) >> 8)) static void align_request(struct shut_ctrltransfer_s *ctrl) { -#if WORDS_BIGENDIAN +#if (defined (WORDS_BIGENDIAN)) && (WORDS_BIGENDIAN) /* Sparc/Mips/... are big endian, USB/SHUT little endian */ (*ctrl).wValue = BYTESWAP((*ctrl).wValue); (*ctrl).wIndex = BYTESWAP((*ctrl).wIndex); diff --git a/drivers/liebert-esp2.c b/drivers/liebert-esp2.c index e415332e4c..f246ffe322 100644 --- a/drivers/liebert-esp2.c +++ b/drivers/liebert-esp2.c @@ -553,10 +553,10 @@ void upsdrv_shutdown(void) char reply[8]; if(!(do_command(cmd_setOutOffMode, reply, 8) != -1) && - (do_command(cmd_setOutOffDelay, reply, 8) != -1) && - (do_command(cmd_sysLoadKey, reply, 6) != -1) && - (do_command(cmd_shutdown, reply, 8) != -1)) - upslogx(LOG_ERR, "Failed to shutdown UPS"); + (do_command(cmd_setOutOffDelay, reply, 8) != -1) && + (do_command(cmd_sysLoadKey, reply, 6) != -1) && + (do_command(cmd_shutdown, reply, 8) != -1)) + upslogx(LOG_ERR, "Failed to shutdown UPS"); } static int instcmd(const char *cmdname, const char *extra) diff --git a/drivers/netxml-ups.c b/drivers/netxml-ups.c index e6563e4d8e..025c0e1518 100644 --- a/drivers/netxml-ups.c +++ b/drivers/netxml-ups.c @@ -175,7 +175,7 @@ static object_entry_t *set_object_add( /** * \brief SET_OBJECT: RAW POST mode implementation * - * \brief req SET_OBJECT request + * \param req SET_OBJECT request * * \return Response to the request */ @@ -185,7 +185,7 @@ static object_query_t *set_object_raw(object_query_t *req); /** * \brief SET_OBJECT: FORM POST mode implementation * - * \brief req SET_OBJECT request + * \param req SET_OBJECT request * * \return \c NULL (FORM POST mode resp. is ignored by specification) */ @@ -195,7 +195,7 @@ static object_query_t *set_object_form(object_query_t *req); /** * \brief SET_OBJECT: implementation * - * \brief req SET_OBJECT request + * \param req SET_OBJECT request * * \return Response to the request */ @@ -799,8 +799,8 @@ static int netxml_alarm_subscribe(const char *page) } /* Range of valid values constrained above */ - port = tmp_port; - secret = tmp_secret; + port = (int)tmp_port; + secret = (int)tmp_secret; } @@ -1069,7 +1069,7 @@ static void set_object_req_destroy(set_object_req_t *req) { /** * \brief SET_OBJECT response list entry destructor * - * \param req SET_OBJECT response list entry + * \param resp SET_OBJECT response list entry */ static void set_object_resp_destroy(set_object_resp_t *resp) { assert(NULL != resp); @@ -1238,8 +1238,8 @@ static object_entry_t *set_object_add( * \param buff Buffer * \param entry SET_OBJECT request entry * - * \retval OBJECT_OK on success - * \retval OBJECT_ERROR otherwise + * \return OBJECT_OK on success + * \return OBJECT_ERROR otherwise */ static object_query_status_t set_object_serialise_entries(ne_buffer *buff, object_entry_t *entry) { object_query_status_t status = OBJECT_OK; @@ -1580,9 +1580,9 @@ static object_query_t *set_object_deserialise_raw(ne_buffer *buff) { * * The function creates HTTP request, sends it and reads-out the response. * - * \param[in] session HTTP session + * \param[in] argsession HTTP session * \param[in] method Request method - * \param[in] uri Request URI + * \param[in] arguri Request URI * \param[in] ct Request content type (optional, \c NULL accepted) * \param[in] req_body Request body (optional, \c NULL is accepted) * \param[out] resp_body Response body (optional, \c NULL is accepted) diff --git a/drivers/nutdrv_qx.c b/drivers/nutdrv_qx.c index 0388fd20f4..652d1167ca 100644 --- a/drivers/nutdrv_qx.c +++ b/drivers/nutdrv_qx.c @@ -2149,11 +2149,29 @@ static int qx_command(const char *cmd, char *buf, size_t buflen) { case -EBUSY: /* Device or resource busy */ fatal_with_errno(EXIT_FAILURE, "Got disconnected by another driver"); +#ifndef HAVE___ATTRIBUTE__NORETURN +# if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunreachable-code" +# endif exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */ +# if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) +# pragma GCC diagnostic pop +# endif +#endif case -EPERM: /* Operation not permitted */ fatal_with_errno(EXIT_FAILURE, "Permissions problem"); +#ifndef HAVE___ATTRIBUTE__NORETURN +# if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunreachable-code" +# endif exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */ +# if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) +# pragma GCC diagnostic pop +# endif +#endif case -EPIPE: /* Broken pipe */ if (usb_clear_halt(udev, 0x81) == 0) { diff --git a/drivers/powercom.c b/drivers/powercom.c index 23e2a09077..22182f4236 100644 --- a/drivers/powercom.c +++ b/drivers/powercom.c @@ -284,6 +284,9 @@ static unsigned int OPTImodels[] = {0,0,0,575,0,0,0,0,0,0,0,0,0,0,0,0}; * local used functions */ +static void shutdown_halt(void) + __attribute__((noreturn)); + static void shutdown_halt(void) { ser_send_char (upsfd, SHUTDOWN); @@ -294,6 +297,9 @@ static void shutdown_halt(void) exit (0); } +static void shutdown_ret(void) + __attribute__((noreturn)); + static void shutdown_ret(void) { ser_send_char (upsfd, RESTART); @@ -314,12 +320,19 @@ static int instcmd (const char *cmdname, const char *extra) return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "shutdown.return")) { + /* NOTE: In this context, "return" is UPS behavior after the + * wall-power gets restored. The routine exits the driver anyway. + */ shutdown_ret(); +#ifndef HAVE___ATTRIBUTE__NORETURN return STAT_INSTCMD_HANDLED; +#endif } if (!strcasecmp(cmdname, "shutdown.stayoff")) { shutdown_halt(); +#ifndef HAVE___ATTRIBUTE__NORETURN return STAT_INSTCMD_HANDLED; +#endif } upslogx(LOG_NOTICE, "instcmd: unknown command [%s] [%s]", cmdname, extra); @@ -818,6 +831,9 @@ void upsdrv_updateinfo(void) } /* shutdown UPS */ +void upsdrv_shutdown(void) + __attribute__((noreturn)); + void upsdrv_shutdown(void) { /* power down the attached load immediately */ diff --git a/drivers/powerman-pdu.c b/drivers/powerman-pdu.c index de66fecb15..1611d3ce5b 100644 --- a/drivers/powerman-pdu.c +++ b/drivers/powerman-pdu.c @@ -133,6 +133,9 @@ void upsdrv_initinfo(void) /* FIXME: no need for setvar (ex for outlet.n.delay.*)!? */ } +void upsdrv_shutdown(void) + __attribute__((noreturn)); + void upsdrv_shutdown(void) { /* FIXME: shutdown all outlets? */ diff --git a/drivers/riello_usb.c b/drivers/riello_usb.c index 1731b2a4fd..e353d097a1 100644 --- a/drivers/riello_usb.c +++ b/drivers/riello_usb.c @@ -952,6 +952,9 @@ void upsdrv_initinfo(void) upsh.instcmd = riello_instcmd; } +void upsdrv_shutdown(void) + __attribute__((noreturn)); + void upsdrv_shutdown(void) { /* tell the UPS to shut down, then return - DO NOT SLEEP HERE */ diff --git a/tools/nut-scanner/scan_snmp.c b/tools/nut-scanner/scan_snmp.c index f661110282..1dd730e913 100644 --- a/tools/nut-scanner/scan_snmp.c +++ b/tools/nut-scanner/scan_snmp.c @@ -99,11 +99,11 @@ static int (*nut_generate_Ku)(const oid * hashtype, u_int hashtype_len, unsigned char * P, size_t pplen, unsigned char * Ku, size_t * kulen); static char* (*nut_snmp_out_toggle_options)(char *options); static const char * (*nut_snmp_api_errstring) (int snmp_errnumber); -static int (*nut_snmp_errno); -static oid (*nut_usmAESPrivProtocol); -static oid (*nut_usmHMACMD5AuthProtocol); -static oid (*nut_usmHMACSHA1AuthProtocol); -static oid (*nut_usmDESPrivProtocol); +static int *nut_snmp_errno; +static oid *nut_usmAESPrivProtocol; +static oid *nut_usmHMACMD5AuthProtocol; +static oid *nut_usmHMACSHA1AuthProtocol; +static oid *nut_usmDESPrivProtocol; /* return 0 on error; visible externally */ int nutscan_load_snmp_library(const char *libname_path);