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

TCP/IP协议栈

开发平台:

DOS

  1. /******************************************************************************
  2.     popdump.c - dump mail from popmail3 into spool subdirectory
  3.     Copyright (C) 1991 Erick Engelke
  4.     This program is free software; you can redistribute it and/or modify
  5.     it, but you may not sell it.
  6.     This program is distributed in the hope that it will be useful,
  7.     but without any warranty; without even the implied warranty of
  8.     merchantability or fitness for a particular purpose.
  9.         Erick Engelke                   or via E-Mail
  10.         Faculty of Engineering
  11.         University of Waterloo          Erick@development.watstar.uwaterloo.ca
  12.         200 University Ave.,
  13.         Waterloo, Ont., Canada
  14.         N2L 3G1
  15. ******************************************************************************/
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <dos.h>
  20. #include <tcp.h>
  21. #define POP3_PORT 110
  22. long localdiskspace( void )
  23. {
  24.     struct dfree d;
  25.     getdfree( 0, &d );
  26.     return( (longword) d.df_avail * (longword)d.df_bsec * (longword)d.df_sclus );
  27. }
  28. tcp_Socket popsock;
  29. char buffer[ 513 ];
  30. /* getnumbers - returns the count of numbers received */
  31. int getnumbers( char *ascii, long *d1, long *d2 )
  32. {
  33.     char *p;
  34.     /* it must return a number after the white space */
  35.     if (( p = strchr( ascii, ' ')) == NULL ) return( 0 );
  36.     /* skip space */
  37.     while ( *p == ' ') p++;
  38.     *d1 = atol( p );
  39.     if (( p = strchr( p, ' ')) == NULL ) return( 1 );
  40.     /* skip space */
  41.     while ( *p == ' ') p++;
  42.     *d2 = atol( p );
  43.     return( 2 );
  44. }
  45. int popdump( char *userid, char *password, longword host)
  46.     /*, char *hoststring, char *dumpfile)  /* 94.11.19 -- removed extra params */
  47. {
  48.     tcp_Socket *s;
  49.     int status;
  50. /*    int len;  */
  51. /*    char *p;  */
  52.     long process = 0, count, totallength, locallength, dummy;
  53. /*    FILE *f; */
  54.     s = &popsock;
  55.     if (!tcp_open( s, 0, host, POP3_PORT, NULL )) {
  56. puts("Sorry, unable to connect to that machine right now!");
  57. return (1);
  58.     }
  59.     printf("waiting...r");
  60.     sock_mode( s, TCP_MODE_ASCII );
  61.     sock_wait_established(s, sock_delay, NULL, &status);
  62.     sock_wait_input( s, sock_delay, NULL, &status );
  63.     sock_gets( s, buffer, sizeof( buffer ));
  64.     puts(buffer);
  65.     if ( *buffer != '+' ) goto quit;
  66.     sock_printf( s, "USER %s", userid);
  67.     sock_wait_input( s, sock_delay, NULL, &status );
  68.     sock_gets( s, buffer, sizeof( buffer ));
  69.     puts(buffer);
  70.     if ( *buffer != '+' ) goto quit;
  71.     sock_printf( s, "PASS %s", password );
  72.     sock_wait_input( s, sock_delay, NULL, &status );
  73.     sock_gets( s, buffer, sizeof( buffer ));
  74.     puts(buffer);
  75.     if ( *buffer != '+' ) goto quit;
  76.     sock_printf(s, "STAT");
  77.     printf("STATn");
  78.     sock_wait_input( s, sock_delay, NULL, &status );
  79.     sock_gets( s, buffer, sizeof( buffer ));
  80.     puts(buffer);
  81.     if ( *buffer != '+' ) goto quit;
  82.     /* it must return two valid numbers */
  83.     if ( getnumbers( buffer, &count, &totallength ) < 2 ) {
  84.         printf("protocol error on STATn");
  85.         goto quit;
  86.     }
  87.     printf("Attempting to download %lu messages (%lu bytes)n",
  88.         count, totallength );
  89.     while ( process++ < count ) {
  90.         printf("Getting file # %lun", process );
  91.         sock_printf( s, "LIST %lu", process );
  92.         sock_wait_input( s, sock_delay, NULL, &status );
  93.         sock_gets( s, buffer, sizeof( buffer ));
  94.         if ( getnumbers( buffer, &dummy, &locallength ) < 2 ) {
  95.             printf("protocol error on LIST %lun", process );
  96.             goto quit;
  97.         }
  98.         if ( localdiskspace() < locallength * 2 ) {
  99.             printf("Skipping file # %lu, too big for disk space availablen",
  100.                 process );
  101.             continue;
  102.         }
  103.         sock_printf( s, "RETR %lu", process );
  104.         sock_wait_input( s, sock_delay, NULL, &status );
  105.         sock_gets( s, buffer, sizeof( buffer ));
  106.         if (*buffer != '+' ) goto quit;
  107. /*
  108.         sprintf( buffer, "%s%s%lu.mai",
  109.             dumpfile, dumpfile ? "\":".\", index
  110.         if (( f = fopen( dumpfile , "wt" )) == NULL ) {
  111.             printf("Unable to open %sn", dumpfile );
  112.             return;
  113.         }
  114. */
  115.         do {
  116.             sock_wait_input( s, sock_delay, NULL, &status );
  117.             sock_gets( s, buffer, sizeof( buffer ));
  118.             puts( buffer );
  119.         } while ( buffer[0] != '.' || buffer[1] != 0 );
  120.         sock_printf(s,"DELE %lu", process );
  121.         sock_wait_input( s, sock_delay, NULL, &status );
  122.         sock_gets( s, buffer, sizeof( buffer ));
  123.         puts(buffer);
  124.         if ( *buffer != '+' ) goto quit;
  125.     }
  126. quit:
  127.     sock_puts(s,"QUIT");
  128.     sock_close( s );
  129.     sock_wait_closed( s, sock_delay, NULL, &status );
  130. sock_err:
  131.     switch (status) {
  132. case 1 : /* foreign host closed */
  133.  break;
  134. case -1: /* timeout */
  135.                  printf("ERROR: %sn", sockerr(s));
  136.  break;
  137.     }
  138.     printf("n");
  139.     return ( (status == -1) ? 2 : status );
  140. }
  141. int main(int argc, char **argv )
  142. {
  143.     char user[128], password[64], *server;
  144.     longword host;
  145.     int status;
  146.     if ( argc < 2 ) {
  147.         puts("popdump userid@server password");
  148.         exit(3);
  149.     }
  150.     sock_init();
  151.     strncpy( user, argv[1], sizeof(user)-1 );
  152.     user[ sizeof(user) -1 ] = 0;
  153.     strncpy( password, argv[2], sizeof(password)-1 );
  154.     password[ sizeof(password) -1 ] = 0;
  155.     if ( (server = strchr( user, '@' ))== NULL) {
  156.         printf("missing @server part of userid: %sn", user );
  157.         exit( 3 );
  158.     }
  159.     *server++ = 0;
  160.     if ( (host = resolve( server )) != 0uL ) {
  161.         status = popdump( user, password, host /*, server*/);
  162.     } else {
  163. printf("Could not resolve host '%s'n", server );
  164. exit( 3 );
  165.     }
  166.     exit( status );
  167.     return (0);  /* not reached */
  168. }