TERMSERV.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:6k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * modem - more advanced terminal server
  3.  *       - allows multiple TELNETs in and connect to COMn
  4.  *       - tcp.cfg file must define COM ports with irqs,speeds
  5.  *          eg. com1=4,9600
  6.  */
  7. #include <dos.h>
  8. #include <stdio.h>
  9. #include <rtos.h>
  10. #include <sio.h>
  11. #include <string.h>
  12. #include <mem.h>
  13. #include <telnetd.h>
  14. #include <ftpd.h>
  15. #include <httpd.h>
  16. #include <smtpcli.h>
  17. #include <process.h>
  18. #include <inifile.h>
  19. #include <syslog.h>
  20. #include "webpart.h"
  21. #define MAXCOM 4+1
  22. WORD far *bases = 0x400L;
  23. DWORD speeds[ MAXCOM ] = { 0, 0, 0, 0, 0};
  24. int irqs[ MAXCOM ];
  25. WORD inuse[ MAXCOM ] = { 0,0,0,0,0};
  26. static void (*old_init)(char *name, char *value);
  27. char *emailuserid = NULL;
  28. DWORD sysloghost = 0;
  29. char *syslogname = NULL;
  30. DWORD bytes = 0;
  31. #define EMAILNOTIFY "email.notify"
  32. #define SYSLOGHOST "syslog.host"
  33. char *loginuserid = NULL;
  34. char *loginpassword = NULL;
  35. /********************************************************************/
  36. void init_vars(void)
  37. {
  38.     char *s = "comx";
  39.     char *p;
  40.     int i;
  41.     DWORD speed;
  42.     /* initialize COM ports */
  43.     for ( i = 1 ; i <= 4 ; ++i ) {
  44.         s[3] = '0'+i;
  45.         speeds[i] = GetIniDWORD( "TCP.CFG", s, "speed", 0 );
  46.         irqs[i]   = GetIniDWORD( "TCP.CFG", s, "irq"  , 0 );
  47.     }
  48.     p = GetIniString( "TCP.CFG", "settings", EMAILNOTIFY, "");
  49.     if ( *p ) {
  50.         emailuserid = p;
  51.         cprintf("Configured email userid to %s.rn", emailuserid );
  52.     } else {
  53.         emailuserid = NULL;
  54.         kfree( p );
  55.         cprintf("No email userid set.rn");
  56.     }
  57.     p = GetIniString( "TCP.CFG", "settings", SYSLOGHOST, "");
  58.     if ( *p ) {
  59.         sysloghost = p;
  60.         cprintf("Configured syslogging to %s.rn", sysloghost);
  61.     } else {
  62.         sysloghost = NULL;
  63.         kfree( p );
  64.         cprintf("No syslogging configured.rn");
  65.     }
  66.     p = GetIniString( "TCP.CFG","settings","userid","");
  67.     if ( *p ) {
  68.         loginuserid = p;
  69.     } else {
  70.         kfree( p );
  71.         cprintf("No Web login userid specifiedrn");
  72.     }
  73.     p = GetIniString("TCP.CFG","settings","password","");
  74.     if ( *p ) {
  75.         loginpassword = p;
  76.     } else
  77.         kfree( p );
  78. }
  79. /********************************************************************/
  80. void teld_write_string( void *t, char *s )
  81. {
  82.     teld_write( t, s, strlen(s) );
  83.     bytes += strlen( s );
  84. }
  85. /********************************************************************/
  86. /* modem_server - one thread per com port
  87.  */
  88. void modem_server( DWORD comport )
  89. {
  90. #define CBUFSIZ 128
  91.     BYTE ch;
  92.     BYTE buffer[ CBUFSIZ ];
  93.     teld_str *t;
  94.     int i;
  95.     do {
  96.         inuse[ comport ] = 0;
  97.         cprintf("Listenning... com%urn", comport);
  98.         t = teld_listen( 0 );
  99.         cprintf("connection arrived... assigned to com%urn", comport);
  100.         /* if syslog enabled, notify log of change */
  101.         if ( sysloghost )
  102.             syslog( sysloghost, LOG_DAEMON, LOG_ERR, "connection arrived");
  103.         inuse[ comport ] = 1;
  104.         teld_write_string( t, "DEMO TERMSERVrnCopyright (c) 1990, 1999 Erick Engelkern");
  105.         rt_sleep( 1000 );
  106.         do {
  107.             /* way to break out */
  108.             if ( kbhit() ) exit( 0 );
  109.             /* look for TELNET arriving chars */
  110.             ch = teld_getc( t );
  111.             if ( ch == 255 ) break;
  112.             if ( ch != 0 ) {
  113.                 sio_writebyte( comport, ch );
  114.                 bytes++;
  115.             }
  116.             /* look for serial chars coming in, group them for speed */
  117.             for ( i = 0 ; i < BUFSIZ ; ++i ) {
  118.                 if ( sio_recv_waiting( comport ) ) {
  119.                     ch = sio_readbyte( comport );
  120.                     buffer[ i ] = ch;
  121.                     bytes++;
  122.                 } else break;
  123.             }
  124.             if ( i == CBUFSIZ ) i--;
  125.             if ( i != 0 ) {
  126.                 teld_write( t, buffer, i );
  127.                 bytes += i;
  128.             }
  129.             rt_yield();
  130.         } while ( 1 );
  131.         teld_close( t );
  132.         cprintf("Connection closed... com%urn", comport);
  133.         /* if syslog enabled, notify log of change */
  134.         if ( sysloghost )
  135.             syslog( sysloghost, LOG_DAEMON, LOG_ERR, "connection closed");
  136.     } while ( 1 );
  137. }
  138. /********************************************************************/
  139. /* main - setup everything then wait for a keystroke
  140.  */
  141. #pragma argsused
  142. void main(int argc, char **argv )
  143. {
  144.     int temp;
  145.     DWORD dummy;
  146.     rt_init( 100 );
  147.     cputs("TERMSERV 1.1rn");
  148.     cputs("Copyright (c) 1990, 1999 Erick Engelkern");
  149.     sock_init();
  150.     init_vars();
  151.     kdebug = 1;
  152.     cputs("Press any key to exitrn");
  153.     rt_newthread( ftpdthread, 1,2048, 0, "ftpd" );
  154.     for ( temp = 1 ; temp < 4 ; ++temp ) {
  155.         if ( speeds[temp] != 0 ) {
  156.             sio_init( temp, bases[temp-1], irqs[temp], 4096, 4096, NULL, 0 );
  157.             sio_setup( temp, speeds[temp], 8, 0, 1, 1 );
  158.             cprintf("Initializing port COM%u: base=0x%x irq=%u speed=%lurn",
  159.                 temp, bases[temp-1], irqs[temp], speeds[temp]);
  160.             rt_newthread( &modem_server, temp, 4096, 0, "modem thread");
  161.         }
  162.     }
  163. #define MAXHTTPD 5
  164.     rt_newthread( collector, 1,2048, 0, "collector" );
  165.     for ( temp = 0 ; temp < MAXHTTPD; ++temp )
  166.         rt_newthread( httpdthread, (DWORD)&user_proc, 2048, 0, "httpd worker" );
  167.     if ( emailuserid != NULL ) {
  168.         cprintf("Sending Email notification to %srn", emailuserid );
  169.         smtp_client( 0, "thisbox", emailuserid, "AUTOSEND: TermServer restarted",
  170.             "The terminal server has restarted");
  171.     }
  172.     /* if syslog enabled, notify log of change */
  173.     if ( sysloghost )
  174.         syslog( sysloghost, LOG_DAEMON, LOG_ERR, "termserver started");
  175.     while ( 1 ) {
  176.         if ( kbhit() ) break;
  177.         rt_sleep( 250 );
  178.     }
  179.     /* let SIO automatically release all the interrupts */
  180. }