/*
Copyright (C) 2005-2006 NFG Net Facilities Group BV, support@nfg.nl
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: user.c 1891 2005-10-03 10:01:21Z paul $
* This is the dbmail-user program
* It makes adding users easier
*
*
* - moving most code to dbmail-users.c. Just a thin wrapper left */
#include "dbmail.h"
char *configFile = DEFAULT_CONFIG_FILE;
#define PNAME "dbmail/export"
int quiet, reallyquiet, verbose;
extern db_param_t _db_params;
/* UI policy */
int do_showhelp(void) {
printf("*** dbmail-export ***\n");
printf("Use this program to export your DBMail mailboxes.\n");
printf(" -u username specify a user\n");
printf(" -m file specify a mailbox\n");
printf(" -o outfile specify the destination mbox (default ./user/mailbox)\n");
printf("\n");
printf("Summary of options for all modes:\n");
printf("\n");
printf("Common options for all DBMail utilities:\n");
printf(" -f file specify an alternative config file\n");
printf(" -q quietly skip interactive prompts\n"
" use twice to suppress error messages\n");
printf(" -v verbose details\n");
printf(" -V show the version\n");
printf(" -h show this help message\n");
return 0;
}
int main(int argc, char *argv[])
{
int opt = 0, opt_prev = 0;
int show_help = 0;
int result = 0;
char *user = NULL,*mailbox=NULL, *outfile=NULL;
FILE *ostream;
struct DbmailMailbox *mb = NULL;
u64_t useridnr = 0, mailbox_idnr = 0;
openlog(PNAME, LOG_PID, LOG_MAIL);
setvbuf(stdout, 0, _IONBF, 0);
g_mime_init(0);
/* get options */
opterr = 0; /* suppress error message from getopt() */
while ((opt = getopt(argc, argv,
"-u:m:o:" /* Major modes */
"f:qvVh" /* Common options */ )) != -1) {
/* The initial "-" of optstring allows unaccompanied
* options and reports them as the optarg to opt 1 (not '1') */
if (opt == 1)
opt = opt_prev;
opt_prev = opt;
switch (opt) {
/* Major modes of operation
* (exactly one of these is required) */
case 'u':
if (optarg && strlen(optarg))
user = optarg;
break;
case 'm':
if (optarg && strlen(optarg))
mailbox = optarg;
break;
case 'o':
if (optarg && strlen(optarg))
outfile = optarg;
break;
/* Common options */
case 'f':
if (optarg && strlen(optarg) > 0)
configFile = optarg;
else {
qerrorf("dbmail-mailbox: -f requires a filename\n\n");
result = 1;
}
break;
case 'h':
show_help = 1;
break;
case 'q':
/* If we get q twice, be really quiet! */
if (quiet)
reallyquiet = 1;
if (!verbose)
quiet = 1;
break;
case 'v':
if (!quiet)
verbose = 1;
break;
case 'V':
/* Show the version and return non-zero. */
printf("\n*** DBMAIL: dbmail-users version "
"$Revision: 1891 $ %s\n\n", COPYRIGHT);
result = 1;
break;
default:
/* printf("unrecognized option [%c], continuing...\n",optopt); */
break;
}
/* If there's a non-negative return code,
* it's time to free memory and bail out. */
if (result)
goto freeall;
}
/* If nothing is happening, show the help text. */
if (!user || !mailbox || show_help) {
do_showhelp();
result = 1;
goto freeall;
}
if (! outfile) {
GString *t = g_string_new("");
g_string_printf(t, "%s/%s", user, mailbox);
outfile=t->str;
g_string_free(t,FALSE);
}
/* read the config file */
if (config_read(configFile) == -1) {
qerrorf("Failed. Unable to read config file %s\n", configFile);
result = -1;
goto freeall;
}
SetTraceLevel("DBMAIL");
GetDBParams(&_db_params);
/* open database connection */
if (db_connect() != 0) {
qerrorf ("Failed. Could not connect to database (check log)\n");
result = -1;
goto freeall;
}
/* open authentication connection */
if (auth_connect() != 0) {
qerrorf("Failed. Could not connect to authentication (check log)\n");
result = -1;
goto freeall;
}
/* Verify the existence of this user */
if (auth_user_exists(user, &useridnr) == -1) {
qerrorf("Error: cannot verify existence of user [%s].\n", user);
result = -1;
goto freeall;
}
if (useridnr == 0) {
qerrorf("Error: user [%s] does not exist.\n", user);
result = -1;
goto freeall;
}
if (db_find_create_mailbox(mailbox, BOX_COMMANDLINE, useridnr, &mailbox_idnr) == -1) {
qerrorf("Error: cannot verify existence of mailbox [%s].\n", mailbox);
result = -1;
goto freeall;
}
qerrorf("exporting [%s/%s]\n", user, mailbox);
mb = dbmail_mailbox_new(mailbox_idnr);
if (! (ostream = fopen(outfile,"a"))) {
int err=errno;
qerrorf("opening [%s] failed [%s]", outfile, strerror(err));
result = -1;
goto freeall;
}
if (dbmail_mailbox_dump(mb,ostream) < 0)
qerrorf("exporing failed\n");
else
qerrorf("exporting finished\n");
/* Here's where we free memory and quit.
* Be sure that all of these are NULL safe! */
freeall:
if (mb)
dbmail_mailbox_free(mb);
db_disconnect();
auth_disconnect();
config_free();
g_mime_shutdown();
if (result < 0)
qerrorf("Command failed.\n");
return result;
}
syntax highlighted by Code2HTML, v. 0.9.1