1 // Copyright 2009 The Archiveopteryx Developers <info@aox.org>
2 
3 #include "scope.h"
4 #include "estring.h"
5 #include "migrator.h"
6 #include "allocator.h"
7 #include "configuration.h"
8 #include "logclient.h"
9 #include "eventloop.h"
10 #include "database.h"
11 #include "mailbox.h"
12 #include "entropy.h"
13 #include "flag.h"
14 #include "log.h"
15 #include "utf.h"
16 
17 #include <stdio.h>
18 #include <stdlib.h>
19 
20 
main(int ac,char ** av)21 int main( int ac, char ** av )
22 {
23     Scope global;
24     bool bad = false;
25 
26     if ( ac < 3 )
27         bad = true;
28 
29     Configuration::setup( "archiveopteryx.conf" );
30 
31     EventLoop::setup();
32     Log * l = new Log;
33     Allocator::addEternal( l, "aoximport log" );
34     global.setLog( l );
35     LogClient::setup( "aoximport" );
36 
37     Configuration::report();
38 
39     int i = 1;
40     while( i < ac && *av[i] == '-' ) {
41         uint j = 1;
42         while ( av[i][j] ) {
43             switch( av[i][j] ) {
44             case 'v':
45                 Migrator::setVerbosity( Migrator::verbosity() + 1 );
46                 break;
47             case 'q':
48                 Migrator::setVerbosity( 0 );
49                 break;
50             case 'e':
51                 Migrator::setErrorCopies( true );
52                 break;
53             default:
54                 bad = true;
55                 break;
56             }
57             j++;
58         }
59         i++;
60     }
61 
62     EString destination;
63     if ( i < ac )
64         destination = av[i++];
65     EString mode;
66     if ( i < ac )
67         mode = av[i++];
68     mode = mode.lower();
69     Migrator * m = 0;
70     if ( mode == "mbox" )
71         m = new Migrator( Migrator::Mbox );
72     else if ( mode == "mh" )
73         m = new Migrator( Migrator::Mh );
74     else if ( mode == "cyrus" )
75         m = new Migrator( Migrator::Cyrus );
76     else if ( mode == "maildir" )
77         m = new Migrator( Migrator::Maildir );
78     else
79         bad = true;
80     if ( m ) {
81         Allocator::addEternal( m, "migrator" );
82         Utf8Codec c;
83         m->setDestination( c.toUnicode( destination ) );
84         while ( i < ac )
85             m->addSource( av[i++] );
86     }
87 
88     if ( bad ) {
89         fprintf( stderr,
90                  "Usage: %s [-vq] "
91                  "<mailbox> <type> <source [, source ...]>\n"
92                  "See aoximport(8) for details.\n", av[0] );
93         exit( -1 );
94     }
95 
96     Entropy::setup();
97     Database::setup();
98     Mailbox::setup( m );
99 
100     Flag::setup();
101 
102     uint limit = Configuration::scalar( Configuration::MemoryLimit );
103     if ( !limit )
104         limit = 128;
105     EventLoop::global()->setMemoryUsage( 1024 * 1024 * limit );
106 
107     EventLoop::global()->start();
108 
109     return Log::disastersYet() ? 1 : 0;
110 }
111