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

📄 snmp.c

📁 ftam等标准协议服务器和客户端的源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
    if (snmp_id >= 0x7fffffff)	snmp_id = 0;    snmp_id++;    parm -> request__id = sr -> r_id = snmp_id;    parm -> variable__bindings = sr -> r_bindings;    if (sr -> r_msg)	free_SNMP_Message (sr -> r_msg), sr -> r_msg = NULL;    if (sr -> r_pe)	pe_free (sr -> r_pe), sr -> r_pe = NULL;    return encode_SNMP_Message (&sr -> r_pe, 1, 0, NULLCP, &msgs);}/*    SET */void	snmp_set (){    int	    gotone,	    result,	    retries,	    status = -1;    struct type_SNMP_Message *msg = &msgs;    register struct type_SNMP_PDU *parm = msg -> data -> un.get__request;    register struct type_SNMP_VarBind *v =					parm -> variable__bindings -> VarBind;    PE	    pe = NULLPE,	    p = NULLPE,	   *pep = NULLPEP;    OID	    oid;    NODE   *ptr = SET_node,	   *value = NULL;    OT	    ot = (OT) ptr -> magic;    SET_node = NULL;    if (snmp_ready (1) == NOTOK)	goto out;    parm -> request__id = snmp_id;    if (v -> name)	free_SNMP_ObjectName (v -> name), v -> name = NULL;    if (!SET_inst) {	if (ot -> ot_getfnx || snmp_scalars_as_arrays) {	    register struct snmp_search *s;	    for (s = tail; s; s = s -> s_prev) {		register struct snmp_req *sr;		if (ot -> ot_name -> oid_nelem			   != (oid = s -> s_parent -> ot_name) -> oid_nelem + 1		        || bcmp ((char *) ot -> ot_name -> oid_elements,				 (char *) oid -> oid_elements,				 oid -> oid_nelem				         * sizeof ot -> ot_name -> oid_elements[0]))		    continue;		for (sr = s -> s_reqs; sr -> r_bindings; sr++) {		    register struct type_SNMP_VarBindList *vp;		    for (vp = sr -> r_bindings; vp; vp = vp -> next) {			register struct type_SNMP_VarBind *vv;			if (ot -> ot_name -> oid_nelem			        >= (vv = vp -> VarBind) -> name -> oid_nelem)			    fatal ("snmp_get: internal error");			if (bcmp ((char *) vv -> name -> oid_elements,				  (char *) ot -> ot_name -> oid_elements,				  ot -> ot_name -> oid_nelem				      * sizeof ot -> ot_name 							-> oid_elements[0]))			    continue;			if ((oid = v -> name = oid_cpy (vv -> name)) == NULL)			    goto no_mem_for_inst;			pep = &vv -> value;			goto set_value;		    }		}		status = int_SNMP_error__status_noSuchName;		goto out;	    }	    if (ot -> ot_getfnx) {		snmp_diag (NULLCP,			   "can't use SNMP array variable as scalar unless within for-in construct");		goto out;	    }	}	if ((oid = v -> name = oid_extend (ot -> ot_name, 1)) == NULL) {no_mem_for_inst: ;	    snmp_diag (NULLCP, "oid_extend: out of memory");	    goto out;	}	v -> name -> oid_elements[v -> name -> oid_nelem - 1] = 0;    }    else {	register int	i;	register unsigned int *ip,			      *jp;	char   *instname = force_string (SET_inst) -> stptr;	OID	inst = str2oid (instname);	if (inst == NULL) {	    snmp_diag (NULLCP, "str2oid: bad instance identifier \"%s\"",		       instname);	    goto out;	}	if ((oid = v -> name = oid_extend (ot -> ot_name, inst -> oid_nelem))	        == NULL)	    goto no_mem_for_inst;	ip = oid -> oid_elements + oid -> oid_nelem - inst -> oid_nelem;	jp = inst -> oid_elements;	for (i = inst -> oid_nelem; i > 0; i--)	    *ip++ = *jp++;    }set_value: ;    if ((*ot -> ot_syntax -> os_encode) (ptr -> var_value, &pe) == NOTOK) {	snmp_diag (NULLCP, "encode error for variable \"%s\": %s",		 oid2ode (v -> name), PY_pepy);	goto out;    }    msgs.data -> offset = type_SNMP_PDUs_set__request;    p = v -> value, v -> value = pe, pe = NULL;    result = encode_SNMP_Message (&pe, 1, 0, NULLCP, msg);    msgs.data -> offset = type_SNMP_PDUs_get__request;    pe_free (v -> value), v -> value = p, p = NULLPE;    if (result == NOTOK) {	snmp_diag (NULLCP, "encode_SNMP_Message: %s", PY_pepy);	goto out;    }    msg = NULL, gotone = 0;    for (retries = snmp_retries; retries > 0; ) {	int	len;	fd_set	rfds;	if (debug > 1)	    print_SNMP_Message (pe, 1, NULLIP, NULLVP, NULLCP);	len = ps -> ps_byteno;	if (pe2ps (ps, pe) == NOTOK) {	    snmp_diag (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno));	    goto error_x;	}	if (debug > 0 && (len = ps -> ps_byteno - len) > 484)	    fprintf (stderr, "sent message of %d octets\n", len);	FD_ZERO (&rfds);	FD_SET (snmp_fd, &rfds);	switch (xselect (snmp_fd + 1, &rfds, NULLFD, NULLFD, snmp_timeout)) {	    case NOTOK:	        snmp_diag ("failed", "xselect");		goto error_x;	    default:		if (FD_ISSET (snmp_fd, &rfds))		    break;		/* else fall... */	    case OK:		if (debug > 0)		    fprintf (stderr, "timeout...\n");		retries--;		continue;	}	if ((p = ps2pe (ps)) == NULLPE) {	    snmp_diag (NULLCP, "ps2pe: %s", ps_error (ps -> ps_errno));	    goto error_x;	}	if (decode_SNMP_Message (p, 1, NULLIP, NULLVP, &msg) == NOTOK) {	    snmp_diag (NULLCP, "decode_SNMP_Message: %s", PY_pepy);	    goto out;	}	if (debug > 1)	    print_SNMP_Message (p, 1, NULLIP, NULLVP, NULLCP);	if (msg -> data -> offset != type_SNMP_PDUs_get__response) {	    snmp_diag (NULLCP, "unexpected message type %d",		       msg -> data -> offset);	    goto out;	}	if ((parm = msg -> data -> un.get__response) -> request__id == snmp_id)	    break;	if (debug > 0)	    fprintf (stderr, "bad ID (got %ld, wanted %ld)\n",		     (long) parm -> request__id, (long) snmp_id);	if (msg)	    free_SNMP_Message (msg), msg = NULL;	if (p)	    pe_free (p), p = NULLPE;	gotone++;    }    if (retries <= 0) {	snmp_diag (NULLCP,		   "no %sresponse within %d retries of %s%d second%s each",		   gotone ? "acceptable " : "", snmp_retries + gotone,		   gotone ? "upto " : "",		   snmp_timeout, snmp_timeout != 1 ? "s" : "");	goto out;    }    if ((status = parm -> error__status) != int_SNMP_error__status_noError) {	char   *cp = snmp_variable (parm, parm -> error__index);	snmp_diag (NULLCP, cp ? "%s at position %d (%s)" : "%s at position %d",		   snmp_error (status), parm -> error__index, cp);	goto out;    }    if (parm -> variable__bindings == NULL	    || (v = parm -> variable__bindings -> VarBind) == NULL) {	snmp_diag (NULLCP, "missing variable in response");	goto out;    }    if (debug > 0 && parm -> variable__bindings -> next)	fprintf (stderr, "too many responses starting with: %s\n",		 oid2ode (parm -> variable__bindings -> next -> VarBind -> name));    if (oid_cmp (oid, v -> name)) {	char    buffer[BUFSIZ];	(void) strcpy (buffer, oid2ode (v -> name));	snmp_diag (NULLCP, "wrong variable returned (got %s, wanted %s)",		 buffer, oid2ode (oid));	goto out;    }		 /* needed in case of x = y = value, where "y" is an SNMP variable */    if ((*ot -> ot_syntax -> os_decode) (&value, v -> value) == NOTOK) {	snmp_diag (NULLCP, "decode error for variable \"%s\": %s",		 oid2ode (v -> name), PY_pepy);	goto out;    }    if (pep) {	pe_free (*pep);	*pep = v -> value, v -> value = NULL;    }    goto out;error_x: ;    if (ps)	ps_free (ps), ps = NULLPS;    if (snmp_fd != NOTOK)	(void) close_udp_socket (snmp_fd), snmp_fd = NOTOK;out: ;    if (msg && msg != &msgs)	free_SNMP_Message (msg);    if (p)	pe_free (p);    if (pe)	pe_free (pe);    deref = ptr -> var_value;    do_deref ();/* needed in case of x = y = value, where "y" is an SNMP variable */    ptr -> var_value = value ? value : Nnull_string;    assign_number (&ERROR_node -> var_value, (AWKNUM) status);    if (SET_inst) {	deref = SET_inst;	do_deref ();	SET_inst = NULL;    }}/*    ENCODE */static int  e_integer (x, pe)NODE   *x;PE     *pe;{    if ((*pe = int2prim ((integer) force_number (x))) == NULLPE) {	(void) strcpy (PY_pepy, "int2prim failed");	return NOTOK;    }    return OK;}extern char 	hex2nib[];static int  e_octets (x, pe)NODE   *x;PE     *pe;{    int	    i;    register char *cp,		  *ep;    char   *tmp = force_string (x) -> stptr;    PE	    p;    PElementData d;    if ((i = strlen (tmp)) == 0	    || i % 3 != 2	    || !isxdigit (tmp[0])	    || !isxdigit (tmp[1])	    || !isxdigit (tmp[i - 2])	    || !isxdigit (tmp[i - 1]))	return e_display (x, pe);    for (cp = tmp + 3, ep = tmp + i - 3; cp < ep; cp += 3)	if (!isxdigit (cp[0]) || !isxdigit (cp[1]) || cp[2] != ':')	    return e_display (x, pe);    if ((p = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_OCTS)) == NULL) {	(void) strcpy (PY_pepy, "pe_alloc failed");	return NOTOK;    }    if ((d = p -> pe_prim = PEDalloc (p -> pe_len = (i / 3) + 1)) == NULL) {	(void) strcpy (PY_pepy, "PEDalloc failed");	pe_free (p);	return NOTOK;    }    for (ep = (cp = tmp) + i; cp < ep; cp += 3)	*d++ = (hex2nib[cp[0] & 0x7f] << 4) | (hex2nib[cp[1] & 0x7f]);    *pe = p;    return OK;}static int  e_display (x, pe)NODE   *x;PE     *pe;{    char   *tmp = force_string (x) -> stptr;    if ((*pe = str2prim (tmp, strlen (tmp), PE_CLASS_UNIV, PE_PRIM_OCTS))	    == NULLPE) {	(void) strcpy (PY_pepy, "str2prim failed");	return NOTOK;    }    return OK;}static int  e_objectID (x, pe)NODE   *x;PE     *pe;{    char   *tmp = force_string (x) -> stptr;    OID	    oid = str2oid (tmp);    if (oid == NULLOID) {#ifndef	originalbad_oid: ;#endif	(void) sprintf (PY_pepy, "str2oid: bad instance identifier \"%s\"",			tmp);	return NOTOK;    }#ifndef	original    if (oid -> oid_elements[0] > 2	    || (oid -> oid_nelem > 1		    && oid -> oid_elements[0] < 2		    && oid -> oid_elements[1] < 39))	goto bad_oid;#endif        if ((*pe = oid2prim (oid)) == NULLPE) {	(void) strcpy (PY_pepy, "oid2prim failed");	return NOTOK;    }    return OK;}/* ARGSUSED */static int  e_null (x, pe)NODE   *x;PE     *pe;{    if ((*pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL))	    == NULLPE) {	(void) strcpy (PY_pepy, "pe_alloc failed");	return NOTOK;    }    return OK;}static int  e_ipaddr (x, pe)NODE   *x;PE     *pe;{    char   *tmp = force_string (x) -> stptr;    struct hostent *hp;    struct sockaddr_in lo_socket;    register struct sockaddr_in *lsock = &lo_socket;    if (!(hp = gethostbystring (tmp))) {	(void) sprintf (PY_pepy, "invalid IP-address: \"%s\"", tmp);	return NOTOK;    }    bzero ((char *) lsock, sizeof *lsock);    lsock -> sin_family = hp -> h_addrtype;    inaddr_copy (hp, lsock);        if ((*pe = str2prim ((char *) &lsock -> sin_addr, 4, PE_CLASS_APPL, 0))	    == NULLPE) {	(void) strcpy (PY_pepy, "str2prim failed");	return NOTOK;    }    return OK;}extern	PE ulong2prim ();static int  e_ulong (x, pe, id)NODE   *x;PE     *pe;PElementID id;{    if ((*pe = ulong2prim ((u_long) force_number (x), PE_CLASS_APPL, id))	    == NULL) {	(void) strcpy (PY_pepy, "ulong2prim failed");	return NOTOK;    }    return OK;}static int  e_counter (x, pe)NODE   *x;PE     *pe;{    return e_ulong (x, pe, 1);}static int  e_gauge (x, pe)NODE   *x;PE     *pe;{    return e_ulong (x, pe, 2);}static int  e_timeticks (x, pe)NODE   *x;PE     *pe;{    return e_ulong (x, pe, 3);}static int  e_clnpaddr (x, pe)NODE   *x;PE     *pe;{    if (e_octets (x, pe) == NOTOK)	return NOTOK;    (*pe) -> pe_class = PE_CLASS_APPL, (*pe) -> pe_id = 5;    return OK;}/*    DECODE */static NODE *make_octet_node (base, len)char   *base;int	len;{    register char *bp,		  *cp,		  *ep;    char   *s = "";    register NODE *r;    r = newnode (Node_val);    emalloc (r -> stptr, char *, len * 3 + 1, "make_octet_node");    bp = r -> stptr;    for (ep = (cp = base) + len; cp < ep; cp++, s = ":") {	(void) sprintf (bp, "%s%02x", s, *cp & 0xff);	bp += strlen (bp);    }    *bp = NULL;		/* in case len == 0 */    r -> stlen = bp - r -> stptr;    r -> stref = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -