2002-03-07 21:58:33 +03:00
/*
Unix SMB / CIFS implementation .
low level tdb backup and restore utility
Copyright ( C ) Andrew Tridgell 2002
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 0213 9 , USA .
*/
2002-03-09 03:12:19 +03:00
/*
This program is meant for backup / restore of tdb databases . Typical usage would be :
2002-03-10 04:46:56 +03:00
tdbbackup * . tdb
2002-03-09 03:12:19 +03:00
when Samba shuts down cleanly , which will make a backup of all the local databases
to * . bak files . Then on Samba startup you would use :
2002-03-10 04:46:56 +03:00
tdbbackup - v * . tdb
2002-03-09 03:12:19 +03:00
and this will check the databases for corruption and if corruption is detected then
the backup will be restored .
You may also like to do a backup on a regular basis while Samba is
running , perhaps using cron .
The reason this program is needed is to cope with power failures
while Samba is running . A power failure could lead to database
corruption and Samba will then not start correctly .
Note that many of the databases in Samba are transient and thus
don ' t need to be backed up , so you can optimise the above a little
by only running the backup on the critical databases .
*/
2003-10-02 22:22:51 +04:00
# ifdef STANDALONE
# if HAVE_CONFIG_H
# include <config.h>
# endif
2002-03-07 21:58:33 +03:00
# include <errno.h>
# include <stdlib.h>
# include <stdio.h>
# include <fcntl.h>
# include <unistd.h>
# include <string.h>
# include <fcntl.h>
# include <time.h>
# include <sys/mman.h>
# include <sys/stat.h>
# include <sys/time.h>
# include <ctype.h>
2002-09-25 19:19:00 +04:00
# include <signal.h>
2003-10-02 22:22:51 +04:00
# else
# include "includes.h"
# endif
2002-03-07 21:58:33 +03:00
# include "tdb.h"
2003-06-24 18:02:21 +04:00
# include "tdbback.h"
2002-03-08 21:14:35 +03:00
2002-07-15 14:35:28 +04:00
/*
see if one file is newer than another
*/
static int file_newer ( const char * fname1 , const char * fname2 )
{
struct stat st1 , st2 ;
if ( stat ( fname1 , & st1 ) ! = 0 ) {
return 0 ;
}
if ( stat ( fname2 , & st2 ) ! = 0 ) {
return 1 ;
}
return ( st1 . st_mtime > st2 . st_mtime ) ;
}
2002-03-08 21:14:35 +03:00
static void usage ( void )
{
printf ( " Usage: tdbbackup [options] <fname...> \n \n " ) ;
printf ( " -h this help message \n " ) ;
printf ( " -s suffix set the backup suffix \n " ) ;
2003-06-12 11:32:44 +04:00
printf ( " -v verify mode (restore if corrupt) \n " ) ;
2002-03-08 21:14:35 +03:00
}
2002-03-07 21:58:33 +03:00
int main ( int argc , char * argv [ ] )
{
int i ;
int ret = 0 ;
2002-03-08 21:14:35 +03:00
int c ;
int verify = 0 ;
2003-06-12 11:54:13 +04:00
const char * suffix = " .bak " ;
2002-03-08 21:14:35 +03:00
extern int optind ;
extern char * optarg ;
while ( ( c = getopt ( argc , argv , " vhs: " ) ) ! = - 1 ) {
switch ( c ) {
case ' h ' :
usage ( ) ;
exit ( 0 ) ;
case ' v ' :
verify = 1 ;
break ;
case ' s ' :
suffix = optarg ;
break ;
}
}
2002-03-07 21:58:33 +03:00
2002-03-08 21:14:35 +03:00
argc - = optind ;
argv + = optind ;
if ( argc < 1 ) {
usage ( ) ;
2002-03-07 21:58:33 +03:00
exit ( 1 ) ;
}
2002-03-08 21:14:35 +03:00
for ( i = 0 ; i < argc ; i + + ) {
const char * fname = argv [ i ] ;
2002-03-10 11:30:15 +03:00
char * bak_name ;
2002-03-08 21:14:35 +03:00
2002-03-10 11:30:15 +03:00
bak_name = add_suffix ( fname , suffix ) ;
2002-03-08 21:14:35 +03:00
if ( verify ) {
if ( verify_tdb ( fname , bak_name ) ! = 0 ) {
ret = 1 ;
}
} else {
2002-07-15 14:35:28 +04:00
if ( file_newer ( fname , bak_name ) & &
backup_tdb ( fname , bak_name ) ! = 0 ) {
2002-03-08 21:14:35 +03:00
ret = 1 ;
}
}
free ( bak_name ) ;
2002-03-07 21:58:33 +03:00
}
return ret ;
}