Add:Core:Improved logfile handling
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 22 May 2008 20:02:56 +0000 (20:02 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 22 May 2008 20:02:56 +0000 (20:02 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@1075 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/attr_def.h
navit/navit/file.c
navit/navit/log.c

index f9c0255..4d79c73 100644 (file)
@@ -54,6 +54,8 @@ ATTR(menubar)
 ATTR(statusbar)
 ATTR(toolbar)
 ATTR(animate)
+ATTR(lazy)
+ATTR(mkdir)
 ATTR2(0x0002ffff,type_int_end)
 ATTR2(0x00030000,type_string_begin)
 ATTR(type)
index db157d7..518dedc 100644 (file)
@@ -47,6 +47,41 @@ file_create(char *name)
        return file;
 }
 
+int file_is_dir(char *name)
+{
+       struct stat buf;
+       if (! stat(name, &buf)) {
+               return S_ISDIR(buf.st_mode);
+       }
+       return 0;
+
+}
+
+int file_mkdir(char *name, int pflag)
+{
+       char buffer[strlen(name)+1];
+       int ret;
+       char *curr, *next;
+       dbg(1,"enter %s %d\n",name,pflag);
+       if (!pflag) {
+               if (file_is_dir(name))
+                       return 0;
+               return mkdir(name, 0777);
+       }
+       strcpy(buffer, name);
+       next=buffer;
+       while (next=strchr(next, '/')) {
+               *next='\0';
+               ret=file_mkdir(buffer, 0);
+               if (ret)
+                       return ret;
+               *next++='/';
+       }
+       if (pflag == 1)
+               return mkdir(buffer, 0);
+       return 0;
+}
+
 int
 file_mmap(struct file *file)
 {
index 03d7f59..f1a75c7 100644 (file)
@@ -21,6 +21,8 @@ struct log {
        FILE *f;
        int overwrite;
        int empty;
+       int lazy;
+       int mkdir;
        int flush_size;
        int flush_time;
        guint timer;
@@ -71,17 +73,24 @@ log_open(struct log *this_)
                mode="w";
        else
                mode="r+";
+       if (this_->mkdir)
+               file_mkdir(this_->filename_ex2, 2);
        this_->f=fopen(this_->filename_ex2, mode);
        if (! this_->f)
                this_->f=fopen(this_->filename_ex2, "w");
+       if (! this_->f)
+               return;
        if (!this_->overwrite) 
                fseek(this_->f, 0, SEEK_END);
        this_->empty = !ftell(this_->f);
+       gettimeofday(&this_->last_flush, NULL);
 }
 
 static void
 log_close(struct log *this_)
 {
+       if (! this_->f)
+               return;
        if (this_->trailer.len) 
                fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f);
        fflush(this_->f);
@@ -93,6 +102,11 @@ static void
 log_flush(struct log *this_)
 {
        long pos;
+       if (this_->lazy && !this_->f) {
+               if (!this_->data.len)
+                       return;
+               log_open(this_);
+       }
        if (this_->empty) {
                if (this_->header.len) 
                        fwrite(this_->header.data, 1, this_->header.len, this_->f);
@@ -127,7 +141,9 @@ log_change(struct log *this_)
 {
        log_flush(this_);
        log_close(this_);
-       log_open(this_);
+       expand_filenames(this_);
+       if (! this_->lazy)
+               log_open(this_);
 }
 
 static int
@@ -147,7 +163,7 @@ log_timer(gpointer data)
        int delta;
        gettimeofday(&tv, NULL);
        delta=(tv.tv_sec-this_->last_flush.tv_sec)*1000+(tv.tv_usec-this_->last_flush.tv_usec)/1000;
-       dbg(0,"delta=%d flush_time=%d\n", delta, this_->flush_time);
+       dbg(1,"delta=%d flush_time=%d\n", delta, this_->flush_time);
        if (this_->flush_time && delta > this_->flush_time*1000)
                log_flush(this_);
        return TRUE;
@@ -164,7 +180,7 @@ struct log *
 log_new(struct attr **attrs)
 {
        struct log *ret=g_new0(struct log, 1);
-       struct attr *data,*overwrite,*flush_size,*flush_time;
+       struct attr *data,*overwrite,*lazy,*mkdir,*flush_size,*flush_time;
 
        dbg(1,"enter\n");
        data=attr_search(attrs, NULL, attr_data);
@@ -174,6 +190,12 @@ log_new(struct attr **attrs)
        overwrite=attr_search(attrs, NULL, attr_overwrite);
        if (overwrite)
                ret->overwrite=overwrite->u.num;
+       lazy=attr_search(attrs, NULL, attr_lazy);
+       if (lazy)
+               ret->lazy=lazy->u.num;
+       mkdir=attr_search(attrs, NULL, attr_mkdir);
+       if (mkdir)
+               ret->mkdir=mkdir->u.num;
        flush_size=attr_search(attrs, NULL, attr_flush_size);
        if (flush_size)
                ret->flush_size=flush_size->u.num;
@@ -181,12 +203,12 @@ log_new(struct attr **attrs)
        if (flush_time)
                ret->flush_time=flush_time->u.num;
        if (ret->flush_time) {
-               dbg(0,"interval %d\n", ret->flush_time*1000);
+               dbg(1,"interval %d\n", ret->flush_time*1000);
                ret->timer=g_timeout_add(ret->flush_time*1000, log_timer, ret);
        }
        expand_filenames(ret);
-       log_open(ret);
-       gettimeofday(&ret->last_flush, NULL);
+       if (! ret->lazy)
+               log_open(ret);
        ret->attrs=attr_list_dup(attrs);
        return ret;
 }
@@ -211,8 +233,10 @@ void
 log_write(struct log *this_, char *data, int len)
 {
        dbg(1,"enter\n");
-       if (log_change_required(this_)) 
+       if (log_change_required(this_)) {
+               dbg(1,"log_change");
                log_change(this_);
+       }
        if (this_->data.len + len > this_->data.max_len) {
                dbg(2,"overflow\n");
                this_->data.max_len+=16384;