📄 snmp.c
字号:
r -> flags |= STR | MALLOC; return r;}static int d_integer (x, pe)NODE **x;PE pe;{ integer i = prim2num (pe); if (i == NOTOK && pe -> pe_errno != PE_ERR_NONE) { (void) strcpy (PY_pepy, pe_error (pe -> pe_errno)); return NOTOK; } *x = make_number ((AWKNUM) i); return OK;}static int d_octets (x, pe)NODE **x;PE pe;{ struct qbuf *qb = prim2qb (pe); if (qb == NULL || qb_pullup (qb) == NOTOK) { (void) strcpy (PY_pepy, qb ? "qb_pullup: out of memory" : pe_error (pe -> pe_errno)); return NOTOK; } *x = make_octet_node (qb -> qb_forw -> qb_data, qb -> qb_forw -> qb_len); qb_free (qb); return OK;}static int d_display (x, pe)NODE **x;PE pe;{ struct qbuf *qb = prim2qb (pe); if (qb == NULL || qb_pullup (qb) == NOTOK) { (void) strcpy (PY_pepy, qb ? "qb_pullup: out of memory" : pe_error (pe -> pe_errno)); return NOTOK; } *x = make_string (qb -> qb_forw -> qb_data, qb -> qb_forw -> qb_len); qb_free (qb); return OK;}static int d_objectID (x, pe)NODE **x;PE pe;{ char *cp; OID oid = prim2oid (pe); if (oid == NULLOID) { (void) strcpy (PY_pepy, pe_error (pe -> pe_errno)); return NOTOK; } cp = sprintoid (oid); *x = make_string (cp, strlen (cp)); return OK;}/* ARGSUSED */static int d_null (x, pe)NODE **x;PE pe;{ *x = make_str_node ("NULL", 4, 0); return OK;}static int d_ipaddr (x, pe)NODE **x;PE pe;{ char ipaddr[16]; struct type_SNMP_IpAddress *ip; struct qbuf *qb; if (decode_SNMP_IpAddress (pe, 1, NULLIP, NULLVP, &ip) == NOTOK) return NOTOK; if (qb_pullup (ip) == NOTOK) { (void) strcpy (PY_pepy, "qb_pullup: out of memory"); free_SNMP_IpAddress (ip); return NOTOK; } if ((qb = ip -> qb_forw) -> qb_len != 4) { (void) sprintf (PY_pepy, "IpAddress is wrong length (got %d, wanted 4)", qb -> qb_len); free_SNMP_IpAddress (ip); return NOTOK; } (void) sprintf (ipaddr, "%d.%d.%d.%d", qb -> qb_data[0] & 0xff, qb -> qb_data[1] & 0xff, qb -> qb_data[2] & 0xff, qb -> qb_data[3] & 0xff); *x = make_str_node (ipaddr, strlen (ipaddr), 0); free_SNMP_IpAddress (ip); return OK;}extern u_long prim2ulong ();static int d_ulong (x, pe)NODE **x;PE pe;{ u_long i = prim2ulong (pe); if (i == 0 && pe -> pe_errno != PE_ERR_NONE) { (void) strcpy (PY_pepy, pe_error (pe -> pe_errno)); return NOTOK; } *x = make_number ((AWKNUM) i); return OK;}static int d_clnpaddr (x, pe)NODE **x;PE pe;{ int len; struct type_SNMP_ClnpAddress *clnp; struct qbuf *qb; if (decode_SNMP_ClnpAddress (pe, 1, NULLIP, NULLVP, &clnp) == NOTOK) return NOTOK; if (qb_pullup (clnp) == NOTOK) { (void) strcpy (PY_pepy, "qb_pullup: out of memory"); free_SNMP_ClnpAddress (clnp); return NOTOK; } qb = clnp -> qb_forw; if ((len = qb -> qb_data[0] & 0xff) >= qb -> qb_len) len = qb -> qb_len - 1; *x = make_octet_node (qb -> qb_data + 1, len); free_SNMP_ClnpAddress (clnp); return OK;}/* MISC */static snmp_ready (do_id)int do_id;{ int changed = 0; char *pp; struct sockaddr_in lo_socket; register struct sockaddr_in *lsock = &lo_socket; register struct sockaddr_in *isock = &in_socket; register struct hostent *hp; register struct servent *sp; register NODE *tmp; deref = DIAGNOSTIC_node -> var_value; do_deref (); DIAGNOSTIC_node -> var_value = Nnull_string; if ((snmp_retries = (int) RETRIES_node -> var_value -> numbr) <= 0) snmp_retries = 1; if ((snmp_timeout = (int) TIMEOUT_node -> var_value -> numbr) <= 0) snmp_timeout = 1; if (do_id) { if (snmp_id >= 0x7fffffff) snmp_id = 0; snmp_id++; } if (snmp_fd == NOTOK || ps == NULLPS) changed++; tmp = force_string (AGENT_node -> var_value); if (snmp_agent == NULL || strcmp (snmp_agent, tmp -> stptr)) { if (snmp_agent) free (snmp_agent), snmp_agent = NULL; emalloc (snmp_agent, char *, strlen (tmp -> stptr) + 1, "snmp_ready1"); (void) strcpy (snmp_agent, tmp -> stptr); changed++; } tmp = force_string (COMMUNITY_node -> var_value); if (snmp_community == NULL || strcmp (snmp_community, tmp -> stptr)) { register struct type_SNMP_Message *msg = &msgs; if (snmp_community) free (snmp_community), snmp_community = NULL; emalloc (snmp_community, char *, strlen (tmp -> stptr) + 1, "snmp_ready2"); (void) strcpy (snmp_community, tmp -> stptr); if ((msg -> community = str2qb (snmp_community, strlen (snmp_community), 1)) == NULL) { snmp_diag (NULLCP, "str2qb: out of memory"); free (snmp_community), snmp_community = NULL; return NOTOK; } } if (changed) { if (ps) ps_free (ps), ps = NULLPS; if (snmp_fd != NOTOK) (void) close_udp_socket (snmp_fd), snmp_fd = NOTOK; } else return OK; bzero ((char *) lsock, sizeof *lsock); if ((hp = gethostbystring (pp = strcmp (snmp_agent, "localhost") ? getlocalhost () : "localhost")) == NULL) { snmp_diag (NULLCP, "%s: unknown host", pp); return NOTOK; } lsock -> sin_family = hp -> h_addrtype; inaddr_copy (hp, lsock); if ((snmp_fd = start_udp_client (lsock, 0, 0, 0)) == NOTOK) { snmp_diag ("failed", "start_udp_server"); return NOTOK; } if ((hp = gethostbystring (pp = snmp_agent)) == NULL) { struct TSAPaddr *ta; struct NSAPaddr *na; if ((ta = str2taddr (snmp_agent)) && ta -> ta_naddr > 0 && (na = ta -> ta_addrs) -> na_stack == NA_TCP) { snmp_portno = na -> na_port; if (hp = gethostbystring (pp = na -> na_domain)) goto got_host; } snmp_diag (NULLCP, "%s: unknown host", pp); return NOTOK; }got_host: ; if (snmp_portno == 0) snmp_portno = (sp = getservbyname ("snmp", "udp")) ? sp -> s_port : htons ((u_short) 161); bzero ((char *) isock, sizeof *isock); isock -> sin_family = hp -> h_addrtype; inaddr_copy (hp, isock); isock -> sin_port = snmp_portno; if (*snmp_community == '/' && snmp_map (isock) == NOTOK) return NOTOK; if (join_udp_server (snmp_fd, isock) == NOTOK) { snmp_diag ("failed", "join_udp_server"); return NOTOK; } if ((ps = ps_alloc (dg_open)) == NULLPS || dg_setup (ps, snmp_fd, MAXDGRAM, read_udp_socket, write_udp_socket, check_udp_socket) == NOTOK) { if (ps == NULLPS) snmp_diag (NULLCP, "ps_alloc: out of memory"); else snmp_diag (NULLCP, "dg_setup: %s", ps_error (ps -> ps_errno)); return NOTOK; }#ifndef SYS5 snmp_id = ((int) random ()) & 0x7fffffff;#else snmp_id = ((int) rand ()) & 0x7fffffff;#endif return OK;}/* *//* Reads an IP address to community mapping file. Use UNIX modes for protection of information therein... Syntax: <netaddr> [<netmask>] <community> Each token is seperated by LWSP, though double-quotes may be used to prevent separation. */static snmp_map (isock)struct sockaddr_in *isock;{ int result = NOTOK; u_long hostaddr, netmask, netaddr; register char *cp; char buffer[BUFSIZ + 1], *vec[NVEC + 1]; FILE *fp; if ((fp = fopen (snmp_community, "r")) == NULL) { snmp_diag (snmp_community, "unable to read"); return NOTOK; } hostaddr = isock -> sin_addr.s_addr; while (fgets (buffer, sizeof buffer, fp)) { if (*buffer == '#') continue; if (cp = index (buffer, '\n')) *cp = NULL; bzero ((char *) vec, sizeof vec); switch (str2vec (buffer, vec)) { case 3: netmask = inet_addr (vec[1]); cp = vec[2]; break; case 2: netmask = 0xffffffff; cp = vec[1]; break; default: continue; } if ((netaddr = inet_network (vec[0])) == NOTOK) continue; netaddr = ntohl (netaddr); if (!(netaddr & 0xff000000)) netaddr <<= (netaddr & 0x00ff0000) ? 8 : (netaddr & 0x0000ff00) ? 16 : 24; netaddr = htonl (netaddr); if ((hostaddr & netmask) != netaddr) continue; if ((msgs.community = str2qb (cp, strlen (cp), 1)) == NULL) { snmp_diag (NULLCP, "str2qb: out of memory"); goto done; } result = OK; break; } if (result == NOTOK) snmp_diag (NULLCP, "no match for IP-address in %s", snmp_community);done: ; (void) fclose (fp); return result;}/* */#ifndef lintstatic snmp_diag (va_alist)va_dcl{ char *what, buffer[BUFSIZ]; va_list ap; va_start (ap); what = va_arg (ap, char *); _asprintf (buffer, what, ap); va_end (ap); if (debug > 0) fprintf (stderr, "%s\n", buffer); deref = DIAGNOSTIC_node -> var_value; do_deref (); DIAGNOSTIC_node -> var_value = make_string (buffer, strlen (buffer));}#else/* VARARGS */static snmp_diag (what, fmt)char *what, *fmt;{ snmp_diag (what, fmt);}#endif/* */char *snmp_name (ptr)NODE *ptr;{ return ((OT) (ptr -> magic)) -> ot_text;}/* */static char *errors[] = { "noError", "tooBig", "noSuchName", "badValue", "readOnly", "genErr"};static char *snmp_error (i)int i;{ static char buffer[BUFSIZ]; if (0 < i && i < sizeof errors / sizeof errors[0]) return errors[i]; (void) sprintf (buffer, "error %d", i); return buffer;}static char *snmp_variable (parm, idx)register struct type_SNMP_PDU *parm;integer idx;{ register struct type_SNMP_VarBindList *vp; if (idx <= 0 || (vp = parm -> variable__bindings) == NULL) return NULL; for (idx--; idx > 0; idx--) if ((vp = vp -> next) == NULL) return NULL; return oid2ode (vp -> VarBind -> name);}static OID str2oid (s)char *s;{ int i; static struct OIDentifier oids; static unsigned int elements[NELEM + 1];#ifdef original if ((i = str2elem (s, elements)) < 1 || elements[0] > 2 || (i > 1 && elements[0] < 2 && elements[1] > 39)) return NULLOID;#else if ((i = str2elem (s, elements)) < 1) return NULLOID;#endif oids.oid_elements = elements, oids.oid_nelem = i; return (&oids);}#endif /* SNMP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -