static void getvar(const char *var) { int ret; unsigned int numq, numa; const char *query[4]; char **answer; query[0] = "VAR"; query[1] = upsname; query[2] = var; numq = 3; ret = upscli_get(&ups, numq, query, &numa, &answer); if ((ret < 0) || (numa < numq)) { snprintfcat(logbuffer, sizeof(logbuffer), "NA"); return; } snprintfcat(logbuffer, sizeof(logbuffer), "%s", answer[3]); }
static const char *get_data(const char *type, const char *varname) { int ret; unsigned int numq, numa; char **answer; const char *query[4]; query[0] = type; query[1] = upsname; query[2] = varname; numq = 3; ret = upscli_get(ups, numq, query, &numa, &answer); if ((ret < 0) || (numa < numq)) { return NULL; } /* <type> <upsname> <varname> <desc> */ return answer[3]; }
static int get_var(utype_t *ups, const char *var, char *buf, size_t bufsize) { int ret; unsigned int numq, numa; const char *query[4]; char **answer; /* this shouldn't happen */ if (!ups->upsname) { upslogx(LOG_ERR, "get_var: programming error: no UPS name set [%s]", ups->sys); return -1; } numq = 0; if (!strcmp(var, "numlogins")) { query[0] = "NUMLOGINS"; query[1] = ups->upsname; numq = 2; } if (!strcmp(var, "status")) { query[0] = "VAR"; query[1] = ups->upsname; query[2] = "ups.status"; numq = 3; } if (numq == 0) { upslogx(LOG_ERR, "get_var: programming error: var=%s", var); return -1; } upsdebugx(3, "%s: %s / %s", __func__, ups->sys, var); ret = upscli_get(&ups->conn, numq, query, &numa, &answer); if (ret < 0) { /* detect old upsd */ if (upscli_upserror(&ups->conn) == UPSCLI_ERR_UNKCOMMAND) { upslogx(LOG_ERR, "UPS [%s]: Too old to monitor", ups->sys); return -1; } /* some other error */ return -1; } if (numa < numq) { upslogx(LOG_ERR, "%s: Error: insufficient data " "(got %d args, need at least %d)", var, numa, numq); return -1; } snprintf(buf, bufsize, "%s", answer[numq]); return 0; }