27 struct timeval last_flush;
31 struct log_data header;
33 struct log_data trailer;
37 strftime_localtime(char *buffer, int size, char *fmt)
44 strftime(buffer, 4096, fmt, tm);
48 expand_filenames(struct log *this_)
53 strftime_localtime(buffer, 4096, this_->filename);
54 this_->filename_ex1=g_strdup(buffer);
55 if (strstr(this_->filename_ex1,"%i")) {
58 g_free(this_->filename_ex2);
59 this_->filename_ex2=g_strdup_printf(this_->filename_ex1,i++);
60 } while (file_exists(this_->filename_ex2));
62 this_->filename_ex2=g_strdup(this_->filename_ex1);
66 log_open(struct log *this_)
73 this_->f=fopen(this_->filename_ex2, mode);
74 this_->empty = !ftell(this_->f);
78 log_close(struct log *this_)
80 if (this_->trailer.len)
81 fwrite(this_->header.data, 1, this_->trailer.len, this_->f);
88 log_flush(struct log *this_)
91 if (this_->header.len)
92 fwrite(this_->header.data, 1, this_->header.len, this_->f);
93 if (this_->header.len || this_->data.len)
96 fwrite(this_->data.data, 1, this_->data.len, this_->f);
98 g_free(this_->data.data);
99 this_->data.data=NULL;
100 this_->data.max_len=this_->data.len=0;
101 gettimeofday(&this_->last_flush, NULL);
105 log_flush_required(struct log *this_)
107 return this_->data.len > this_->flush_size;
112 log_change(struct log *this_)
120 log_change_required(struct log *this_)
124 strftime_localtime(buffer, 4096, this_->filename);
125 return (strcmp(this_->filename_ex1, buffer) != 0);
129 log_timer(gpointer data)
131 struct log *this_=data;
134 gettimeofday(&tv, NULL);
135 delta=(tv.tv_sec-this_->last_flush.tv_sec)*1000+(tv.tv_usec-this_->last_flush.tv_usec)/1000;
136 if (this_->flush_time && delta > this_->flush_time*1000)
143 log_new(struct attr **attrs)
145 struct log *ret=g_new0(struct log, 1);
146 struct attr *data,*overwrite,*flush_size,*flush_time;
149 data=attr_search(attrs, NULL, attr_data);
152 ret->filename=g_strdup(data->u.str);
153 overwrite=attr_search(attrs, NULL, attr_overwrite);
155 ret->overwrite=overwrite->u.num;
156 flush_size=attr_search(attrs, NULL, attr_flush_size);
158 ret->flush_size=flush_size->u.num;
159 flush_time=attr_search(attrs, NULL, attr_flush_time);
161 ret->flush_time=flush_time->u.num;
163 ret->timer=g_timeout_add(ret->flush_time*1000, log_timer, ret);
164 expand_filenames(ret);
170 log_set_header(struct log *this_, char *data, int len)
172 this_->header.data=g_malloc(len);
173 this_->header.max_len=this_->header.len=len;
174 memcpy(this_->header.data, data, len);
178 log_set_trailer(struct log *this_, char *data, int len)
180 this_->trailer.data=g_malloc(len);
181 this_->trailer.max_len=this_->trailer.len=len;
182 memcpy(this_->trailer.data, data, len);
186 log_write(struct log *this_, char *data, int len)
189 if (log_change_required(this_))
191 if (this_->data.len + len > this_->data.max_len) {
193 this_->data.max_len+=16384;
194 this_->data.data=g_realloc(this_->data.data,this_->data.max_len);
196 memcpy(this_->data.data+this_->data.len, data, len);
197 this_->data.len+=len;
198 if (log_flush_required(this_))
203 log_destroy(struct log *this_)
206 g_source_remove(this_->timer);