aboutsummaryrefslogtreecommitdiff
path: root/src/report.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-04-29 18:11:56 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2009-04-29 18:11:56 +0300
commit5a1f674eecba607ffa328484ca34c598690ff8d2 (patch)
tree5dcda78e8352461d2ee7fdc29c64a265024cb219 /src/report.c
parent20d7f1d7e051c6b021a3f5d088985a74c3370b29 (diff)
downloadtagr-5a1f674eecba607ffa328484ca34c598690ff8d2.tar.gz
tagr-5a1f674eecba607ffa328484ca34c598690ff8d2.tar.bz2
Fix locking issues. Improve stream interface.
* gnulib.modules: Add c-type, c-strcase, crypto/md5, xgetdomainname, xgethostname. * src/Makefile.am (tagr_SOURCES): Add apop.c, udb.c, xhostname.c * src/graph.c (draw_graph): Rename `now' to `start'. * src/main.c (hostname, rebuild_last_option): New globals. (main): Init hostname. * src/output.c (update_output): Change semantics of the last parameter. * src/readconfig.c (cb_facility): Use c_strcasecmp. (tagr_kw): New keywords: hostname, udb-file, lock-count, lock-timeout, idle-timeout. * src/report.c: Fix locking issues. (update_monitor): Change semantics of the last parameter. (rebuild): Likewise. * src/server.c: Rewrite stream interface. * src/tagr.h (TAGR_ARG_UNUSED, TAGR_PRINTFLIKE): New macros. (lock_retry_count_option, lock_retry_timeout_option) (stream_idle_timeout, hostname): New declarations. (TAGR_UPD_FORCE, TAGR_UPD_LASTTIME): New defines. (trim_crlf, tagr_local_hostnamem tagr_auth_init, tagr_auth) (tagr_udb_name) (udb_get_passwordudb_free_password): New declarations. * TODO: Update
Diffstat (limited to 'src/report.c')
-rw-r--r--src/report.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/report.c b/src/report.c
index 71a735f..ab4cada 100644
--- a/src/report.c
+++ b/src/report.c
@@ -30,31 +30,41 @@
#include <arpa/inet.h>
#include <tagr.h>
#include <report.h>
#include <fprintftime.h>
#include <gdbm.h>
+unsigned lock_retry_count_option = 5;
+unsigned lock_retry_timeout_option = 1;
+
static char *dbname;
static GDBM_FILE dbf;
static void
tagr_db_report (char *str)
{
logmsg (L_CRIT, "%s: %s", dbname, str);
}
int
open_db (int flag)
{
- dbname = xmalloc (strlen (basedir) + 1 + sizeof (TAGR_DBNAME));
- strcpy (dbname, basedir);
- strcat (dbname, "/");
- strcat (dbname, TAGR_DBNAME);
+ unsigned i;
+
+ dbname = mkfilename (basedir, TAGR_DBNAME, NULL);
+
+ for (i = 0; i < lock_retry_count_option; i++)
+ {
dbf = gdbm_open (dbname, 0,
flag == TAGR_DB_WR ? GDBM_WRCREAT : GDBM_READER,
TAGR_DBMODE, tagr_db_report);
+ if (dbf || errno != EAGAIN)
+ break;
+ sleep (lock_retry_timeout_option);
+ }
+
if (dbf == NULL)
{
logmsg (L_ERR, _("cannot open database %s: %s"),
dbname, gdbm_strerror (gdbm_errno));
return 1;
}
@@ -248,13 +258,13 @@ report (Stat *stat, time_t timestamp)
}
else
logmsg (L_WARNING, _("%s not found in config"), stat->name);
}
int
-update_monitor (datum key, time_t timestamp, int force)
+update_monitor (datum key, time_t timestamp, int flags)
{
char id[MAX_NAME_LENGTH+1];
struct traffic_record *tr = NULL;
struct monitor *mon;
if (key.dsize > MAX_NAME_LENGTH)
@@ -270,35 +280,34 @@ update_monitor (datum key, time_t timestamp, int force)
logmsg (L_ERR, _("%s: no such monitor"), id);
return 1;
}
_read_db (key, &tr);
if (tr)
{
- update_output (mon, tr, tr->last.time /*FIXME: must be now? */,
- force);
+ update_output (mon, tr, timestamp, flags);
free (tr);
}
return 0;
}
void
-rebuild (int force)
+rebuild (int flags)
{
datum key;
datum content;
time_t now = time (NULL);
verbose (1, _("rebuild initiated"));
if (open_db (TAGR_DB_RD) == 0)
{
key = gdbm_firstkey (dbf);
while (key.dptr)
{
datum nextkey = gdbm_nextkey (dbf, key);
- update_monitor (key, now, force);
+ update_monitor (key, now, flags);
free (key.dptr);
key = nextkey;
}
close_db ();
}
verbose (1, _("rebuild finished"));

Return to:

Send suggestions and report system problems to the System administrator.