2 MiddleMan filtering proxy server
3 Copyright (C) 2002 Jason McLaughlin
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #endif /* USE_SYSLOG */
35 extern char logfile[];
36 extern LOGBUFFER *logbuffer;
37 pthread_mutex_t logfile_lock = PTHREAD_MUTEX_INITIALIZER;
40 write message to logfile
42 void putlog(int level, char *fmt, ...)
51 pthread_mutex_lock(&logfile_lock);
59 ptr += strftime(ptr, 24, TIMEFORMAT, tv);
61 ptr += sprintf(ptr, " [%u] ", (unsigned int) getpid());
66 ptr += sprintf(ptr, "request: ");
69 ptr += sprintf(ptr, "network: ");
72 ptr += sprintf(ptr, "url filter: ");
75 ptr += sprintf(ptr, "header: ");
78 ptr += sprintf(ptr, "mime filter: ");
81 ptr += sprintf(ptr, "cooke filter: ");
84 ptr += sprintf(ptr, "redirect: ");
87 ptr += sprintf(ptr, "template: ");
90 ptr += sprintf(ptr, "keyword filter: ");
93 ptr += sprintf(ptr, "warning: ");
96 ptr += sprintf(ptr, "error: ");
99 ptr += sprintf(ptr, "debug: ");
103 va_start(valist, fmt);
104 ptr += vsnprintf(ptr, sizeof(buf) - (ptr - buf - 1), fmt, valist);
107 if (level != MMLOG_DEBUG)
108 logbuffer_add(logbuffer, buf);
110 if (!*logfile || !(loglevel & level))
113 if (*(ptr - 1) != '\n') {
118 syslog(LOG_INFO, "%s", buf);
121 logfd = open(logfile, O_RDWR | O_CREAT, 0644);
125 lseek(logfd, 0, SEEK_END);
128 write(logfd, buf, strlen(buf));
131 pthread_mutex_unlock(&logfile_lock);
134 void logbuffer_add(LOGBUFFER * logbuffer, char *msg)
136 struct LOGBUFFER_LIST *ll;
138 pthread_rwlock_wrlock(&logbuffer->lock);
140 if (logbuffer->size == 0) {
141 pthread_rwlock_unlock(&logbuffer->lock);
146 ll = xmalloc(sizeof(struct LOGBUFFER_LIST));
147 ll->msg = xstrdup(msg);
150 ll->next = logbuffer->head;
151 if (logbuffer->head != NULL)
152 logbuffer->head->prev = ll;
153 if (logbuffer->tail == NULL)
154 logbuffer->tail = ll;
156 logbuffer->head = ll;
158 if (logbuffer->entries == logbuffer->size) {
159 /* remove last log entry if we're at the size limit */
160 ll = logbuffer->tail;
162 logbuffer->tail = ll->prev;
163 ll->prev->next = NULL;
168 logbuffer->entries++;
170 pthread_rwlock_unlock(&logbuffer->lock);
173 void logbuffer_clear(LOGBUFFER * logbuffer)
175 struct LOGBUFFER_LIST *ll, *tmp;
177 pthread_rwlock_wrlock(&logbuffer->lock);
179 ll = logbuffer->head;
180 logbuffer->head = NULL;
181 logbuffer->tail = NULL;
182 logbuffer->entries = 0;
193 pthread_rwlock_unlock(&logbuffer->lock);
197 reduce number of entries to logbuffer->size
199 void logbuffer_resize(LOGBUFFER * logbuffer, int size)
202 struct LOGBUFFER_LIST *ll, *tmp;
207 pthread_rwlock_wrlock(&logbuffer->lock);
209 ll = logbuffer->head;
211 for (x = 0; x < size && ll != NULL; x++, ll = ll->next);
213 if (logbuffer->head == ll)
214 logbuffer->head = NULL;
215 logbuffer->tail = ll->prev;
217 if (ll->prev != NULL)
218 ll->prev->next = NULL;
229 logbuffer->entries = size;
232 logbuffer->size = size;
234 pthread_rwlock_unlock(&logbuffer->lock);