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

操作系统开发

开发平台:

DOS

  1. /*
  2.  * Copyright (c) 1990, 1999 Erick Engelke
  3.  */
  4. #include <rtos.h>
  5. #include <net.h>
  6. #include <stdio.h>
  7. #include <ctype.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11. static void smtp_result( tcp_Socket *s, int val, char *msg )
  12. {
  13.     char buffer[ 8 ];
  14.     sprintf( buffer, "%u ", val );
  15.     sock_write( s, buffer, strlen( buffer ) );
  16.     sock_puts( s, msg );
  17. }
  18. static int test_cmd( char *buffer, char *cmd, char *arg )
  19. {
  20.     int res, len;
  21.     char ch;
  22.     len = strlen( cmd );
  23.     res = strnicmp( buffer, cmd, len );
  24.     /* copy data if we matched and data desired */
  25.     if (( res == 0 ) && cmd ) {
  26.         *buffer = 0;
  27.         buffer += len;
  28.         /* advance to start of argument */
  29.         do {
  30.             ch = *buffer++;
  31.             if ( ch == 0 ) return( res );
  32.         } while ( isspace( ch ));
  33.         /* skip openning < */
  34.         if ( ch == '<' ) ch = *buffer ++;
  35.         len = 0;
  36.         do {
  37.             if (   ( ++len > 79 )
  38.                 || ( ch == 0 )
  39.                 || ( ch == '>' )) break;
  40.             *arg++ = ch;
  41.             ch = *buffer ++;    /* get next */
  42.         } while ( 1 );
  43.         *arg = 0;
  44.     }
  45.     return( res );
  46. }
  47. #define SMTPPORT 25
  48. /*
  49.  * implement one smtp server
  50.  */
  51. void smtpdthread( DWORD ptr )
  52. {
  53.     tcp_Socket *s;
  54.     char buffer[ 256 ];
  55.     char from[ 128 ];
  56.     char to[ 128 ];
  57.     char subject[ 128 ];
  58.     void (*userproc)(char *from, char *to, char *subject);
  59.     userproc = (void *)ptr;
  60.     if ( userproc == NULL )
  61.         rt_halt( "smtpd passed user proc of NULL");
  62.     s = kcalloc( sizeof( tcp_Socket ), 1 );
  63.     do {
  64.         /* start listenning */
  65.         tcp_listen( s, SMTPPORT, 0, 0, NULL, 0 );
  66.         /* wait for a connection */
  67.         do {
  68.             rt_sleep( 100 );    /* just waiting */
  69.             if ( tcp_tick( s ) == NULL ) goto reopen;
  70.         } while ( ! sock_established( s ));
  71.         *from = 0;
  72.         *to = 0;
  73.         *subject = 0;
  74.         sock_mode( s, TCP_MODE_ASCII );
  75.         smtp_result( s, 220, "sendmail ready for a message");
  76.         /* get each line of input text */
  77.         do {
  78.             while ( ! sock_dataready( s )) {
  79.                 rt_sleep(0);
  80.                 if ( tcp_tick( s ) == NULL ) break;
  81.             }
  82.             sock_gets( s, buffer, sizeof( buffer ));
  83.             rip( buffer );   /* remove CR/LF */
  84.             if ( ! test_cmd( buffer, "helo", NULL))
  85.                 smtp_result( s, 250, "hello");
  86.             else if ( ! test_cmd( buffer, "mail from:", from ))
  87.                 smtp_result( s, 250, "sender ok");
  88.             else if ( ! test_cmd( buffer, "rcpt to:", to ))
  89.                 smtp_result( s, 250, "recipient ok");
  90.             else if ( ! test_cmd( buffer, "data", NULL )) {
  91.                 smtp_result( s, 354, "ok send the data");
  92.                 do {
  93.                     while ( ! sock_dataready( s )) {
  94.                         rt_yield();
  95.                         if ( tcp_tick( s ) == NULL ) goto reopen;
  96.                     }
  97.                     sock_gets( s, buffer, sizeof( buffer ));
  98.                     /* look for first subject line */
  99.                     if ( *subject == 0 )
  100.                         test_cmd( buffer, "subject:", subject );
  101.                     rip( buffer );
  102.                 } while ( stricmp( buffer, "." ));
  103.                 smtp_result( s, 250, "message accepted");
  104.                 /* prepare output */
  105.                 (*userproc)( from, to, subject  );
  106.                 *to = *from = *subject = 0;
  107.             }
  108.             else if ( ! test_cmd( buffer, "quit", NULL )) {
  109.                 smtp_result( s, 221, "closing connection");
  110.                 break;
  111.             }
  112.             else smtp_result( s, 500, "command not recognized");
  113.         } while ( 1 );
  114. reopen:
  115.         sock_close( s );
  116.         /*
  117.          * and wait for it to close
  118.          */
  119.         while ( tcp_tick( s ) )
  120.             rt_sleep( 100 );
  121.         /* now we are unthreaded, start whole process again */
  122.     } while ( 1 );
  123. }