Author: sedwards
Date: Fri Feb 6 02:22:18 2009
New Revision: 39432
URL:
http://svn.reactos.org/svn/reactos?rev=39432&view=rev
Log:
- Some formating changes
- Remove unneeded spec, just use the comments
- Syslog interface for my wine usage, disabled in ReactOS tree
but included here to reduce my diff.
Added:
trunk/rosapps/applications/sysutils/telnetd/syslog.c (with props)
trunk/rosapps/applications/sysutils/telnetd/syslog.h (with props)
Removed:
trunk/rosapps/applications/sysutils/telnetd/spec.txt
Modified:
trunk/rosapps/applications/sysutils/telnetd/telnetd.c
Removed: trunk/rosapps/applications/sysutils/telnetd/spec.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/teln…
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/spec.txt [iso-8859-1] (original)
+++ trunk/rosapps/applications/sysutils/telnetd/spec.txt (removed)
@@ -1,8 +1,0 @@
-Here is the short product spec
-
-1. Fix the service stuff
-2. Use the event log
-3. Do real authentication (LogonUser[Ex]+CreateProcessAsUser maybe?)
-4. Properly Set the environment
-
-
Added: trunk/rosapps/applications/sysutils/telnetd/syslog.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/teln…
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/syslog.c (added)
+++ trunk/rosapps/applications/sysutils/telnetd/syslog.c [iso-8859-1] Fri Feb 6 02:22:18
2009
@@ -1,0 +1,308 @@
+/*
+ * syslog-client.c - syslog client implementation for windows
+ *
+ * Created by Alexander Yaworsky
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+/* define SYSLOG_CONF_DIR where syslog.host should be
+ */
+
+#ifndef SYSLOG_CONF_DIR
+static const char *syslog_conf_dir = ".";
+#else
+static const char *syslog_conf_dir = SYSLOG_CONF_DIR;
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include "syslog.h"
+
+#ifdef TEST
+# define SYSLOG_DGRAM_SIZE 80
+#else
+# define SYSLOG_DGRAM_SIZE 1024
+#endif
+
+static BOOL initialized = FALSE;
+static int log_mask = 0xFF;
+static char *syslog_ident;
+static int syslog_facility;
+static char str_pid[ 40 ];
+static SOCKADDR_IN sa_logger;
+static SOCKET sock;
+static char local_hostname[ MAX_COMPUTERNAME_LENGTH + 1 ];
+static char datagramm[ SYSLOG_DGRAM_SIZE ];
+static int datagramm_size;
+
+/******************************************************************************
+ * set_syslog_conf_dir
+ *
+ * maybe this function will be useful...
+ */
+const char* set_syslog_conf_dir( const char* dir )
+{
+ const char *ret = syslog_conf_dir;
+ syslog_conf_dir = dir;
+ return ret;
+}
+
+/******************************************************************************
+ * init_logger_addr
+ *
+ * Read configuration file syslog.host. This file should contain host address
+ * and, optionally, port. Initialize sa_logger. If the configuration file does
+ * not exist, use localhost:514.
+ * Returns: 0 - ok, -1 - error.
+ */
+static void init_logger_addr()
+{
+ char pathname[ FILENAME_MAX ];
+ char *p;
+ FILE *fd;
+ char host[256];
+ struct hostent * phe;
+
+ memset( &sa_logger, 0, sizeof(SOCKADDR_IN) );
+ sa_logger.sin_family = AF_INET;
+
+ if( '\\' == syslog_conf_dir[0] || '/' == syslog_conf_dir[0] ||
':' == syslog_conf_dir[1] )
+ {
+ /* absolute path */
+ strcpy( pathname, syslog_conf_dir );
+ }
+ else
+ {
+ /* relative path */
+ char *q;
+
+ strcpy( pathname, __argv[0] );
+ p = strrchr( pathname, '\\' ) + 1;
+ q = strrchr( pathname, '/' ) + 1;
+ if( p < q )
+ *q = 0;
+ else if( p > q )
+ *p = 0;
+ else
+ pathname[0] = 0;
+ strcat( pathname, syslog_conf_dir );
+ }
+ p = &pathname[ strlen( pathname ) - 1 ];
+ if( '\\' != *p && '/' != *p )
+ {
+ p++; *p = '/';
+ }
+ strcpy( ++p, "syslog.host" );
+
+ /* read destination host name */
+ fd = fopen( pathname, "r" );
+ if( !fd )
+ goto use_default;
+
+ if( NULL == fgets( host, sizeof(host), fd ) )
+ host[0] = 0;
+ else
+ {
+ p = strchr( host, '\n' );
+ if( p )
+ *p = 0;
+ p = strchr( host, '\r' );
+ if( p )
+ *p = 0;
+ }
+ fclose( fd );
+
+ p = strchr( host, ':' );
+ if( p )
+ *p++ = 0;
+
+ phe = gethostbyname( host );
+ if( !phe )
+ goto use_default;
+
+ memcpy( &sa_logger.sin_addr.s_addr, phe->h_addr, phe->h_length );
+
+ if( p )
+ sa_logger.sin_port = htons( (unsigned short) strtoul( p, NULL, 0 ) );
+ else
+ sa_logger.sin_port = htons( SYSLOG_PORT );
+ return;
+
+use_default:
+ sa_logger.sin_addr.S_un.S_addr = htonl( 0x7F000001 );
+ sa_logger.sin_port = htons( SYSLOG_PORT );
+}
+
+/******************************************************************************
+ * closelog
+ *
+ * Close desriptor used to write to system logger.
+ */
+void closelog()
+{
+ if( !initialized )
+ return;
+ closesocket( sock );
+ WSACleanup();
+ initialized = FALSE;
+}
+
+/******************************************************************************
+ * openlog
+ *
+ * Open connection to system logger.
+ */
+void openlog( char* ident, int option, int facility )
+{
+ BOOL failed = TRUE, wsa_initialized = FALSE;
+ WSADATA wsd;
+ SOCKADDR_IN sa_local;
+ DWORD n;
+ int size;
+
+ if( initialized )
+ return;
+
+ syslog_facility = facility? facility : LOG_USER;
+
+ /* FIXME: should we reset logmask? */
+
+ if( option & LOG_PID )
+ snprintf( str_pid, sizeof(str_pid), "[%lu]", GetCurrentProcessId() );
+ else
+ str_pid[0] = 0;
+
+ /* FIXME: handle other options */
+
+ n = sizeof(local_hostname);
+ if( !GetComputerName( local_hostname, &n ) )
+ goto done;
+
+ sock = INVALID_SOCKET;
+ if( WSAStartup( MAKEWORD( 2, 2 ), &wsd ) )
+ goto done;
+ wsa_initialized = TRUE;
+
+ init_logger_addr();
+
+ for( n = 0;; n++ )
+ {
+ sock = socket( AF_INET, SOCK_DGRAM, 0 );
+ if( INVALID_SOCKET == sock )
+ goto done;
+
+ memset( &sa_local, 0, sizeof(SOCKADDR_IN) );
+ sa_local.sin_family = AF_INET;
+ if( bind( sock, (SOCKADDR*) &sa_local, sizeof(SOCKADDR_IN) ) == 0 )
+ break;
+ closesocket( sock );
+ sock = INVALID_SOCKET;
+ if( n == 100 )
+ goto done;
+ Sleep(0);
+ }
+
+ /* get size of datagramm */
+ size = sizeof(datagramm_size);
+ if( getsockopt( sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char*) &datagramm_size,
&size ) )
+ goto done;
+ if( datagramm_size - strlen(local_hostname) - (ident? strlen(ident) : 0) < 64 )
+ goto done;
+ if( datagramm_size > sizeof(datagramm) )
+ datagramm_size = sizeof(datagramm);
+
+ if( atexit( closelog ) )
+ goto done;
+
+ syslog_ident = ident;
+ syslog_facility = facility;
+ failed = FALSE;
+
+done:
+ if( failed )
+ {
+ if( sock != INVALID_SOCKET ) closesocket( sock );
+ if( wsa_initialized ) WSACleanup();
+ }
+ initialized = !failed;
+}
+
+/******************************************************************************
+ * setlogmask
+ *
+ * Set the log mask level.
+ */
+int setlogmask( int mask )
+{
+ int ret = log_mask;
+
+ if( mask )
+ log_mask = mask;
+ return ret;
+}
+
+/******************************************************************************
+ * syslog
+ *
+ * Generate a log message using FMT string and option arguments.
+ */
+void syslog( int pri, char* fmt, ... )
+{
+ va_list ap;
+
+ va_start( ap, fmt );
+ vsyslog( pri, fmt, ap );
+ va_end( ap );
+}
+
+/******************************************************************************
+ * vsyslog
+ *
+ * Generate a log message using FMT and using arguments pointed to by AP.
+ */
+void vsyslog( int pri, char* fmt, va_list ap )
+{
+ static char *month[] = {"Jan", "Feb", "Mar",
"Apr", "May", "Jun",
+ "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec" };
+ SYSTEMTIME stm;
+ int len;
+ char *p;
+
+ if( !(LOG_MASK( LOG_PRI( pri )) & log_mask) )
+ return;
+
+ openlog( NULL, 0, pri & LOG_FACMASK );
+ if( !initialized )
+ return;
+
+ if( !(pri & LOG_FACMASK) )
+ pri |= syslog_facility;
+
+ GetLocalTime( &stm );
+ len = sprintf( datagramm, "<%d>%s %2d %02d:%02d:%02d %s %s%s: ",
+ pri,
+ month[ stm.wMonth - 1 ], stm.wDay, stm.wHour, stm.wMinute,
stm.wSecond,
+ local_hostname, syslog_ident? syslog_ident : "", str_pid );
+ vsnprintf( datagramm + len, datagramm_size - len, fmt, ap );
+ p = strchr( datagramm, '\n' );
+ if( p )
+ *p = 0;
+ p = strchr( datagramm, '\r' );
+ if( p )
+ *p = 0;
+
+ sendto( sock, datagramm, strlen(datagramm), 0, (SOCKADDR*) &sa_logger,
sizeof(SOCKADDR_IN) );
+}
+
Propchange: trunk/rosapps/applications/sysutils/telnetd/syslog.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/rosapps/applications/sysutils/telnetd/syslog.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: trunk/rosapps/applications/sysutils/telnetd/syslog.h
URL:
http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/teln…
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/syslog.h (added)
+++ trunk/rosapps/applications/sysutils/telnetd/syslog.h [iso-8859-1] Fri Feb 6 02:22:18
2009
@@ -1,0 +1,197 @@
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)syslog.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _SYS_SYSLOG_H
+#define _SYS_SYSLOG_H 1
+
+#include <stdarg.h>
+
+/*
+ * priorities/facilities are encoded into a single 32-bit quantity, where the
+ * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility
+ * (0-big number). Both the priorities and the facilities map roughly
+ * one-to-one to strings in the syslogd(8) source code. This mapping is
+ * included in this file.
+ *
+ * priorities (these are ordered)
+ */
+#define LOG_EMERG 0 /* system is unusable */
+#define LOG_ALERT 1 /* action must be taken immediately */
+#define LOG_CRIT 2 /* critical conditions */
+#define LOG_ERR 3 /* error conditions */
+#define LOG_WARNING 4 /* warning conditions */
+#define LOG_NOTICE 5 /* normal but significant condition */
+#define LOG_INFO 6 /* informational */
+#define LOG_DEBUG 7 /* debug-level messages */
+
+#define LOG_PRIMASK 0x07 /* mask to extract priority part (internal) */
+ /* extract priority */
+#define LOG_PRI(p) ((p) & LOG_PRIMASK)
+#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri))
+
+#ifdef SYSLOG_NAMES
+#define INTERNAL_NOPRI 0x10 /* the "no priority" priority */
+ /* mark "facility" */
+#define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0)
+typedef struct _code {
+ char *c_name;
+ int c_val;
+} CODE;
+
+CODE prioritynames[] =
+ {
+ { "alert", LOG_ALERT },
+ { "crit", LOG_CRIT },
+ { "debug", LOG_DEBUG },
+ { "emerg", LOG_EMERG },
+ { "err", LOG_ERR },
+ { "error", LOG_ERR }, /* DEPRECATED */
+ { "info", LOG_INFO },
+ { "none", INTERNAL_NOPRI }, /* INTERNAL */
+ { "notice", LOG_NOTICE },
+ { "panic", LOG_EMERG }, /* DEPRECATED */
+ { "warn", LOG_WARNING }, /* DEPRECATED */
+ { "warning", LOG_WARNING },
+ { NULL, -1 }
+ };
+#endif
+
+/* facility codes */
+#define LOG_KERN (0<<3) /* kernel messages */
+#define LOG_USER (1<<3) /* random user-level messages */
+#define LOG_MAIL (2<<3) /* mail system */
+#define LOG_DAEMON (3<<3) /* system daemons */
+#define LOG_AUTH (4<<3) /* security/authorization messages */
+#define LOG_SYSLOG (5<<3) /* messages generated internally by
syslogd */
+#define LOG_LPR (6<<3) /* line printer subsystem */
+#define LOG_NEWS (7<<3) /* network news subsystem */
+#define LOG_UUCP (8<<3) /* UUCP subsystem */
+#define LOG_CRON (9<<3) /* clock daemon */
+#define LOG_AUTHPRIV (10<<3) /* security/authorization messages
(private) */
+#define LOG_FTP (11<<3) /* ftp daemon */
+
+ /* other codes through 15 reserved for system use */
+#define LOG_LOCAL0 (16<<3) /* reserved for local use */
+#define LOG_LOCAL1 (17<<3) /* reserved for local use */
+#define LOG_LOCAL2 (18<<3) /* reserved for local use */
+#define LOG_LOCAL3 (19<<3) /* reserved for local use */
+#define LOG_LOCAL4 (20<<3) /* reserved for local use */
+#define LOG_LOCAL5 (21<<3) /* reserved for local use */
+#define LOG_LOCAL6 (22<<3) /* reserved for local use */
+#define LOG_LOCAL7 (23<<3) /* reserved for local use */
+
+#define LOG_NFACILITIES 24 /* current number of facilities */
+#define LOG_FACMASK 0x03f8 /* mask to extract facility part */
+ /* facility of pri */
+#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3)
+
+#ifdef SYSLOG_NAMES
+CODE facilitynames[] =
+ {
+ { "auth", LOG_AUTH },
+ { "authpriv", LOG_AUTHPRIV },
+ { "cron", LOG_CRON },
+ { "daemon", LOG_DAEMON },
+ { "ftp", LOG_FTP },
+ { "kern", LOG_KERN },
+ { "lpr", LOG_LPR },
+ { "mail", LOG_MAIL },
+ { "mark", INTERNAL_MARK }, /* INTERNAL */
+ { "news", LOG_NEWS },
+ { "security", LOG_AUTH }, /* DEPRECATED */
+ { "syslog", LOG_SYSLOG },
+ { "user", LOG_USER },
+ { "uucp", LOG_UUCP },
+ { "local0", LOG_LOCAL0 },
+ { "local1", LOG_LOCAL1 },
+ { "local2", LOG_LOCAL2 },
+ { "local3", LOG_LOCAL3 },
+ { "local4", LOG_LOCAL4 },
+ { "local5", LOG_LOCAL5 },
+ { "local6", LOG_LOCAL6 },
+ { "local7", LOG_LOCAL7 },
+ { NULL, -1 }
+ };
+#endif
+
+/*
+ * arguments to setlogmask.
+ */
+#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority
*/
+#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through
pri */
+
+/*
+ * Option flags for openlog.
+ *
+ * LOG_ODELAY no longer does anything.
+ * LOG_NDELAY is the inverse of what it used to be.
+ */
+#define LOG_PID 0x01 /* log the pid with each message */
+#define LOG_CONS 0x02 /* log on the console if errors in sending */
+#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */
+#define LOG_NDELAY 0x08 /* don't delay open */
+#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */
+#define LOG_PERROR 0x20 /* log to stderr as well */
+
+#define SYSLOG_PORT 514
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Close desriptor used to write to system logger. */
+extern void closelog (void);
+
+/* Open connection to system logger. */
+extern void openlog (char *__ident, int __option, int __facility);
+
+/* Set the log mask level. */
+extern int setlogmask (int __mask);
+
+/* Generate a log message using FMT string and option arguments. */
+extern void syslog (int __pri, char *__fmt, ...);
+
+/* Generate a log message using FMT and using arguments pointed to by AP. */
+extern void vsyslog (int __pri, char *__fmt, va_list __ap);
+
+/* windows-specific;
+ set directory from where syslog.host must be read;
+ this file contains a single line with hostname and port of syslog daemon;
+ default is localhost:514
+*/
+extern const char* set_syslog_conf_dir( const char* dir );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* syslog.h */
Propchange: trunk/rosapps/applications/sysutils/telnetd/syslog.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/rosapps/applications/sysutils/telnetd/syslog.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: trunk/rosapps/applications/sysutils/telnetd/telnetd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/teln…
==============================================================================
--- trunk/rosapps/applications/sysutils/telnetd/telnetd.c [iso-8859-1] (original)
+++ trunk/rosapps/applications/sysutils/telnetd/telnetd.c [iso-8859-1] Fri Feb 6 02:22:18
2009
@@ -22,6 +22,17 @@
#include "telnetd.h"
+#define telnetd_printf printf
+
+#if 0
+extern void syslog (int priority, const char *fmt, ...);
+
+int telnetd_printf(const char *format, ...)
+{
+ syslog (6, format);
+}
+#endif
+
/* Local data */
static BOOLEAN bShutdown = 0;
@@ -41,9 +52,8 @@
{
SetConsoleCtrlHandler(Cleanup, 1);
- if (!StartSocketInterface()) {
+ if (!StartSocketInterface())
ErrorExit("Unable to start socket interface\n");
- }
CreateSocket();
@@ -59,7 +69,7 @@
static BOOL WINAPI Cleanup(DWORD dwControlType)
{
if (bSocketInterfaceInitialised) {
- printf("Cleanup...\n");
+ telnetd_printf("Cleanup...\n");
WSACleanup();
}
return 0;
@@ -75,82 +85,70 @@
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
- printf("requested winsock version not supported\n");
+ telnetd_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);
+ if ( wsaData.wVersion != wVersionRequested)
+ ErrorExit("requested winsock version not supported\n");
+
+ telnetd_printf("TelnetD, using %s\n", wsaData.szDescription);
return 1;
}
-/*
-** CreateSocket
-*/
+/* CreateSocket */
static void CreateSocket(void)
{
struct sockaddr_in sa;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock < 0) {
+ 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) {
+
+ if (bind(sock, (struct sockaddr*) &sa, sizeof(sa)) != 0)
ErrorExit("Cannot bind address to socket");
- }
-}
-
-/*
-** WaitForConnect
-*/
+}
+
+/* WaitForConnect */
static void WaitForConnect(void)
{
struct sockaddr_in sa;
int new_sock;
- if (listen(sock, 1) < 0) {
+ 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,
+ telnetd_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
-*/
+/* Function: UserLogin */
static void UserLogin(int client_socket)
{
DWORD threadID;
client_t *client = malloc(sizeof(client_t));
- if (client == NULL) {
+ if (client == NULL)
ErrorExit("failed to allocate memory for client");
- }
+
client->socket = client_socket;
CreateThread(NULL, 0, UserLoginThread, client, 0, &threadID);
}
-/*
-** Function: UserLoginThread
-*/
+/* Function: UserLoginThread */
static DWORD WINAPI UserLoginThread(LPVOID data)
{
client_t *client = (client_t *) data;
@@ -211,7 +209,7 @@
/* TODO: do authentication here */
- printf("User '%s' logged on\n", userID);
+ telnetd_printf("User '%p' logged on\n", userID);
#if 0
strcpy(client->userID, userID);
if (send(client->socket, logonPrompt, strlen(logonPrompt), 0) < 0) {
@@ -224,9 +222,7 @@
return 0;
}
-/*
-** Function: DoTelnetHandshake
-*/
+/* Function: DoTelnetHandshake */
static int DoTelnetHandshake(int sock)
{
int retval;
@@ -394,7 +390,7 @@
// Create the child process (the shell)
- printf("Creating child process...\n");
+ telnetd_printf("Creating child process...\n");
ZeroMemory( &si, sizeof(STARTUPINFO) );
si.cb = sizeof(STARTUPINFO);
@@ -424,11 +420,12 @@
client->hProcess = piProcInfo.hProcess;
client->dwProcessId = piProcInfo.dwProcessId;
- printf("New child created (groupid=%lu)\n", client->dwProcessId);
+ telnetd_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");
@@ -437,23 +434,22 @@
CreateThread(NULL, 0, MonitorChildThread, client, 0, &threadID);
}
-
/*
-** Function: MonitorChildThread
-**
-** Abstract: Monitor the child (shell) process
-*/
+ * 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");
+ telnetd_printf("Monitor thread running...\n");
WaitForSingleObject(client->hProcess, INFINITE);
GetExitCodeProcess(client->hProcess, &exitCode);
- printf("Child process terminated with code %lx\n", exitCode);
+ telnetd_printf("Child process terminated with code %lx\n", exitCode);
/* signal the other threads to give up */
client->bTerminate = TRUE;
@@ -466,25 +462,25 @@
closesocket(client->socket);
- printf("Waiting for all threads to give up..\n");
+ telnetd_printf("Waiting for all threads to give up..\n");
while (client->bWriteToPipe || client->bReadFromPipe) {
- printf(".");
+ telnetd_printf(".");
fflush(stdout);
Sleep(1000);
}
- printf("Cleanup for user '%s'\n", client->userID);
+ telnetd_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.
-*/
+ * 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;
@@ -495,39 +491,38 @@
while (!client->bTerminate) {
iRead = ReceiveLine(client->socket, chBuf, BUFSIZE, FALSE);
if (iRead < 0) {
- printf("Client disconnect\n");
+ telnetd_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");
+ telnetd_printf("error writing to socket\n");
break;
}
if (! WriteFile(client->hChildStdinWr, chBuf, (DWORD) iRead, &dwWritten,
NULL)) {
- printf("Error writing to pipe\n");
+ telnetd_printf("Error writing to pipe\n");
break;
}
}
}
- if (!client->bTerminate) {
+ if (!client->bTerminate)
TerminateShell(client);
- }
-
- printf("WriteToPipeThread terminated\n");
+
+ telnetd_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.
-*/
+ * 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;
@@ -542,13 +537,13 @@
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");
+ telnetd_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");
+ telnetd_printf("Failed to read from pipe\n");
break;
}
for (from=0, to=0; from<dwRead; from++, to++) {
@@ -560,26 +555,23 @@
}
}
if (send(client->socket, txBuf, to, 0) < 0) {
- printf("error writing to socket\n");
+ telnetd_printf("error writing to socket\n");
break;
}
}
Sleep(100); /* Hmmm, oh well... what the heck! */
}
- if (!client->bTerminate) {
+ if (!client->bTerminate)
TerminateShell(client);
- }
-
- printf("ReadFromPipeThread terminated\n");
+
+ telnetd_printf("ReadFromPipeThread terminated\n");
client->bReadFromPipe = FALSE;
return 0;
}
-/*
-** TerminateShell
-*/
+/* TerminateShell */
static void TerminateShell(client_t *client)
{
DWORD exitCode;
@@ -588,42 +580,37 @@
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");
- }
+ telnetd_printf("user shell still active, send Ctrl-Break to group-id
%lu\n", client->dwProcessId );
+
+ if (!GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT, client->dwProcessId ))
+ telnetd_printf("Failed to send Ctrl_break\n");
Sleep(500);
- if (!GenerateConsoleCtrlEvent( CTRL_C_EVENT, client->dwProcessId )) {
- printf("Failed to send Ctrl_C\n");
- }
+ if (!GenerateConsoleCtrlEvent( CTRL_C_EVENT, client->dwProcessId ))
+ telnetd_printf("Failed to send Ctrl_C\n");
Sleep(500);
- if (! WriteFile(client->hChildStdinWr, stop, sizeof(stop), &dwWritten, NULL))
{
- printf("Error writing to pipe\n");
- }
+ if (!WriteFile(client->hChildStdinWr, stop, sizeof(stop), &dwWritten, NULL))
+ telnetd_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");
+ telnetd_printf("user shell still active, attempt to terminate it
now...\n");
TerminateProcess(client->hProcess, 0);
}
}
}
-/*
-** ErrorExit
-*/
+/* ErrorExit */
static VOID ErrorExit (LPTSTR lpszMessage)
{
fprintf(stderr, "%s\n", lpszMessage);
if (bSocketInterfaceInitialised) {
- printf("WSAGetLastError=%d\n", WSAGetLastError());
+ telnetd_printf("WSAGetLastError=%d\n", WSAGetLastError());
WSACleanup();
}
ExitProcess(0);