version 1.28, 2020/08/03 14:45:54 |
version 1.29, 2020/09/12 18:11:43 |
|
|
#include <time.h> |
#include <time.h> |
#include <unistd.h> |
#include <unistd.h> |
#include <util.h> |
#include <util.h> |
|
#include <wchar.h> |
|
|
#include "smi.h" |
#include "smi.h" |
#include "snmp.h" |
#include "snmp.h" |
|
|
__dead void snmpc_printerror(enum snmp_error, struct ber_element *, int, |
__dead void snmpc_printerror(enum snmp_error, struct ber_element *, int, |
const char *); |
const char *); |
char *snmpc_hex2bin(char *, size_t *); |
char *snmpc_hex2bin(char *, size_t *); |
|
ssize_t snmpc_mbswidth(char *); |
struct ber_element *snmpc_varbindparse(int, char *[]); |
struct ber_element *snmpc_varbindparse(int, char *[]); |
void usage(void); |
void usage(void); |
|
|
|
|
{ |
{ |
struct snmpc_df { |
struct snmpc_df { |
uint32_t index; |
uint32_t index; |
/* DisplayString is 255a DISPLAY-HINT */ |
char *descr; |
char descr[256]; |
int descrwidth; |
/* Theoretical maximum for 2 32 bit values multiplied */ |
/* Theoretical maximum for 2 32 bit values multiplied */ |
char size[21]; |
char size[21]; |
char used[21]; |
char used[21]; |
|
|
struct ber_oid sizeoid = {{ 1, 3, 6, 1, 2, 1, 25, 2, 3, 1, 5 }, 11}; |
struct ber_oid sizeoid = {{ 1, 3, 6, 1, 2, 1, 25, 2, 3, 1, 5 }, 11}; |
struct ber_oid usedoid = {{ 1, 3, 6, 1, 2, 1, 25, 2, 3, 1, 6 }, 11}; |
struct ber_oid usedoid = {{ 1, 3, 6, 1, 2, 1, 25, 2, 3, 1, 6 }, 11}; |
struct ber_oid oid, *reqoid; |
struct ber_oid oid, *reqoid; |
struct ber_element *pdu, *varbind; |
char oids[SNMP_MAX_OID_STRLEN]; |
|
struct ber_element *pdu, *varbind, *elm; |
struct snmp_agent *agent; |
struct snmp_agent *agent; |
int errorstatus, errorindex; |
int errorstatus, errorindex; |
int class; |
int class; |
|
|
return 1; |
return 1; |
} |
} |
for (; varbind != NULL; varbind = varbind->be_next) { |
for (; varbind != NULL; varbind = varbind->be_next) { |
(void) ober_scanf_elements(varbind, "{oS", &oid); |
if (ober_scanf_elements(varbind, "{os", &oid, |
if (ober_oid_cmp(&descroid, &oid) != 2) |
&string) == -1 || |
|
ober_oid_cmp(&descroid, &oid) != 2) |
break; |
break; |
rows++; |
rows++; |
} |
} |
|
|
err(1, "malloc"); |
err(1, "malloc"); |
(void) ober_scanf_elements(pdu, "{SSS{e", &varbind); |
(void) ober_scanf_elements(pdu, "{SSS{e", &varbind); |
for (; i < rows; varbind = varbind->be_next, i++) { |
for (; i < rows; varbind = varbind->be_next, i++) { |
if (ober_scanf_elements(varbind, "{os", &oid, |
if (ober_scanf_elements(varbind, "{oe", &oid, |
&string) == -1) { |
&elm) == -1) { |
i--; |
i--; |
rows--; |
rows--; |
continue; |
continue; |
} |
} |
|
if (ober_oid_cmp(&descroid, &oid) != 2) |
|
break; |
df[i].index = oid.bo_id[oid.bo_n - 1]; |
df[i].index = oid.bo_id[oid.bo_n - 1]; |
len = strlcpy(df[i].descr, string, |
if ((df[i].descr = smi_print_element(&oid, elm, 0, |
sizeof(df[i].descr)); |
smi_os_ascii, 0, utf8)) == NULL) { |
if (len > (int) sizeof(df[i].descr)) |
smi_oid2string(&oid, oids, sizeof(oids), |
len = (int) sizeof(df[i].descr) - 1; |
oid_lookup); |
if (len > descrlen) |
warn("df: can't print oid %s", oids); |
descrlen = len; |
i--; |
|
rows--; |
|
continue; |
|
} |
|
if ((df[i].descrwidth = |
|
(int) snmpc_mbswidth(df[i].descr)) == -1) |
|
err(1, "df: invalid hrStorageDescr"); |
|
if (df[i].descrwidth > descrlen) |
|
descrlen = df[i].descrwidth; |
} |
} |
ober_free_elements(pdu); |
ober_free_elements(pdu); |
if (varbind != NULL) |
if (varbind != NULL) |
|
|
NEXTTAB(usedlen) + availlen, "Available", |
NEXTTAB(usedlen) + availlen, "Available", |
NEXTTAB(availlen) + proclen, "Used%"); |
NEXTTAB(availlen) + proclen, "Used%"); |
for (i = 0; i < rows; i++) { |
for (i = 0; i < rows; i++) { |
printf("%-*s%*s%*s%*s%*s\n", |
printf("%s%*s%*s%*s%*s%*s\n", |
descrlen, df[i].descr, |
df[i].descr, descrlen - df[i].descrwidth, "", |
NEXTTAB(descrlen) + sizelen, df[i].size, |
NEXTTAB(descrlen) + sizelen, df[i].size, |
NEXTTAB(sizelen) + usedlen, df[i].used, |
NEXTTAB(sizelen) + usedlen, df[i].used, |
NEXTTAB(usedlen) + availlen, df[i].avail, |
NEXTTAB(usedlen) + availlen, df[i].avail, |
|
|
errno = EINVAL; |
errno = EINVAL; |
free(decstr); |
free(decstr); |
return NULL; |
return NULL; |
|
} |
|
|
|
ssize_t |
|
snmpc_mbswidth(char *str) |
|
{ |
|
wchar_t wc; |
|
size_t width = 0; |
|
size_t i; |
|
int len; |
|
|
|
for (i = 0; (len = mbtowc(&wc, &(str[i]), MB_CUR_MAX)) != 0; i += len) { |
|
if (len == -1) { |
|
mbtowc(NULL, NULL, MB_CUR_MAX); |
|
return -1; |
|
} |
|
width += wcwidth(wc); |
|
} |
|
return width; |
} |
} |
|
|
struct ber_element * |
struct ber_element * |