From: Vlad S. <ser...@us...> - 2005-06-09 21:31:40
|
Update of /cvsroot/naviserver/modules/nssnmp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2559/nssnmp Modified Files: ChangeLog README nssnmp.c Log Message: rewrote nssnmp's ns_udp using new Objv interface, added to nsudp's ns_udp -retries parameter. Index: nssnmp.c =================================================================== RCS file: /cvsroot/naviserver/modules/nssnmp/nssnmp.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** nssnmp.c 8 Jun 2005 20:03:50 -0000 1.2 --- nssnmp.c 9 Jun 2005 21:31:30 -0000 1.3 *************** *** 2008,2011 **** --- 2008,2015 ---- * * $Log$ + * Revision 1.3 2005/06/09 21:31:30 seryakov + * rewrote nssnmp's ns_udp using new Objv interface, added to nsudp's ns_udp -retries + * parameter. + * * Revision 1.2 2005/06/08 20:03:50 seryakov * Changed license and wording in README files. *************** *** 3249,3310 **** *---------------------------------------------------------------------- */ ! static int UdpCmd(ClientData arg, Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[]) { ! fd_set rfds; ! int retries = 0; ! int timeout = 2; ! struct timeval tm; ! int fd,len,port; struct sockaddr_in sa; ! socklen_t salen = sizeof(sa); ! char *ptr,buf[16384] = ""; ! if(objc < 4) { ! Tcl_AppendResult(interp, "wrong # args: should be ns_udp host port data ?-retries retries? ?-timeout timeout?",NULL); ! return TCL_ERROR; ! } ! if(!(port = atoi(Tcl_GetString(objv[2]))) || ! Ns_GetSockAddr((sockaddr_in*)&sa,Tcl_GetString(objv[1]),port) != NS_OK) { ! Tcl_AppendResult(interp,"noHost: unknown host:port",0); return TCL_ERROR; } ! for(int i = 4;i < objc - 1;i += 2) { ! if(!strcasecmp(Tcl_GetString(objv[i]),"-retries")) retries = atoi(Tcl_GetString(objv[i+1])); else ! if(!strcasecmp(Tcl_GetString(objv[i]),"-timeout")) timeout = atoi(Tcl_GetString(objv[i+1])); } ! if((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0) { ! Tcl_AppendResult(interp,"noResponse: ",strerror(errno),0); ! return -1; } ! ptr = Tcl_GetStringFromObj(objv[3],&len); ! again: ! if(sendto(fd,ptr,len,0,(struct sockaddr *)&sa,sizeof(struct sockaddr_in)) <= 0) { ! Tcl_AppendResult(interp,"noResponse: ",strerror(errno),0); ! close(fd); ! return TCL_ERROR; } ! tm.tv_usec = 0L; ! tm.tv_sec = timeout; ! FD_ZERO(&rfds); ! FD_SET(fd,&rfds); ! if(select(fd + 1,&rfds,0,0,&tm) < 0) { ! if(errno == EINTR) goto again; ! Tcl_AppendResult(interp,"noResponse: ",strerror(errno),0); ! close(fd); ! return TCL_ERROR; } ! if(!FD_ISSET(fd,&rfds)) { ! if(--retries > 0) goto again; ! Tcl_AppendResult(interp,"noResponse: timeout",0); ! close(fd); ! return TCL_ERROR; } ! if((len = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&sa,(socklen_t*)&salen)) <= 0) { ! Tcl_AppendResult(interp,"noResponse: ",strerror(errno),0); ! close(fd); ! return TCL_ERROR; } ! close(fd); ! Tcl_SetObjResult(interp,Tcl_NewStringObj(buf,len)); return TCL_OK; } --- 3253,3333 ---- *---------------------------------------------------------------------- */ ! static int ! UdpCmd(ClientData arg, Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[]) { ! fd_set fds; ! char buf[16384]; ! struct timeval tv; struct sockaddr_in sa; ! int salen = sizeof(sa); ! char *address = 0, *data = 0; ! int sock, len, port, timeout = 5, retries = 1, noreply = 0; ! ! Ns_ObjvSpec opts[] = { ! {"-timeout", Ns_ObjvInt, &timeout, NULL}, ! {"-retries", Ns_ObjvInt, &retries, NULL}, ! {"-noreply", Ns_ObjvInt, &noreply, NULL}, ! {"--", Ns_ObjvBreak, NULL, NULL}, ! {NULL, NULL, NULL, NULL} ! }; ! Ns_ObjvSpec args[] = { ! {"address", Ns_ObjvString, &address, NULL}, ! {"port", Ns_ObjvInt, &port, NULL}, ! {"data", Ns_ObjvString, &data, &len}, ! {NULL, NULL, NULL, NULL} ! }; ! if (Ns_ParseObjv(opts, args, interp, 1, objc, objv) != NS_OK) { return TCL_ERROR; } ! if (Ns_GetSockAddr(&sa, address, port) != NS_OK) { ! sprintf(buf, "%s:%d", address, port); ! Tcl_AppendResult(interp, "invalid address ", address, 0); ! return TCL_ERROR; } ! sock = socket(AF_INET, SOCK_DGRAM, 0); ! if (sock < 0) { ! Tcl_AppendResult(interp, "socket error ", strerror(errno), 0); ! return TCL_ERROR; } ! resend: ! if (sendto(sock, data, len, 0,(struct sockaddr*)&sa,sizeof(sa)) < 0) { ! Tcl_AppendResult(interp, "sendto error ", strerror(errno), 0); ! return TCL_ERROR; } ! if (noreply) { ! close(sock); ! return TCL_OK; } ! memset(buf,0,sizeof(buf)); ! Ns_SockSetNonBlocking(sock); ! again: ! FD_ZERO(&fds); ! FD_SET(sock,&fds); ! tv.tv_sec = timeout; ! tv.tv_usec = 0; ! len = select(sock+1, &fds, 0, 0, &tv); ! switch (len) { ! case -1: ! if (errno == EINTR || errno == EINPROGRESS || errno == EAGAIN) { ! goto again; ! } ! Tcl_AppendResult(interp, "select error ", strerror(errno), 0); ! close(sock); ! return TCL_ERROR; ! ! case 0: ! if(--retries > 0) goto resend; ! Tcl_AppendResult(interp, "timeout", 0); ! close(sock); ! return TCL_ERROR; } ! if (FD_ISSET(sock, &fds)) { ! len = recvfrom(sock, buf, sizeof(buf)-1, 0, (struct sockaddr*)&sa, (socklen_t*)&salen); ! if (len > 0) { ! Tcl_AppendResult(interp, buf, 0); ! } } ! close(sock); return TCL_OK; } Index: README =================================================================== RCS file: /cvsroot/naviserver/modules/nssnmp/README,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** README 8 Jun 2005 20:03:49 -0000 1.2 --- README 9 Jun 2005 21:31:30 -0000 1.3 *************** *** 164,167 **** --- 164,174 ---- ns_radius localhost 1645 secret User-Name test User-Password test2 + + ns_udp ?-timeout N? ?-noreply? ipaddr port data + sends udp data + + Example: + ns_udp 127.0.0.1 80 "GET / HTTP/1.0\n\n" + Nsmibdump Index: ChangeLog =================================================================== RCS file: /cvsroot/naviserver/modules/nssnmp/ChangeLog,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** ChangeLog 20 May 2005 20:47:20 -0000 1.1.1.1 --- ChangeLog 9 Jun 2005 21:31:30 -0000 1.2 *************** *** 1,2 **** --- 1,6 ---- + 2005-06-09 Vlad Seryakov vl...@cr... + + * Rewrite ns_udp using new Objv interface + 2004-10-15 Vlad Seryakov vl...@cr... |