⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmp.c

📁 ftam等标准协议服务器和客户端的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -