[ros-diffs] [sedwards] 37799: I hope I did not screw up the propset... Simple telnet daemon, I found, hacked in to a service. Its wrong, I know, humor me, it works, someone more interested can finish this off and follow the spec.txt

sedwards at svn.reactos.org sedwards at svn.reactos.org
Mon Dec 1 19:34:16 CET 2008


Author: sedwards
Date: Mon Dec  1 12:34:15 2008
New Revision: 37799

URL: http://svn.reactos.org/svn/reactos?rev=37799&view=rev
Log:
I hope I did not screw up the propset...

Simple telnet daemon, I found, hacked in to a service.
Its wrong, I know, humor me, it works, someone more
interested can finish this off and follow the spec.txt


Added:
    trunk/rosapps/applications/sysutils/telnetd/
    trunk/rosapps/applications/sysutils/telnetd/serviceentry.c   (with props)
    trunk/rosapps/applications/sysutils/telnetd/spec.txt   (with props)
    trunk/rosapps/applications/sysutils/telnetd/telnetd.c   (with props)
    trunk/rosapps/applications/sysutils/telnetd/telnetd.h   (with props)
    trunk/rosapps/applications/sysutils/telnetd/telnetd.vcproj   (with props)

Added: trunk/rosapps/applications/sysutils/telnetd/serviceentry.c
URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/telnetd/serviceentry.c?rev=37799&view=auto
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/serviceentry.c (added)
+++ trunk/rosapps/applications/sysutils/telnetd/serviceentry.c [iso-8859-1] Mon Dec  1 12:34:15 2008
@@ -1,0 +1,84 @@
+/*
+ * COPYRIGHT:        See COPYING in the top level directory
+ * PROJECT:          ReactOS kernel
+ * FILE:             services/TelnetD/TelnetD.c
+ * PURPOSE:          Printer spooler
+ * PROGRAMMER:       Eric Kohl
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include "telnetd.h"
+#define DPRINT printf
+
+/* GLOBALS ******************************************************************/
+
+#define SERVICE_NAME TEXT("TelnetD")
+
+SERVICE_STATUS_HANDLE ServiceStatusHandle;
+
+
+/* FUNCTIONS *****************************************************************/
+
+
+static DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+                      DWORD dwEventType,
+                      LPVOID lpEventData,
+                      LPVOID lpContext)
+{
+    switch (dwControl)
+    {
+        case SERVICE_CONTROL_STOP:
+        case SERVICE_CONTROL_SHUTDOWN:
+            return ERROR_SUCCESS;
+
+        default :
+            return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+}
+
+
+
+static VOID CALLBACK
+ServiceMain(DWORD argc, LPTSTR *argv)
+{
+    UNREFERENCED_PARAMETER(argc);
+    UNREFERENCED_PARAMETER(argv);
+
+    DPRINT("ServiceMain() called\n");
+
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME,
+                                                        ServiceControlHandler,
+                                                        NULL);
+
+    DPRINT("ServiceMain() done\n");
+}
+
+
+int
+wmain(int argc, WCHAR *argv[])
+{
+    SERVICE_TABLE_ENTRY ServiceTable[2] =
+    {
+        {SERVICE_NAME, ServiceMain},
+        {NULL, NULL}
+    };
+
+    UNREFERENCED_PARAMETER(argc);
+    UNREFERENCED_PARAMETER(argv);
+
+    DPRINT("TelnetD: main() started\n");
+
+    StartServiceCtrlDispatcher(ServiceTable);
+
+	telnetd_main();
+
+    DPRINT("TelnetD: main() done\n");
+
+    ExitThread(0);
+
+    return 0;
+}
+
+/* EOF */

Propchange: trunk/rosapps/applications/sysutils/telnetd/serviceentry.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/rosapps/applications/sysutils/telnetd/spec.txt
URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/telnetd/spec.txt?rev=37799&view=auto
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/spec.txt (added)
+++ trunk/rosapps/applications/sysutils/telnetd/spec.txt [iso-8859-1] Mon Dec  1 12:34:15 2008
@@ -1,0 +1,8 @@
+Here is the short product spec
+
+1. Fix the service stuff
+2. Use the event log
+3. Do real authentication ( I suspect you could hack PAM-GINA to do remote auth)
+4. Properly Set the environment
+
+

Propchange: trunk/rosapps/applications/sysutils/telnetd/spec.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/rosapps/applications/sysutils/telnetd/telnetd.c
URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/telnetd/telnetd.c?rev=37799&view=auto
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/telnetd.c (added)
+++ trunk/rosapps/applications/sysutils/telnetd/telnetd.c [iso-8859-1] Mon Dec  1 12:34:15 2008
@@ -1,0 +1,680 @@
+/*
+ * File: TelnetD.c
+ *
+ * Abstract: a simple telnet 'daemon' for Windows hosts.
+ *
+ * Compiled & run successfully using MSVC 5.0 under Windows95 (requires 
+ * Winsock2 update) and Windows98 and MSVC 6.0 under WindowsNT4
+ *
+ * Compiler options : no special options needed
+ * Linker options   : add wsock32.lib or ws2_32.lib
+ *
+ * Written by fred.van.lieshout 'at' zonnet.nl
+ * Use freely, no copyrights.
+ * Use Linux.
+ *
+ * TODO: 
+ * - access control
+ * - will/won't handshake
+ * - (run as) Windows NT service
+ */
+
+#include <stdio.h> 
+#include <windows.h>  
+
+/*
+** macro definitions
+*/
+#define TELNET_PORT      (23)
+
+#define BUFSIZE        (4096)  
+#define USERID_SIZE      (64)
+#define CTRLC             (3)
+#define BS                (8)
+#define CR               (13)
+#define LF               (10)
+#define DEL             (127)
+
+#define IAC             (255)
+#define DONT            (254)
+#define WONT            (253)
+#define DO              (252)
+#define WILL            (251)
+#define ECHO            (1)
+
+#define HANDSHAKE_TIMEOUT (3)
+
+/*
+** types
+*/
+
+typedef struct client_s
+{
+  char     userID[USERID_SIZE];
+  int      socket;
+  BOOLEAN  bTerminate;
+  BOOLEAN  bReadFromPipe;
+  BOOLEAN  bWriteToPipe;
+  HANDLE   hProcess;
+  DWORD    dwProcessId;
+  HANDLE   hChildStdinWr;   
+  HANDLE   hChildStdoutRd;
+} client_t;
+
+typedef enum
+{
+  NoEcho = 0,
+  Echo = 1,
+  Password = 2
+} EchoMode;
+
+/*
+** Local data
+*/
+
+static BOOLEAN bShutdown = 0;
+static BOOLEAN bSocketInterfaceInitialised = 0;
+
+static int sock;
+
+/*
+** Forward function declarations
+*/
+static BOOL WINAPI Cleanup(DWORD dwControlType);
+static void WaitForConnect(void);
+static BOOLEAN StartSocketInterface(void);
+static void CreateSocket(void);
+static void UserLogin(int client_socket);
+static DWORD WINAPI UserLoginThread(LPVOID);
+static int DoTelnetHandshake(int sock);
+static int ReceiveLine(int sock, char *buffer, int len, EchoMode echo);
+static void RunShell(client_t *client); 
+static BOOL CreateChildProcess(const char *); 
+static DWORD WINAPI MonitorChildThread(LPVOID);
+static DWORD WINAPI WriteToPipeThread(LPVOID); 
+static DWORD WINAPI ReadFromPipeThread(LPVOID); 
+static void TerminateShell(client_t *client);
+static VOID ErrorExit(LPTSTR); 
+
+
+/*
+** main
+*/
+DWORD telnetd_main() 
+{
+  SetConsoleCtrlHandler(Cleanup, 1);
+
+  if (!StartSocketInterface()) {
+    ErrorExit("Unable to start socket interface\n");
+  }
+
+  CreateSocket();
+
+  while(!bShutdown) {
+    WaitForConnect();
+  }
+
+  WSACleanup();
+  return 0;
+}
+
+/*
+** Cleanup
+*/
+static BOOL WINAPI Cleanup(DWORD dwControlType)
+{
+  if (bSocketInterfaceInitialised) {
+    printf("Cleanup...\n");
+    WSACleanup();
+  }
+  return 0;
+}
+
+/*
+** StartSocketInterface
+*/
+static BOOLEAN StartSocketInterface(void)
+{
+  WORD    wVersionRequested;
+  WSADATA wsaData;
+  int     err; 
+
+  wVersionRequested = MAKEWORD( 2, 0 ); 
+  err = WSAStartup(wVersionRequested, &wsaData);
+  if (err != 0) {
+    printf("requested winsock version not supported\n");
+    return 0;
+  } 
+
+  bSocketInterfaceInitialised = 1; /* for ErrorExit function */
+
+  if ( wsaData.wVersion != wVersionRequested) {
+    printf("requested winsock version not supported\n");
+    return 0;
+  }
+  printf("TelnetD, using %s\n", wsaData.szDescription);
+  return 1;
+}
+
+/*
+** CreateSocket
+*/
+static void CreateSocket(void)
+{
+   struct sockaddr_in sa;
+
+   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+   if (sock < 0) {
+     ErrorExit("Cannot create socket");
+   }
+
+   memset(&sa, 0, sizeof(sa));
+   sa.sin_family = AF_INET;
+   sa.sin_addr.s_addr = INADDR_ANY;
+   sa.sin_port = htons(TELNET_PORT);
+   if (bind(sock, (struct sockaddr*) &sa, sizeof(sa)) != 0) {
+      ErrorExit("Cannot bind address to socket");
+   }
+}
+
+/*
+** WaitForConnect
+*/
+static void WaitForConnect(void)
+{
+  struct sockaddr_in sa;
+  int new_sock;
+
+  if (listen(sock, 1) < 0) {
+     ErrorExit("Cannot listen on socket");
+  }
+
+  if ((new_sock = accept(sock, (struct sockaddr*) &sa, NULL)) < 0) {
+    fprintf(stderr, "Failed to accept incoming call\n");
+  } else {
+    printf("user connected on socket %d, port %d, address %lx\n", new_sock,
+                                       htons(sa.sin_port), sa.sin_addr.s_addr);
+    UserLogin(new_sock);
+  }
+}
+
+
+/*
+** Function: UserLogin
+*/
+static void UserLogin(int client_socket)
+{
+  DWORD      threadID;
+  client_t  *client = malloc(sizeof(client_t));
+
+  if (client == NULL) {
+    ErrorExit("failed to allocate memory for client");
+  }
+
+  client->socket = client_socket;
+  CreateThread(NULL, 0, UserLoginThread, client, 0, &threadID);
+}
+
+/*
+** Function: UserLoginThread
+*/
+static DWORD WINAPI UserLoginThread(LPVOID data)
+{
+  client_t  *client = (client_t *) data;
+  char       welcome[256];
+  char       hostname[64] = "Unknown";
+  char      *pwdPrompt = "\r\npass:";
+  char      *logonPrompt = "\r\nLogin OK, please wait...";
+  char      *byebye = "\r\nWrong! bye bye...\r\n";
+  char       userID[USERID_SIZE];
+  char       password[USERID_SIZE];
+  int        received;
+  char      *terminator;
+
+  if (DoTelnetHandshake(client->socket)) {
+    closesocket(client->socket);
+    free(client);
+    return 0;
+  }
+
+  gethostname(hostname, sizeof(hostname));
+  sprintf(welcome, "\r\nWelcome to %s, please identify yourself\r\n\r\nuser:", hostname);
+
+  if (send(client->socket, welcome, strlen(welcome), 0) < 0) {   
+    closesocket(client->socket);
+    free(client);
+    return 0;
+  }
+  received = ReceiveLine(client->socket, userID, sizeof(userID), Echo );
+  if (received < 0) {
+    closesocket(client->socket);
+    free(client);
+    return 0;
+  } else if (received) {
+    if ((terminator = strchr(userID, CR)) != NULL) {
+      *terminator = '\0';
+    }
+  }
+
+  if (send(client->socket, pwdPrompt, strlen(pwdPrompt), 0) < 0) {   
+    closesocket(client->socket);
+    free(client);
+    return 0;
+  }
+  received = ReceiveLine(client->socket, password, sizeof(password), Password );
+  if (received < 0) {
+    closesocket(client->socket);
+    free(client);
+    return 0;
+  } else if (received) {
+    if ((terminator = strchr(password, CR)) != NULL) {
+      *terminator = '\0';
+    }
+  }
+
+
+  /* TODO: do authentication here */
+
+  
+  printf("User '%s' logged on\n", userID);
+  strcpy(client->userID, userID);
+  if (send(client->socket, logonPrompt, strlen(logonPrompt), 0) < 0) {   
+    closesocket(client->socket);
+    free(client);
+    return 0;
+  }
+  RunShell(client);
+  return 0;
+}
+
+/*
+** Function: DoTelnetHandshake
+*/
+static int DoTelnetHandshake(int sock)
+{
+  int retval;
+  int received;
+  fd_set set;
+  struct timeval timeout = { HANDSHAKE_TIMEOUT, 0 };
+  unsigned char will_echo[3] = { IAC, WILL, ECHO };
+  unsigned char client_reply[256];
+
+  if (send(sock, (const char *) will_echo, sizeof(will_echo), 0) < 0) {   
+    return -1;
+  }
+
+  /* Now wait for client response (and ignore it) */
+  FD_ZERO(&set);
+  FD_SET(sock, &set);
+
+  do {
+    retval = select(0, &set, NULL, NULL, &timeout);
+    /* check for error */
+    if (retval < 0) {
+      return -1;
+      /* check for timeout */
+    } else if (retval == 0) {
+      return 0;
+    }
+    /* no error and no timeout, we have data in our sock */
+    received = recv(sock, client_reply, sizeof(client_reply), 0);
+    if (received <= 0) {
+     return -1;
+    }
+  } while (retval);
+
+  return 0;
+}
+
+/*
+** Function: ReceiveLine
+**
+** Abstract: receive until timeout or CR
+** In      : sock, len
+** Out     : buffer
+** Result  : int
+** Pre     : 'sock' must be valid socket
+** Post    : (result = the number of bytes read into 'buffer')
+**           OR (result = -1 and error)
+*/
+static int ReceiveLine(int sock, char *buffer, int len, EchoMode echo)
+{
+  int            i = 0;
+  int            retval;
+  fd_set         set;
+  struct timeval timeout = { 0, 100000 };
+  char           del[3] = { BS, ' ', BS };
+  char           asterisk[1] = { '*' };
+
+  FD_ZERO(&set);
+  FD_SET(sock, &set);
+
+  memset(buffer, '\0', len);
+
+  do {
+    /* When we're in echo mode, we do not need a timeout */
+    retval = select(0, &set, NULL, NULL, (echo ? NULL : &timeout) );
+    /* check for error */
+    if (retval < 0) {
+      return -1;
+      /* check for timeout */
+    } else if (retval == 0) {
+      /* return number of characters received so far */
+      return i;
+    }
+    /* no error and no timeout, we have data in our sock */
+    if (recv(sock, &buffer[i], 1, 0) <= 0) {
+      return -1;
+    }
+    if ((buffer[i] == '\0') || (buffer[i] == LF)) {
+      /* ignore null characters and linefeeds from DOS telnet clients */
+      buffer[i] = '\0';
+    } else if ((buffer[i] == DEL) || (buffer[i] == BS)) {
+      /* handle delete and backspace */
+      buffer[i] = '\0';
+      if (echo) {
+	      if (i > 0) {
+          i--;
+          buffer[i] = '\0';
+          if (send(sock, del, sizeof(del), 0) < 0) {
+            return -1;
+          }
+        }
+      } else {
+        buffer[i] = BS;  /* Let shell process handle it */
+	      i++;
+      }
+    } else {
+      /* echo typed characters */
+      if (echo == Echo && send(sock, &buffer[i], 1, 0) < 0) {
+        return -1;
+      } else if (echo == Password && send(sock, asterisk, sizeof(asterisk), 0) < 0) {
+        return -1;
+      }
+      if (buffer[i] == CR) {
+        i++;
+        buffer[i] = LF; /* append LF for DOS command processor */
+        i++;
+        return i;
+      }
+
+      i++;
+    }    
+  } while (i < len);
+
+  return i;
+}
+
+/*
+** Function: RunShell
+*/
+static void RunShell(client_t *client) 
+{ 
+   DWORD                 threadID;
+   HANDLE                hChildStdinRd;
+   HANDLE                hChildStdinWr;
+   HANDLE                hChildStdoutRd;
+   HANDLE                hChildStdoutWr;
+   STARTUPINFO           si;
+   PROCESS_INFORMATION   piProcInfo;
+   SECURITY_ATTRIBUTES   saAttr;
+
+   const char *name = "c:\\windows\\system32\\cmd.exe";
+   const char *cmd = NULL;
+   //const char *name = "d:\\cygwin\\bin\\bash.exe";
+   //const char *cmd = "d:\\cygwin\\bin\\bash.exe --login -i";
+   
+   saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
+   saAttr.bInheritHandle = TRUE; 
+   saAttr.lpSecurityDescriptor = NULL; 
+   
+   // Create a pipe for the child process's STDOUT.  
+   if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) 
+      ErrorExit("Stdout pipe creation failed\n");  
+
+   if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) 
+      ErrorExit("Stdin pipe creation failed\n");  
+
+
+   client->bTerminate = FALSE;
+   client->bWriteToPipe = TRUE;
+   client->bReadFromPipe = TRUE;
+   client->hChildStdinWr = hChildStdinWr;   
+   client->hChildStdoutRd = hChildStdoutRd;
+
+
+   // Create the child process (the shell)
+   printf("Creating child process...\n");
+
+   ZeroMemory( &si, sizeof(STARTUPINFO) );
+   si.cb = sizeof(STARTUPINFO);  
+
+   si.dwFlags = STARTF_USESTDHANDLES;
+   si.hStdInput = hChildStdinRd;
+   si.hStdOutput = hChildStdoutWr;
+   si.hStdError = hChildStdoutWr;
+
+   //si.dwFlags |= STARTF_USESHOWWINDOW;
+   //si.wShowWindow = SW_SHOW;
+
+   if (!CreateProcess((LPSTR) name,              // executable module
+                      (LPSTR) cmd,               // command line 
+                      NULL,                      // process security attributes 
+                      NULL,                      // primary thread security attributes 
+                      TRUE,                      // handles are inherited 
+                      //DETACHED_PROCESS +         // creation flags 
+                      CREATE_NEW_PROCESS_GROUP,
+                      NULL,                      // use parent's environment 
+                      NULL,                      // use parent's current directory 
+                      &si,                       // startup info
+                      &piProcInfo)) {
+     ErrorExit("Create process failed");
+   }
+
+   client->hProcess = piProcInfo.hProcess;
+   client->dwProcessId = piProcInfo.dwProcessId;
+
+   printf("New child created (groupid=%lu)\n", client->dwProcessId);
+
+   // No longer need these in the parent...
+   if (!CloseHandle(hChildStdoutWr)) 
+     ErrorExit("Closing handle failed");  
+   if (!CloseHandle(hChildStdinRd)) 
+     ErrorExit("Closing handle failed");  
+
+   CreateThread(NULL, 0, WriteToPipeThread, client, 0, &threadID);
+   CreateThread(NULL, 0, ReadFromPipeThread, client, 0, &threadID);
+   CreateThread(NULL, 0, MonitorChildThread, client, 0, &threadID);
+} 
+
+
+/*
+** Function: MonitorChildThread
+**
+** Abstract: Monitor the child (shell) process
+*/
+static DWORD WINAPI MonitorChildThread(LPVOID data)
+{
+  DWORD exitCode;
+  client_t *client = (client_t *) data;
+
+  printf("Monitor thread running...\n");
+
+  WaitForSingleObject(client->hProcess, INFINITE);
+
+  GetExitCodeProcess(client->hProcess, &exitCode);
+  printf("Child process terminated with code %d\n", exitCode);
+
+  /* signal the other threads to give up */
+  client->bTerminate = TRUE;
+
+  Sleep(500);
+
+  CloseHandle(client->hChildStdoutRd);
+  CloseHandle(client->hChildStdinWr);       
+  CloseHandle(client->hProcess);
+
+  closesocket(client->socket);
+
+  printf("Waiting for all threads to give up..\n");
+
+  while (client->bWriteToPipe || client->bReadFromPipe) {
+    printf(".");
+    fflush(stdout);
+    Sleep(1000);
+  }
+
+  printf("Cleanup for user '%s'\n", client->userID);
+  free(client);
+  return 0;
+}
+
+/*
+** Function: WriteToPipeThread
+** 
+** Abstract: read data from the telnet client socket
+**           and pass it on to the shell process.
+*/
+static DWORD WINAPI WriteToPipeThread(LPVOID data)
+{
+  int       iRead;
+  DWORD     dwWritten;
+  CHAR      chBuf[BUFSIZE];
+  client_t *client = (client_t *) data;
+
+  while (!client->bTerminate) {
+    iRead = ReceiveLine(client->socket, chBuf, BUFSIZE, FALSE);
+    if (iRead < 0) {
+      printf("Client disconnect\n");
+      break;
+    } else if (iRead > 0) {
+      if (strchr(chBuf, CTRLC)) {
+        GenerateConsoleCtrlEvent(CTRL_C_EVENT, client->dwProcessId);
+      }
+      if (send(client->socket, chBuf, iRead, 0) < 0) {
+		 printf("error writing to socket\n");
+         break;    
+	  }
+      if (! WriteFile(client->hChildStdinWr, chBuf, (DWORD) iRead, &dwWritten, NULL)) {
+        printf("Error writing to pipe\n");
+        break;
+      }
+    }
+  }
+
+  if (!client->bTerminate) {
+    TerminateShell(client);
+  }
+
+  printf("WriteToPipeThread terminated\n");
+
+  client->bWriteToPipe = FALSE;
+  return 0;
+}
+
+/*
+** Function: ReadFromPipeThread
+**
+** Abstract: Read data from the shell's stdout handle and
+**           pass it on to the telnet client socket.
+*/
+static DWORD WINAPI ReadFromPipeThread(LPVOID data) 
+{    
+  DWORD dwRead;
+  DWORD dwAvail;
+  CHAR chBuf[BUFSIZE];
+  CHAR txBuf[BUFSIZE*2];
+  DWORD from,to;
+  char warning[] = "warning: rl_prep_terminal: cannot get terminal settings";
+
+  client_t *client = (client_t *) data;
+
+  while (!client->bTerminate && client->bWriteToPipe) {
+    // Since we do not want to block, first peek...
+    if (PeekNamedPipe(client->hChildStdoutRd, NULL, 0, NULL, &dwAvail, NULL) == 0) {
+      printf("Failed to peek in pipe\n");
+      break;
+    }
+    if (dwAvail) {
+      if( ! ReadFile( client->hChildStdoutRd, chBuf, BUFSIZE, &dwRead, NULL) ||
+           dwRead == 0) {
+        printf("Failed to read from pipe\n");
+        break;
+      }
+	  for (from=0, to=0; from<dwRead; from++, to++) {
+        txBuf[to] = chBuf[from];
+		if (txBuf[to] == '\n') {
+			txBuf[to] = '\r';
+			to++;
+			txBuf[to] = '\n';
+		}
+	  }
+      if (send(client->socket, txBuf, to, 0) < 0) {
+		 printf("error writing to socket\n");
+         break;    
+	  }
+	}
+    Sleep(100); /* Hmmm, oh well... what the heck! */
+  }
+
+  if (!client->bTerminate) {
+    TerminateShell(client);
+  }
+
+  printf("ReadFromPipeThread terminated\n");
+
+  client->bReadFromPipe = FALSE;
+  return 0;
+}
+
+/*
+** TerminateShell
+*/ 
+static void TerminateShell(client_t *client)
+{
+  DWORD exitCode;
+  DWORD dwWritten;
+  char stop[] = "\003\r\nexit\r\n"; /* Ctrl-C + exit */
+
+  GetExitCodeProcess(client->hProcess, &exitCode);
+  if (exitCode == STILL_ACTIVE) {
+    printf("user shell still active, send Ctrl-Break to group-id %lu\n", client->dwProcessId );
+
+    if (!GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT, client->dwProcessId )) {
+      printf("Failed to send Ctrl_break\n");
+    }
+
+    Sleep(500);
+
+    if (!GenerateConsoleCtrlEvent( CTRL_C_EVENT, client->dwProcessId )) {
+      printf("Failed to send Ctrl_C\n");
+    }
+
+    Sleep(500);
+
+    if (! WriteFile(client->hChildStdinWr, stop, sizeof(stop), &dwWritten, NULL)) {
+        printf("Error writing to pipe\n");
+    }
+
+    Sleep(500);
+
+    GetExitCodeProcess(client->hProcess, &exitCode);
+    if (exitCode == STILL_ACTIVE) {
+      printf("user shell still active, attempt to terminate it now...\n");
+      TerminateProcess(client->hProcess, 0);
+    }
+  }
+}
+
+/*
+** ErrorExit
+*/
+static VOID ErrorExit (LPTSTR lpszMessage) 
+{ 
+   fprintf(stderr, "%s\n", lpszMessage);
+   if (bSocketInterfaceInitialised) {
+     printf("WSAGetLastError=%d\n", WSAGetLastError());
+     WSACleanup();
+   }
+   ExitProcess(0); 
+} 

Propchange: trunk/rosapps/applications/sysutils/telnetd/telnetd.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/rosapps/applications/sysutils/telnetd/telnetd.h
URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/telnetd/telnetd.h?rev=37799&view=auto
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/telnetd.h (added)
+++ trunk/rosapps/applications/sysutils/telnetd/telnetd.h [iso-8859-1] Mon Dec  1 12:34:15 2008
@@ -1,0 +1,8 @@
+#define _CRT_SECURE_NO_WARNINGS
+
+#include <stdio.h>
+#include <winsock2.h>
+#include <tchar.h>
+#include <time.h>
+
+DWORD telnetd_main();

Propchange: trunk/rosapps/applications/sysutils/telnetd/telnetd.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/rosapps/applications/sysutils/telnetd/telnetd.vcproj
URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/telnetd/telnetd.vcproj?rev=37799&view=auto
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/telnetd.vcproj (added)
+++ trunk/rosapps/applications/sysutils/telnetd/telnetd.vcproj [iso-8859-1] Mon Dec  1 12:34:15 2008
@@ -1,0 +1,196 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="telnetd"
+	ProjectGUID="{3B4D6C18-202E-41C8-B1E8-0FC5CD940819}"
+	RootNamespace="telnetd"
+	TargetFrameworkVersion="196613"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				MinimalRebuild="true"
+				ExceptionHandling="0"
+				BasicRuntimeChecks="3"
+				WarningLevel="3"
+				DebugInformationFormat="4"
+				CallingConvention="2"
+				CompileAs="1"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="msvcrt.lib advapi32.lib ws2_32.lib"
+				IgnoreAllDefaultLibraries="true"
+				GenerateDebugInformation="true"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				EnableIntrinsicFunctions="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				GenerateDebugInformation="true"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\serviceentry.c"
+				>
+			</File>
+			<File
+				RelativePath=".\telnetd.c"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath=".\telnetd.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>

Propchange: trunk/rosapps/applications/sysutils/telnetd/telnetd.vcproj
------------------------------------------------------------------------------
    svn:eol-style = native



More information about the Ros-diffs mailing list