home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / wattcp.zip / POPDUMP.C < prev    next >
C/C++ Source or Header  |  1992-02-20  |  6KB  |  208 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 <string.h>
  25. #include <dos.h>
  26. #include <tcp.h>
  27.  
  28. #define POP3_PORT 110
  29.  
  30.  
  31. long localdiskspace()
  32. {
  33.     struct dfree d;
  34.     getdfree( 0, &d );
  35.  
  36.     return( (longword) d.df_avail * (longword)d.df_bsec * (longword)d.df_sclus );
  37. }
  38. tcp_Socket popsock;
  39. char buffer[ 513 ];
  40.  
  41. /* getnumbers - returns the count of numbers received */
  42. int getnumbers( char *ascii, long *d1, long *d2 )
  43. {
  44.     char *p;
  45.     /* it must return a number after the white space */
  46.     if (( p = strchr( ascii, ' ')) == NULL ) return( 0 );
  47.  
  48.     /* skip space */
  49.     while ( *p == ' ') p++;
  50.     *d1 = atol( p );
  51.  
  52.     if (( p = strchr( p, ' ')) == NULL ) return( 1 );
  53.  
  54.     /* skip space */
  55.     while ( *p == ' ') p++;
  56.     *d2 = atol( p );
  57.     return( 2 );
  58. }
  59.  
  60.  
  61. popdump(userid, password, host, hoststring, dumpfile)
  62. char *userid, *password, *hoststring, *dumpfile;
  63. longword host;
  64. {
  65.     tcp_Socket *s;
  66.     int status;
  67.     int len;
  68.     char *p;
  69.     long process = 0, count, totallength, locallength, dummy;
  70.     FILE *f;
  71.  
  72.     s = &popsock;
  73.     if (!tcp_open( s, 0, host, POP3_PORT, NULL )) {
  74.     puts("Sorry, unable to connect to that machine right now!");
  75.     return;
  76.     }
  77.  
  78.     printf("waiting...\r");
  79.  
  80.     sock_mode( s, TCP_MODE_ASCII );
  81.     sock_wait_established(s, sock_delay, NULL, &status);
  82.     sock_wait_input( s, sock_delay, NULL, &status );
  83.     sock_gets( s, buffer, sizeof( buffer ));
  84.     puts(buffer);
  85.     if ( *buffer != '+' ) goto quit;
  86.  
  87.     sock_printf( s, "USER %s", userid);
  88.     sock_wait_input( s, sock_delay, NULL, &status );
  89.     sock_gets( s, buffer, sizeof( buffer ));
  90.     puts(buffer);
  91.     if ( *buffer != '+' ) goto quit;
  92.  
  93.     sock_printf( s, "PASS %s", password );
  94.     sock_wait_input( s, sock_delay, NULL, &status );
  95.     sock_gets( s, buffer, sizeof( buffer ));
  96.     puts(buffer);
  97.     if ( *buffer != '+' ) goto quit;
  98.  
  99.     sock_printf(s, "STAT");
  100.     printf("STAT\n");
  101.     sock_wait_input( s, sock_delay, NULL, &status );
  102.     sock_gets( s, buffer, sizeof( buffer ));
  103.     puts(buffer);
  104.     if ( *buffer != '+' ) goto quit;
  105.  
  106.     /* it must return two valid numbers */
  107.     if ( getnumbers( buffer, &count, &totallength ) < 2 ) {
  108.         printf("protocol error on STAT\n");
  109.         goto quit;
  110.     }
  111.  
  112.     printf("Attempting to download %lu messages (%lu bytes)\n",
  113.         count, totallength );
  114.  
  115.     while ( process++ < count ) {
  116.         printf("Getting file # %lu\n", process );
  117.  
  118.         sock_printf( s, "LIST %lu", process );
  119.         sock_wait_input( s, sock_delay, NULL, &status );
  120.         sock_gets( s, buffer, sizeof( buffer ));
  121.         if ( getnumbers( buffer, &dummy, &locallength ) < 2 ) {
  122.             printf("protocol error on LIST %lu\n", process );
  123.             goto quit;
  124.         }
  125.  
  126.         if ( localdiskspace() < locallength * 2 ) {
  127.             printf("Skipping file # %lu, too big for disk space available\n",
  128.                 process );
  129.             continue;
  130.         }
  131.         sock_printf( s, "RETR %lu", process );
  132.         sock_wait_input( s, sock_delay, NULL, &status );
  133.         sock_gets( s, buffer, sizeof( buffer ));
  134.         if (*buffer != '+' ) goto quit;
  135.  
  136. /*
  137.         sprintf( buffer, "%s%s%lu.mai",
  138.             dumpfile, dumpfile ? "\\":".\\", index
  139.  
  140.         if (( f = fopen( dumpfile , "wt" )) == NULL ) {
  141.             printf("Unable to open %s\n", dumpfile );
  142.             return;
  143.         }
  144. */
  145.         do {
  146.             sock_wait_input( s, sock_delay, NULL, &status );
  147.             sock_gets( s, buffer, sizeof( buffer ));
  148.             puts( buffer );
  149.         } while ( buffer[0] != '.' || buffer[1] != 0 );
  150.         sock_printf(s,"DELE %lu", process );
  151.         sock_wait_input( s, sock_delay, NULL, &status );
  152.         sock_gets( s, buffer, sizeof( buffer ));
  153.         puts(buffer);
  154.         if ( *buffer != '+' ) goto quit;
  155.     }
  156. quit:
  157.     sock_puts(s,"QUIT");
  158.     sock_close( s );
  159.     sock_wait_closed( s, sock_delay, NULL, &status );
  160.  
  161. sock_err:
  162.     switch (status) {
  163.     case 1 : /* foreign host closed */
  164.          break;
  165.     case -1: /* timeout */
  166.                  printf("ERROR: %s\n", sockerr(s));
  167.          break;
  168.     }
  169.     printf("\n");
  170. }
  171.  
  172.  
  173. main(int argc, char **argv )
  174. {
  175.     char user[128], password[64], *server;
  176.     longword host;
  177.     int status;
  178.  
  179.  
  180.     if ( argc < 2 ) {
  181.         puts("popdump userid@server password");
  182.         exit(3 );
  183.     }
  184.  
  185.     dbuginit();
  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 )) {
  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. }
  207.  
  208.