From a1ad683e690fea40c5f273f8fa3750418bbaaf0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Fri, 16 Jan 1998 23:50:06 -0800 Subject: [PATCH] rsh replacement for NT + accept() fix Rev: NT/init_nt:1.8 Rev: NT/tools/lib:1.10 Rev: NT/tools/rntcc:1.8 Rev: NT/tools/sprsh:1.1 Rev: NT/tools/sprshd:1.1 Rev: NT/tools/uname:1.3 Rev: src/modules/files/socket.c:1.23 --- NT/init_nt | 18 ++++++-- NT/tools/lib | 36 +++++++++------ NT/tools/rntcc | 3 +- NT/tools/sprsh | 42 +++++++++++++++++ NT/tools/sprshd | 95 ++++++++++++++++++++++++++++++++++++++ NT/tools/uname | 3 +- src/modules/files/socket.c | 4 +- 7 files changed, 180 insertions(+), 21 deletions(-) create mode 100755 NT/tools/sprsh create mode 100755 NT/tools/sprshd diff --git a/NT/init_nt b/NT/init_nt index 6d50c7467b..9a5f6bc456 100755 --- a/NT/init_nt +++ b/NT/init_nt @@ -1,15 +1,27 @@ #!/bin/sh # Edit -NTHOST=kheleyr +NTHOST=10.0.4.10 NTDRIVE='j:' # What dir on the UNIX machine is on $NTDRIVE ? # This variable MUST NOT end with a slash. NTMOUNT= +# Use Simple Pike Remote SHell? +USE_SPRSH=yes + +# Port for sprsh +NTPORT=4711 + # Don't edit -PATH=`pwd`/tools:$PATH + +NP=`pwd`/tools + +case :$PATH: in + *:$NP:*) ;; + *) PATH=$NP:$PATH ;; +esac CC=rntcc NTTOOLS=`pwd`/tools/lib if [ "x$NTMOUNT" = x ]; then @@ -19,5 +31,5 @@ else " fi -export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE +export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE NTPORT USE_SPRSH diff --git a/NT/tools/lib b/NT/tools/lib index 214ecd6df4..ddcaf35a36 100644 --- a/NT/tools/lib +++ b/NT/tools/lib @@ -14,25 +14,33 @@ fixabspath() { } getntenv() { - rsh $NTHOST set $1 | egrep "^$1=" | sed 's/^.*=// + if [ $USE_SPRSH = yes ]; then + sprsh getenv $1 + else + rsh $NTHOST set $1 | egrep "^$1=" | sed 's/^.*=// s/ //g' + fi } silent_do_cmd() { - BATFILE=TMP$$.bat - PWD=`pwd` - RPWD=`fixabspath $PWD` - if [ x$NT_DEBUG != xyes ]; then - echo >$BATFILE "@echo off " + if [ $USE_SPRSH = yes ]; then + sprsh "$*" else - echo >$BATFILE - fi - echo >>$BATFILE "$NTDRIVE " - echo >>$BATFILE "cd $RPWD " - echo >>$BATFILE "$* " - rsh $NTHOST $NTDRIVE$RPWD\\$BATFILE - if [ x$CLEANUP = xyes ]; then - rm $BATFILE || : + BATFILE=TMP$$.bat + PWD=`pwd` + RPWD=`fixabspath $PWD` + if [ x$NT_DEBUG != xyes ]; then + echo >$BATFILE "@echo off " + else + echo >$BATFILE + fi + echo >>$BATFILE "$NTDRIVE " + echo >>$BATFILE "cd $RPWD " + echo >>$BATFILE "$* " + rsh $NTHOST $NTDRIVE$RPWD\\$BATFILE + if [ x$CLEANUP = xyes ]; then + rm $BATFILE || : + fi fi } diff --git a/NT/tools/rntcc b/NT/tools/rntcc index 15e8340342..3bc8a062e3 100755 --- a/NT/tools/rntcc +++ b/NT/tools/rntcc @@ -2,8 +2,6 @@ . $NTTOOLS -set -e - OPTS="" CFLAGS="" SOURCES="" @@ -212,5 +210,6 @@ if [ $OPERATION = linking ]; then echo >>$OUTPUT ". \$NTTOOLS" echo >>$OUTPUT "set -e" echo >>$OUTPUT "silent_do_cmd '`fixpath $NTDRIVE$PWD/$TARGET`' \"\$@\"" + echo >>$OUTPUT "exit \$?" chmod +x $OUTPUT fi diff --git a/NT/tools/sprsh b/NT/tools/sprsh new file mode 100755 index 0000000000..cb463c2ce0 --- /dev/null +++ b/NT/tools/sprsh @@ -0,0 +1,42 @@ +#!/usr/local/bin/pike + +inherit Stdio.File; + +string handle_input() +{ + object stdin=Stdio.File("stdin"); + while(string s=stdin->read(1000,1)) + write(s); +} + + +#if !constant(strerror) +#define strerror(X) X +#endif + +int main(int argc, string *cmd) +{ + if(!connect(getenv("NTHOST"),(int)getenv("NTPORT"))) + { + werror("Failed to connect "+strerror(errno())+".\n"); + exit(1); + } + + string tmp=getcwd(); + string mnt=getenv("NTMOUNT"); + if(mnt && strlen(mnt)) tmp=replace(tmp,mnt,""); + cmd[0]=getenv("NTDRIVE")+replace(tmp,"/","\\"); + write(sprintf("%4c",sizeof(cmd))); + for(int e=0;e<sizeof(cmd);e++) + write(sprintf("%4c%s",strlen(cmd[e]),cmd[e])); + + thread_create(handle_input); + while(1) + { + sscanf(read(4),"%4c",int len); + if(!len) break; + predef::write(read(len)); + } + sscanf(read(4),"%4c",int code); + exit(code); +} diff --git a/NT/tools/sprshd b/NT/tools/sprshd new file mode 100755 index 0000000000..ae6a177c9d --- /dev/null +++ b/NT/tools/sprshd @@ -0,0 +1,95 @@ +#!/usr/local/bin/pike + +inherit Stdio.Port; + +void handle_incoming_connection(object(Stdio.File) io) +{ + object p; + sscanf(io->read(4),"%4c",int args); + string *cmd=allocate(args); + for(int e=0;e<args;e++) + { + sscanf(io->read(4),"%4c",int len); + cmd[e]=io->read(len); + } + + object pi=Stdio.File(); + object p2=pi->pipe(); + string dir=cmd[0]; + cmd=cmd[1..]; + + switch(cmd[0]) + { + case "getenv": + { + string s=getenv(cmd[1])+"\n"; + io->write(sprintf("%4c%s",strlen(s),s)); + io->write(sprintf("%4c",0)); + io->write(sprintf("%4c",0)); + break; + } + + default: + mixed err=catch { + p=Process.create_process(cmd, + ([ + "stdin":io, + "stdout":p2, + "stderr":p2, + "cwd":dir, + ])); }; + + destruct(p2); + + if(!err) + { + while(1) + { + string s=pi->read(1000,1); + if(!s || !strlen(s)) break; + io->write(sprintf("%4c%s",strlen(s),s)); + } + + io->write(sprintf("%4c",0)); + io->write(sprintf("%4c",p->wait())); + }else{ + io->write(sprintf("%4c",0)); + io->write(sprintf("%4c",69)); + } + } + io->close("w"); + destruct(io); +} + + +int main(int argc, string *argv) +{ + if(c<2) + { + werror("Usage: sprshd <port> <host to accept connections from>\n"); + exit(1); + } + if(!bind((int)argv[1])) + { + werror("Failed to bind port.\n"); + exit(1); + } + + string *hosts=gethostbyname(argv[2])[1]; + + while(1) + { + if(object io=accept()) + { + sscanf(io->query_address(),"%s ",string ip); + if(search(hosts, ip)==-1) + { + destruct(io); + continue; + } + thread_create(handle_incoming_connection,io); + }else{ + werror("Accept failed "+errno()+"\n"); + } + } +} diff --git a/NT/tools/uname b/NT/tools/uname index ff699aae43..aa9c693546 100755 --- a/NT/tools/uname +++ b/NT/tools/uname @@ -57,7 +57,8 @@ fi OUTPUT= if [ $S = yes ]; then - OUTPUT="$OUTPUT `getntenv OS`" + OUTPUT="$OUTPUT Windows_NT" +# OUTPUT="$OUTPUT `getntenv OS`" fi if [ $N = yes ]; then diff --git a/src/modules/files/socket.c b/src/modules/files/socket.c index dda7026396..fc7300d6f6 100644 --- a/src/modules/files/socket.c +++ b/src/modules/files/socket.c @@ -295,6 +295,7 @@ extern struct program *file_program; static void port_accept(INT32 args) { + struct sockaddr_in addr; struct port *this=THIS; int fd,tmp; int len=0; @@ -305,7 +306,8 @@ static void port_accept(INT32 args) THREADS_ALLOW(); - fd=fd_accept(this->fd, 0, &len); + len=sizeof(addr); + fd=fd_accept(this->fd, (struct sockaddr *)&addr, &len); THREADS_DISALLOW(); if(fd < 0) -- GitLab