From: Vlad S. <ser...@us...> - 2005-08-07 21:49:45
|
Update of /cvsroot/naviserver/modules/nssys In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30071 Modified Files: tclsys.c Log Message: added ns_sysudp command Index: tclsys.c =================================================================== RCS file: /cvsroot/naviserver/modules/nssys/tclsys.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** tclsys.c 1 Aug 2005 19:49:03 -0000 1.2 --- tclsys.c 7 Aug 2005 21:49:35 -0000 1.3 *************** *** 258,262 **** * nothing */ ! static int SysSync(ClientData data,Tcl_Interp *interp,int argc,char **argv) { sync(); --- 258,262 ---- * nothing */ ! static int SysSync(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { sync(); *************** *** 278,282 **** * nothing */ ! static int SysSignal(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int signo; --- 278,282 ---- * nothing */ ! static int SysSignal(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int signo; *************** *** 288,292 **** } /* Ok,check the signal name */ ! if((signo = signal_name2num(interp,argv[1])) < 0) { Tcl_AppendResult(interp,"sys_signal: invalid signal: ",argv[1],NULL); return TCL_ERROR; --- 288,292 ---- } /* Ok,check the signal name */ ! if((signo = signal_name2num(interp,(char*)argv[1])) < 0) { Tcl_AppendResult(interp,"sys_signal: invalid signal: ",argv[1],NULL); return TCL_ERROR; *************** *** 336,340 **** * nothing */ ! static int SysKill(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i,k,pid; --- 336,340 ---- * nothing */ ! static int SysKill(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i,k,pid; *************** *** 343,347 **** /* Decode the signal name */ if(argc > 1 && argv[1][0] == '-') { ! if((k = signal_name2num(interp,argv[1]+1)) < 0) { Tcl_AppendResult(interp,"sys_kill: invalid signal ",argv[1]+1,NULL); return TCL_ERROR; --- 343,347 ---- /* Decode the signal name */ if(argc > 1 && argv[1][0] == '-') { ! if((k = signal_name2num(interp,(char*)argv[1]+1)) < 0) { Tcl_AppendResult(interp,"sys_kill: invalid signal ",argv[1]+1,NULL); return TCL_ERROR; *************** *** 380,384 **** * file name */ ! static int SysMktemp(ClientData data,Tcl_Interp *interp,int argc,char **argv) { char temp[128] = "/tmp/tmpXXXXXX"; --- 380,384 ---- * file name */ ! static int SysMktemp(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { char temp[128] = "/tmp/tmpXXXXXX"; *************** *** 404,408 **** * nothing */ ! static int SysNice(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int k; --- 404,408 ---- * nothing */ ! static int SysNice(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int k; *************** *** 435,439 **** * nothing */ ! static int SysExec(ClientData data,Tcl_Interp *interp,int argc,char **argv) { if(argc == 1) { --- 435,439 ---- * nothing */ ! static int SysExec(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { if(argc == 1) { *************** *** 441,445 **** return TCL_ERROR; } ! execvp(argv[1],argv+1); Tcl_AppendResult(interp,argv[1],": ",strerror(errno),NULL); return TCL_ERROR; --- 441,445 ---- return TCL_ERROR; } ! execvp((char*)argv[1],argv); Tcl_AppendResult(interp,argv[1],": ",strerror(errno),NULL); return TCL_ERROR; *************** *** 460,464 **** * exit status */ ! static int SysWait(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i,k,pid; --- 460,464 ---- * exit status */ ! static int SysWait(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i,k,pid; *************** *** 499,503 **** * returns two created channels as a list */ ! static int SysPipe(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i,creating_pipes; --- 499,503 ---- * returns two created channels as a list */ ! static int SysPipe(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i,creating_pipes; *************** *** 533,537 **** * returns two created channels as a list */ ! static int SysOpentty(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i; --- 533,537 ---- * returns two created channels as a list */ ! static int SysOpentty(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i; *************** *** 557,561 **** * nothing */ ! static int SysReboot(ClientData data,Tcl_Interp *interp,int argc,char **argv) { sync(); --- 557,561 ---- * nothing */ ! static int SysReboot(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { sync(); *************** *** 580,584 **** * nothing */ ! static int SysHalt(ClientData data,Tcl_Interp *interp,int argc,char **argv) { kill(SIGTERM,-1); --- 580,584 ---- * nothing */ ! static int SysHalt(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { kill(SIGTERM,-1); *************** *** 601,605 **** * new channel name */ ! static int SysDup(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int modes[2],fd[2]; --- 601,605 ---- * new channel name */ ! static int SysDup(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int modes[2],fd[2]; *************** *** 634,638 **** * nothing */ ! static int SysDup2(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int modes[2],fd[2]; --- 634,638 ---- * nothing */ ! static int SysDup2(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int modes[2],fd[2]; *************** *** 675,679 **** * thread of execution, and a 0 is returned in the child's thread of execution */ ! static int SysFork(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int k; --- 675,679 ---- * thread of execution, and a 0 is returned in the child's thread of execution */ ! static int SysFork(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int k; *************** *** 701,705 **** * nothing */ ! static int SysFCopy(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i,j,k; --- 701,705 ---- * nothing */ ! static int SysFCopy(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i,j,k; *************** *** 753,757 **** * nothing */ ! static int SysChmod(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i,mode; --- 753,757 ---- * nothing */ ! static int SysChmod(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i,mode; *************** *** 795,801 **** * nothing */ ! static int SysChown(ClientData data,Tcl_Interp *interp,int argc,char **argv) { ! int i,uid = -1,gid = -1; if(argc < 3) { --- 795,801 ---- * nothing */ ! static int SysChown(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { ! int uid = -1,gid = -1; if(argc < 3) { *************** *** 806,810 **** if(argc > 3 && Tcl_GetInt(interp,argv[3],&gid) != TCL_OK) return TCL_ERROR; if(chown(argv[1],uid,gid) != 0) { ! Tcl_AppendResult(interp,"sys_chown(",argv[i],"): ",strerror(errno),NULL); return TCL_ERROR; } --- 806,810 ---- if(argc > 3 && Tcl_GetInt(interp,argv[3],&gid) != TCL_OK) return TCL_ERROR; if(chown(argv[1],uid,gid) != 0) { ! Tcl_AppendResult(interp,"sys_chown(",argv[1],"): ",strerror(errno),NULL); return TCL_ERROR; } *************** *** 825,829 **** * Previous octal umask value */ ! static int SysUmask(ClientData data,Tcl_Interp *interp,int argc,char **argv) { mode_t prev; --- 825,829 ---- * Previous octal umask value */ ! static int SysUmask(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { mode_t prev; *************** *** 857,861 **** * None */ ! static int SysIoctl(ClientData data,Tcl_Interp *interp,int objc,Tcl_Obj *objv[]) { static struct { --- 857,861 ---- * None */ ! static int SysIoctl(ClientData data,Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[]) { static struct { *************** *** 1219,1223 **** * nothing */ ! static int SysMknod(ClientData data,Tcl_Interp *interp,int argc,char **argv) { mode_t ftype; --- 1219,1223 ---- * nothing */ ! static int SysMknod(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { mode_t ftype; *************** *** 1311,1315 **** * f_namemax maximum filename length */ ! static int SysStatFs(ClientData data,Tcl_Interp *interp,int argc,char **argv) { char str[128]; --- 1311,1315 ---- * f_namemax maximum filename length */ ! static int SysStatFs(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { char str[128]; *************** *** 1365,1369 **** * nothing */ ! static int SysLog(ClientData data,Tcl_Interp *interp,int argc,char **argv) { int i,priority = 0; --- 1365,1369 ---- * nothing */ ! static int SysLog(ClientData data,Tcl_Interp *interp,int argc,const char **argv) { int i,priority = 0; *************** *** 1627,1631 **** * None */ ! static int SysV4L(ClientData data,Tcl_Interp *interp,int objc,Tcl_Obj *objv[]) { int i; --- 1627,1631 ---- * None */ ! static int SysV4L(ClientData data,Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[]) { int i; *************** *** 1714,1718 **** static char *shifted = "~!@#$%^&*()_+|}{\":?><ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ! static int SysXevent(ClientData data,Tcl_Interp *interp,int objc,Tcl_Obj *objv[]) { char *op, *arg; --- 1714,1718 ---- static char *shifted = "~!@#$%^&*()_+|}{\":?><ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ! static int SysXevent(ClientData data,Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[]) { char *op, *arg; *************** *** 1807,1810 **** --- 1807,1898 ---- } + static int SysUdp(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 i,salen = sizeof(sa); + char *address = 0, *data = 0; + int sock, len, port = 0, timeout = 5, retries = 1, noreply = 0; + + if(objc < 1) { + Tcl_WrongNumArgs(interp,1,objv," ?-timeout N -retries N ?-noreply 1|0? address port data"); + return TCL_ERROR; + } + for(i = 1;i < objc-1;i++) { + if(!strcmp(Tcl_GetString(objv[i]),"-timeout")) { + timeout = atoi(Tcl_GetString(objv[i+1])); + continue; + } + if(!strcmp(Tcl_GetString(objv[i]),"-retries")) { + retries = atoi(Tcl_GetString(objv[i+1])); + continue; + } + if(!strcmp(Tcl_GetString(objv[i]),"-noreply")) { + noreply = atoi(Tcl_GetString(objv[i+1])); + continue; + } + break; + } + if(i < objc) address = Tcl_GetString(objv[i++]); + if(i < objc) port = atoi(Tcl_GetString(objv[i++])); + if(i < objc) data = Tcl_GetStringFromObj(objv[i++],&len); + if(!address || !port || !data) { + Tcl_AppendResult(interp, "invalid address ", address, 0); + return TCL_ERROR; + } + sa.sin_family = AF_INET; + sa.sin_port = htons((unsigned short) port); + sa.sin_addr.s_addr = inet_addr(!*address ? INADDR_ANY : address); + 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); + wait: + 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 wait; + } + 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, &salen); + if (len > 0) { + Tcl_AppendResult(interp, buf, 0); + } + } + close(sock); + return TCL_OK; + } + static int NsSysInterpInit(Tcl_Interp *interp,void *context) *************** *** 1816,1821 **** syslog_data.options = LOG_PID; syslog_data.facility = LOG_USER; ! if((argv0 = Tcl_GetVar(interp,"argv0",TCL_GLOBAL_ONLY))) strncpy(syslog_data.ident,argv0,sizeof(syslog_data.ident)-1); syslog_data.facilities = (Tcl_HashTable *)Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(syslog_data.facilities,TCL_STRING_KEYS); --- 1904,1910 ---- syslog_data.options = LOG_PID; syslog_data.facility = LOG_USER; ! if((argv0 = (char*)Tcl_GetVar(interp,"argv0",TCL_GLOBAL_ONLY))) { strncpy(syslog_data.ident,argv0,sizeof(syslog_data.ident)-1); + } syslog_data.facilities = (Tcl_HashTable *)Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(syslog_data.facilities,TCL_STRING_KEYS); *************** *** 1872,1879 **** Tcl_CreateCommand(interp,"ns_syssignal",SysSignal,context,0); Tcl_CreateCommand(interp,"ns_sysstatfs",SysStatFs,context,0); Tcl_CreateObjCommand(interp,"ns_sysioctl",SysIoctl,context,0); Tcl_CreateObjCommand(interp,"ns_sysv4l",SysV4L,context,0); - Tcl_CreateObjCommand(interp,"ns_sysmktemp",SysMktemp,context,0); Tcl_CreateObjCommand(interp,"ns_sysxevent",SysXevent,context,0); return 0; --- 1961,1969 ---- Tcl_CreateCommand(interp,"ns_syssignal",SysSignal,context,0); Tcl_CreateCommand(interp,"ns_sysstatfs",SysStatFs,context,0); + Tcl_CreateCommand(interp,"ns_sysmktemp",SysMktemp,context,0); Tcl_CreateObjCommand(interp,"ns_sysioctl",SysIoctl,context,0); Tcl_CreateObjCommand(interp,"ns_sysv4l",SysV4L,context,0); Tcl_CreateObjCommand(interp,"ns_sysxevent",SysXevent,context,0); + Tcl_CreateObjCommand(interp,"ns_sysudp",SysUdp,context,0); return 0; |