void* csync_db_begin(const char *err, const char *fmt, ...) { db_stmt_p stmt = NULL; char *sql; va_list ap; int rc, busyc = 0; char *ppTail; va_start(ap, fmt); VASPRINTF(&sql, fmt, ap); va_end(ap); in_sql_query++; csync_db_maybegin(); csync_debug(2, "SQL: %s\n", sql); while (1) { rc = db_prepare_stmt(db, sql, &stmt, &ppTail); if ( rc != DB_BUSY ) break; if (busyc++ > get_dblock_timeout()) { db = 0; csync_fatal(DEADLOCK_MESSAGE); } csync_debug(2, "Database is busy, sleeping a sec.\n"); sleep(1); } if ( rc != DB_OK && err ) csync_fatal("Database Error: %s [%d]: %s on executing %s\n", err, rc, db_errmsg(db), sql); free(sql); return stmt; }
/* We use a weak function as a simple printf within the library that can be * overridden by however the outside executable wishes to do its logging. */ void __attribute__((weak)) logmsg(int __maybe_unused loglevel, const char *fmt, ...) { va_list ap; char *buf; va_start(ap, fmt); VASPRINTF(&buf, fmt, ap); va_end(ap); printf("%s\n", buf); free(buf); }
char *newstr(char *fmt,...) { va_list args; char *dynstr; size_t slen; if (!fmt) { fmt=""; // just in case they pass a null pointer } va_start(args,fmt); slen = VASPRINTF(&dynstr, fmt,args); va_end(args); if ( dynstr == (char *) NULL ) { fprintf(stderr,"#BLIB: Out of memory allocating string %s size %llu\n", fmt,(llu_t) slen); errno = ENOMEM; exit(errno); } return(dynstr); }
/* static void axfr_error(TASK *, const char *, ...) __attribute__ ((__noreturn__)); */ static void axfr_error(TASK *t, const char *fmt, ...) { va_list ap; char *msg = NULL; if (t) { task_output_info(t, NULL); } else { va_start(ap, fmt); VASPRINTF(&msg, fmt, ap); va_end(ap); Warnx("%s", msg); RELEASE(msg); } sockclose(t->fd); _exit(EXIT_FAILURE); /* NOTREACHED */ }