home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / CEREBRUM / WAT9609.ZIP / APPS / POPDUMP.C < prev    next >
Text File  |  1994-11-28  |  6KB  |  209 lines

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