Only in freeze4-exp/trunk/: .deps Only in freeze4-exp/trunk/: .in Common subdirectories: trunk/.svn and freeze4-exp/trunk/.svn Only in freeze4-exp/trunk/: Makefile Only in freeze4-exp/trunk/: Makefile.in Only in freeze4-exp/trunk/: aclocal.m4 Only in freeze4-exp/trunk/: action.o Only in freeze4-exp/trunk/: build-stamp Only in freeze4-exp/trunk/: cfgfile_parser.c Only in freeze4-exp/trunk/: cfgfile_parser.h Only in freeze4-exp/trunk/: cfgfile_parser.o diff -u trunk/cfgfile_parser.y freeze4-exp/trunk/cfgfile_parser.y --- trunk/cfgfile_parser.y 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/cfgfile_parser.y 2008-10-22 16:36:04.000000000 +0200 @@ -33,6 +33,7 @@ int csync_ignore_uid = 0; int csync_ignore_gid = 0; int csync_ignore_mod = 0; +char *csync_tempdir = NULL; #ifdef __CYGWIN__ int csync_lowercyg_disable = 0; @@ -304,6 +305,11 @@ csync_group->action->do_local = 1; } +static void set_tempdir(const char *tempdir) +{ + csync_tempdir=strdup(tempdir); +} + static void new_prefix(const char *pname) { struct csync_prefix *p = @@ -396,6 +402,7 @@ %token TK_ACTION TK_PATTERN TK_EXEC TK_DOLOCAL TK_LOGFILE TK_NOCYGLOWER %token TK_PREFIX TK_ON TK_COLON TK_POPEN TK_PCLOSE %token TK_BAK_DIR TK_BAK_GEN +%token TK_TEMPDIR %token TK_STRING %% @@ -413,6 +420,8 @@ { } | TK_NOSSL TK_STRING TK_STRING TK_STEND { new_nossl($2, $3); } +| TK_TEMPDIR TK_STRING TK_STEND + { set_tempdir($2); } | TK_IGNORE ignore_list TK_STEND | TK_NOCYGLOWER TK_STEND { disable_cygwin_lowercase_hack(); } Only in freeze4-exp/trunk/: cfgfile_scanner.c diff -u trunk/cfgfile_scanner.l freeze4-exp/trunk/cfgfile_scanner.l --- trunk/cfgfile_scanner.l 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/cfgfile_scanner.l 2008-10-22 16:35:36.000000000 +0200 @@ -60,6 +60,7 @@ "prefix" { return TK_PREFIX; } "on" { return TK_ON; } +"tempdir" { return TK_TEMPDIR; } "backup-directory" { return TK_BAK_DIR; } "backup-generations" { return TK_BAK_GEN; } Only in freeze4-exp/trunk/: cfgfile_scanner.o diff -u trunk/check.c freeze4-exp/trunk/check.c --- trunk/check.c 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/check.c 2008-10-22 11:12:02.000000000 +0200 @@ -150,8 +150,8 @@ if ( !strcmp(file, "/") ) asprintf(&where_rec, "or 1"); else - asprintf(&where_rec, "or (filename > '%s/' " - "and filename < '%s0')", + asprintf(&where_rec, "UNION ALL SELECT filename from file where filename > '%s/' " + "and filename < '%s0'", url_encode(file), url_encode(file)); } Only in freeze4-exp/trunk/: check.o Only in freeze4-exp/trunk/: checktxt.o Only in freeze4-exp/trunk/: config.h Only in freeze4-exp/trunk/: config.h.in Only in freeze4-exp/trunk/: config.log Only in freeze4-exp/trunk/: config.status Only in freeze4-exp/trunk/: configure Only in freeze4-exp/trunk/: configure-stamp Only in freeze4-exp/trunk/: conn.o Only in freeze4-exp/trunk/: csync2 diff -u trunk/csync2.c freeze4-exp/trunk/csync2.c --- trunk/csync2.c 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/csync2.c 2008-10-22 14:10:01.000000000 +0200 @@ -62,6 +62,7 @@ int csync_timestamps = 0; int csync_new_force = 0; int csync_port = 30865; +int csync_limit_work = 0; int csync_dump_dir_fd = -1; @@ -171,6 +172,9 @@ "\n" " -t Print timestamps to debug output (e.g. for profiling).\n" "\n" +" -l count\n" +" Limit work to count database entries.\n" +"\n" " -s filename\n" " Print timestamps also to this file.\n" "\n" @@ -293,7 +297,7 @@ return 1; } - while ( (opt = getopt(argc, argv, "W:s:Ftp:G:P:C:D:N:HBAIXULSTMRvhcuoimfxrd")) != -1 ) { + while ( (opt = getopt(argc, argv, "l:W:s:Ftp:G:P:C:D:N:HBAIXULSTMRvhcuoimfxrd")) != -1 ) { switch (opt) { case 'W': csync_dump_dir_fd = atoi(optarg); @@ -316,6 +320,9 @@ case 'p': csync_port = atoi(optarg); break; + case 'l': + csync_limit_work = atoi(optarg); + break; case 'G': active_grouplist = optarg; break; @@ -585,8 +592,12 @@ case MODE_CHECK_AND_UPDATE: if ( argc == optind ) { + char *limit_work=""; + if(csync_limit_work) { + asprintf(&limit_work," LIMIT %d",csync_limit_work); + } SQL_BEGIN("Check all hints", - "SELECT filename, recursive FROM hint") + "SELECT filename, recursive FROM hint%s",limit_work) { textlist_add(&tl, url_decode(SQL_V(0)), atoi(SQL_V(1))); @@ -648,8 +659,10 @@ case MODE_MARK: for (i=optind; i < argc; i++) { char *realname = getrealfn(argv[i]); + char *pfname; csync_check_usefullness(realname, recursive); - csync_mark(realname, 0, 0); + pfname=strdup(prefixencode(realname)); + csync_mark(pfname, 0, 0); if ( recursive ) { char *where_rec = ""; @@ -657,19 +670,20 @@ if ( !strcmp(realname, "/") ) asprintf(&where_rec, "or 1"); else - asprintf(&where_rec, "or (filename > '%s/' " - "and filename < '%s0')", - url_encode(realname), url_encode(realname)); + asprintf(&where_rec, "UNION ALL SELECT filename from file where filename > '%s/' " + "and filename < '%s0'", + url_encode(pfname), url_encode(pfname)); SQL_BEGIN("Adding dirty entries recursively", "SELECT filename FROM file WHERE filename = '%s' %s", - url_encode(realname), where_rec) + url_encode(pfname), where_rec) { - char *filename = strdup(url_encode(SQL_V(0))); + char *filename = strdup(url_decode(SQL_V(0))); csync_mark(filename, 0, 0); free(filename); } SQL_END; } + free(pfname); } break; @@ -682,8 +696,8 @@ if ( !strcmp(realname, "/") ) asprintf(&where_rec, "or 1"); else - asprintf(&where_rec, "or (filename > '%s/' " - "and filename < '%s0')", + asprintf(&where_rec, "UNION ALL SELECT filename from file where filename > '%s/' " + "and filename < '%s0'", url_encode(realname), url_encode(realname)); } diff -u trunk/csync2.h freeze4-exp/trunk/csync2.h --- trunk/csync2.h 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/csync2.h 2009-01-21 18:01:16.000000000 +0100 @@ -82,7 +82,6 @@ /* db.c */ - extern void csync_db_open(const char *file); extern void csync_db_close(); @@ -196,6 +195,7 @@ /* another ringbuffer here. so use it with care!! */ const char *prefixsubst(const char *in); +const char *prefixencode(const char *filename); /* textlist implementation */ @@ -327,6 +327,8 @@ extern struct csync_prefix *csync_prefix; extern struct csync_nossl *csync_nossl; +extern char *csync_tempdir; + extern int csync_error_count; extern int csync_debug_level; extern FILE *csync_debug_out; @@ -340,6 +342,8 @@ extern int csync_new_force; extern int csync_port; +extern int csync_limit_work; + extern char myhostname[]; extern char *active_grouplist; extern char *active_peerlist; Only in freeze4-exp/trunk/: csync2.o Common subdirectories: trunk/cygwin and freeze4-exp/trunk/cygwin Only in freeze4-exp/trunk/: daemon.o diff -u trunk/db.c freeze4-exp/trunk/db.c --- trunk/db.c 2008-08-13 13:06:54.000000000 +0200 +++ freeze4-exp/trunk/db.c 2009-01-21 20:03:43.000000000 +0100 @@ -51,7 +51,7 @@ static int get_dblock_timeout() { - return getpid() % 7 + 12; + return getpid() % 7 + 12 + 3600; } @@ -140,11 +140,34 @@ return; } +void csync_create_db(const char *file, const char *query) { + IFESQL3(sqlite3,sqlite) *mydb = 0; + IFSQL3(int r;) + struct stat buf; + if(stat(file,&buf)==-1) { + IFESQL3(r=sqlite3_open(file, &mydb);, mydb = sqlite_open(file, 0, 0);) + if(mydb) { + in_sql_query++; + SQL_EXEC(mydb,query,0,0,0); + IFESQL3(sqlite3_close,sqlite_close)(mydb); + in_sql_query--; + } else { + csync_fatal("Can't open database: %s\n", file); + } + } +} +void csync_attach_db(const char *file, const char *name) { + char *query; + asprintf(&query,"ATTACH DATABASE \"%s\" as %s",file,name); + SQL_EXEC(db,query,0,0,0); +} void csync_db_open(const char *file) { + char *dbname; IFSQL3(int r;) - IFESQL3(r=sqlite3_open(file, &db);, - db = sqlite_open(file, 0, 0);) + asprintf(&dbname,"%s%s",file,"-file"); + IFESQL3(r=sqlite3_open(dbname, &db);, + db = sqlite_open(dbname, 0, 0);) if ( db == 0 IFSQL3(||r)) csync_fatal("Can't open database: %s\n", file); @@ -156,30 +179,42 @@ " UNIQUE ( filename ) ON CONFLICT REPLACE" ")", 0, 0, 0); - SQL_EXEC(db, + free(dbname); + if (!db_sync_mode) + SQL_EXEC(db, "PRAGMA synchronous = OFF", 0, 0, 0); + asprintf(&dbname,"%s%s",file,"-dirty"); + csync_create_db(dbname, "CREATE TABLE dirty (" " filename, force, myname, peername," " UNIQUE ( filename, peername ) ON CONFLICT IGNORE" - ")", - 0, 0, 0); - SQL_EXEC(db, + ")" + ); + csync_attach_db(dbname,"dirty"); + free(dbname); + asprintf(&dbname,"%s%s",file,"-hint"); + csync_create_db(dbname, "CREATE TABLE hint (" " filename, recursive," " UNIQUE ( filename, recursive ) ON CONFLICT IGNORE" - ")", - 0, 0, 0); - SQL_EXEC(db, + ")"); + csync_attach_db(dbname,"hint"); + free(dbname); + asprintf(&dbname,"%s%s",file,"-action"); + csync_create_db(dbname, "CREATE TABLE action (" " filename, command, logfile," " UNIQUE ( filename, command ) ON CONFLICT IGNORE" - ")", - 0, 0, 0); - SQL_EXEC(db, + ")"); + csync_attach_db(dbname,"action"); + free(dbname); + asprintf(&dbname,"%s%s",file,"-x509cert"); + csync_create_db(dbname, "CREATE TABLE x509_cert (" " peername, certdata," " UNIQUE ( peername ) ON CONFLICT IGNORE" - ")", - 0, 0, 0); + ")"); + csync_attach_db(dbname,"x509cert"); + free(dbname); if (!db_sync_mode) SQL_EXEC(db, "PRAGMA synchronous = OFF", 0, 0, 0); in_sql_query--; Only in freeze4-exp/trunk/: db.o Common subdirectories: trunk/debian and freeze4-exp/trunk/debian Only in freeze4-exp/trunk/: depcomp Common subdirectories: trunk/doc and freeze4-exp/trunk/doc Only in freeze4-exp/trunk/: error.o Only in freeze4-exp/trunk/: getrealfn.o Only in freeze4-exp/trunk/: groups.o Only in freeze4-exp/trunk/: install-sh Only in freeze4-exp/trunk/: missing Only in freeze4-exp/trunk/: mkinstalldirs diff -u trunk/prefixsubst.c freeze4-exp/trunk/prefixsubst.c --- trunk/prefixsubst.c 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/prefixsubst.c 2008-10-22 11:11:56.000000000 +0200 @@ -56,3 +56,35 @@ return 0; } +const char *prefixencode(const char *filename) { +#if __CYGWIN__ + if (!strcmp(filename, "/")) { + filename = "/cygdrive"; + } +#endif + struct csync_prefix *p = csync_prefix; + + /* + * Canonicalized paths will always contain / + * Prefixsubsted paths will probably contain % + */ + if (*filename == '/') + while (p) { + if (p->path) { + int p_len = strlen(p->path); + int f_len = strlen(filename); + + if (p_len <= f_len && !strncmp(p->path, filename, p_len) && + (filename[p_len] == '/' || !filename[p_len])) { + ringbuff_counter = (ringbuff_counter+1) % RINGBUFF_LEN; + if (ringbuff[ringbuff_counter]) + free(ringbuff[ringbuff_counter]); + asprintf(&ringbuff[ringbuff_counter], "%%%s%%%s", p->name, filename+p_len); + return ringbuff[ringbuff_counter]; + } + } + p = p->next; + } + return filename; +} + Only in freeze4-exp/trunk/: prefixsubst.o diff -u trunk/rsync.c freeze4-exp/trunk/rsync.c --- trunk/rsync.c 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/rsync.c 2008-10-22 14:40:55.000000000 +0200 @@ -25,10 +25,39 @@ #include #include +/* for tmpfile replacement: */ +#include +#include +#include + + #ifdef __CYGWIN__ #include #endif +#ifdef _SVID_SOURCE +static FILE *paranoid_tmpfile() +{ + char *name; + FILE *f; + int fd; + name=tempnam(csync_tempdir,"csync2"); + if(!name) { + csync_fatal("ERROR: tempnam() didn't return a valid filename!\n"); + } + f=NULL; + fd=open(name,O_CREAT|O_EXCL|O_RDWR,S_IWUSR|S_IRUSR); + if(fd>=0) { + f=fdopen(fd,"wb+"); + unlink(name); + } + if ( fd<0 || !f ) { + csync_fatal("ERROR: Could not open result from tempnam(%s)!\n",name); + } + free(name); + return f; +} +#else static FILE *paranoid_tmpfile() { FILE *f; @@ -41,6 +70,7 @@ return f; } +#endif void csync_send_file(FILE *in) { Only in freeze4-exp/trunk/: rsync.o Only in freeze4-exp/trunk/: stamp-h1 diff -u trunk/update.c freeze4-exp/trunk/update.c --- trunk/update.c 2008-06-20 13:52:03.000000000 +0200 +++ freeze4-exp/trunk/update.c 2008-10-22 13:47:20.000000000 +0200 @@ -540,10 +540,14 @@ struct textlist *tl_mod = 0, **last_tn=&tl; char *current_name = 0; struct stat st; + char *limit_work=""; + if(csync_limit_work) { + asprintf(&limit_work," LIMIT %d",csync_limit_work); + } SQL_BEGIN("Get files for host from dirty table", "SELECT filename, myname, force FROM dirty WHERE peername = '%s' " - "ORDER by filename ASC", url_encode(peername)) + "ORDER by filename ASC%s", url_encode(peername),limit_work) { const char *filename = url_decode(SQL_V(0)); int i, use_this = patnum == 0; Only in freeze4-exp/trunk/: update.o Only in freeze4-exp/trunk/: urlencode.o