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