OSDN Git Service

Merge branch 'branch_0.12.0' into branch_0.13.0
[modchxj/mod_chxj.git] / src / chxj_dbm.c
1 /*
2  * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
3  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include "mod_chxj.h"
18 #include "chxj_cookie.h"
19 #include "chxj_dbm.h"
20 #include "chxj_url_encode.h"
21 #include "chxj_apply_convrule.h"
22 #include "chxj_str_util.h"
23
24 #include "ap_release.h"
25
26 #include "apu.h"
27 #include "apr_uuid.h"
28 #include "apr_md5.h"
29 #include "apr_base64.h"
30 #include "apr_uri.h"
31
32 #include <unistd.h>
33
34 int
35 chxj_save_cookie_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
36 {
37   apr_status_t        retval;
38   apr_datum_t         dbmkey;
39   apr_datum_t         dbmval;
40   apr_dbm_t           *f;
41   apr_file_t          *file;
42
43   DBG(r, "REQ[%X] start chxj_save_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
44
45   file = chxj_cookie_db_lock(r);
46   if (! file) {
47     ERR(r, "%s:%d REQ[%X] mod_chxj: Can't lock cookie db", __FILE__,__LINE__,TO_ADDR(r));
48     DBG(r, "REQ[%X] end chxj_save_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
49     return CHXJ_FALSE;
50   }
51
52   retval = apr_dbm_open_ex(&f,
53                            "default",
54                            chxj_cookie_db_name_create(r, m->cookie_db_dir),
55                            APR_DBM_RWCREATE,
56                            APR_OS_DEFAULT,
57                            r->pool);
58   if (retval != APR_SUCCESS) {
59     char errstr[256];
60     ERR(r, "%s:%d could not open dbm (type %s) auth file: %s(%d:%s)",
61             __FILE__,
62             __LINE__,
63             "default",
64             chxj_cookie_db_name_create(r,m->cookie_db_dir),
65             retval,
66             apr_strerror(retval, errstr, 255));
67     chxj_cookie_db_unlock(r, file);
68     DBG(r, "REQ[%X] end chxj_save_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
69     return CHXJ_FALSE;
70   }
71
72
73   /*
74    * create key
75    */
76
77   dbmkey.dptr  = apr_pstrdup(r->pool, cookie_id);
78   dbmkey.dsize = strlen(cookie_id);
79   dbmval.dptr  = apr_pstrdup(r->pool, store_string);
80   dbmval.dsize = strlen(store_string);
81
82   /*
83    * store to db
84    */
85   retval = apr_dbm_store(f, dbmkey, dbmval);
86   if (retval != APR_SUCCESS) {
87     char errstr[256];
88     ERR(r, "%s:%d Cannot store Cookie data to DBM file `%s' (%d:%s)",
89             __FILE__,
90             __LINE__,
91             chxj_cookie_db_name_create(r, m->cookie_db_dir),
92             retval,
93             apr_strerror(retval, errstr, 255));
94     apr_dbm_close(f);
95     chxj_cookie_db_unlock(r, file);
96     DBG(r, "REQ[%X] end chxj_save_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
97     return CHXJ_FALSE;
98   }
99
100   apr_dbm_close(f);
101   chxj_cookie_db_unlock(r, file);
102   DBG(r, "REQ[%X] end chxj_save_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
103   return CHXJ_TRUE;
104 }
105
106
107 void
108 chxj_cookie_db_unlock(request_rec *r, apr_file_t *file)
109 {
110   apr_status_t rv;
111
112   rv = apr_file_unlock(file);
113   if (rv != APR_SUCCESS) {
114     ERR(r, "cookie lock file open failed.");
115     return;
116   }
117
118   apr_file_close(file);
119 }
120
121
122 apr_file_t *
123 chxj_cookie_db_lock(request_rec *r)
124 {
125   apr_file_t       *file;
126   apr_status_t     rv;
127   mod_chxj_config  *dconf;
128
129   dconf = (mod_chxj_config*)chxj_get_module_config(r->per_dir_config, &chxj_module);
130
131   rv = apr_file_open(&file,
132                      chxj_cookie_db_lock_name_create(r, dconf->cookie_db_dir),
133                      APR_CREATE|APR_WRITE,
134                      APR_OS_DEFAULT,
135                      r->pool);
136   if (rv != APR_SUCCESS) {
137     ERR(r, "cookie lock file open failed.");
138     return NULL;
139   }
140
141   rv = apr_file_lock(file,APR_FLOCK_EXCLUSIVE);
142   if (rv != APR_SUCCESS) {
143     ERR(r, "cookie lock file open failed.");
144     apr_file_close(file);
145     return NULL;
146   }
147
148   return file;
149 }
150
151
152 char *
153 chxj_cookie_db_name_create(request_rec *r, const char *dir)
154 {
155   char *dst;
156
157   if (!dir) {
158     dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
159   }
160   else {
161     dst = apr_pstrdup(r->pool, dir);
162   }
163
164   if (dst[strlen(dst)-1] != '/') {
165     dst = apr_pstrcat(r->pool, dst, "/", COOKIE_DB_NAME, NULL);
166   }
167   else {
168     dst = apr_pstrcat(r->pool, dst, COOKIE_DB_NAME, NULL);
169   }
170
171   return dst;
172 }
173
174
175 char *
176 chxj_cookie_db_lock_name_create(request_rec *r, const char *dir)
177 {
178   char *dst;
179   DBG(r, "REQ[%X] start  chxj_cookie_db_lock_name_create()", TO_ADDR(r));
180
181   if (!dir) {
182     dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
183   }
184   else {
185     dst = apr_pstrdup(r->pool, dir);
186   }
187   if (dst[strlen(dst)-1] != '/') {
188     dst = apr_pstrcat(r->pool, dst, "/", COOKIE_DB_LOCK_NAME, NULL);
189   }
190   else {
191     dst = apr_pstrcat(r->pool, dst, COOKIE_DB_LOCK_NAME, NULL);
192   }
193   DBG(r, "REQ[%X] end  chxj_cookie_db_lock_name_create()", TO_ADDR(r));
194   return dst;
195 }
196
197
198
199 char *
200 chxj_cookie_expire_db_name_create(request_rec *r, const char *dir)
201 {
202   char *dst;
203
204   if (!dir) {
205     dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
206   }
207   else {
208     dst = apr_pstrdup(r->pool, dir);
209   }
210
211   if (dst[strlen(dst)-1] != '/') {
212     dst = apr_pstrcat(r->pool, dst, "/", COOKIE_EXPIRE_DB_NAME, NULL);
213   }
214   else {
215     dst = apr_pstrcat(r->pool, dst, COOKIE_EXPIRE_DB_NAME, NULL);
216   }
217
218   return dst;
219 }
220
221
222 char *
223 chxj_cookie_expire_db_lock_name_create(request_rec *r, const char *dir)
224 {
225   char *dst;
226
227   if (!dir) {
228     dst = apr_pstrdup(r->pool, DEFAULT_COOKIE_DB_DIR);
229   }
230   else {
231     dst = apr_pstrdup(r->pool, dir);
232   }
233   if (dst[strlen(dst)-1] != '/') {
234     dst = apr_pstrcat(r->pool, dst, "/", COOKIE_EXPIRE_DB_LOCK_NAME, NULL);
235   }
236   else {
237     dst = apr_pstrcat(r->pool, dst, COOKIE_EXPIRE_DB_LOCK_NAME, NULL);
238   }
239
240   return dst;
241 }
242
243
244 apr_file_t *
245 chxj_cookie_expire_db_lock(request_rec *r)
246 {
247   apr_file_t       *file;
248   apr_status_t     rv;
249   mod_chxj_config  *dconf;
250
251   dconf = (mod_chxj_config *)chxj_get_module_config(r->per_dir_config, &chxj_module);
252
253   rv = apr_file_open(&file, 
254                      chxj_cookie_expire_db_lock_name_create(r, dconf->cookie_db_dir),
255                      APR_CREATE|APR_WRITE, 
256                      APR_OS_DEFAULT, 
257                      r->pool);
258   if (rv != APR_SUCCESS) {
259     ERR(r, "cookie lock file open failed.");
260     return NULL;
261   }
262
263   rv = apr_file_lock(file,APR_FLOCK_EXCLUSIVE);
264   if (rv != APR_SUCCESS) {
265     ERR(r, "cookie lock file open failed.");
266     apr_file_close(file);
267     return NULL;
268   }
269
270   return file;
271 }
272
273
274 void
275 chxj_cookie_expire_db_unlock(request_rec *r, apr_file_t *file)
276 {
277   apr_status_t rv;
278
279   rv = apr_file_unlock(file);
280   if (rv != APR_SUCCESS) {
281     ERR(r, "cookie lock file open failed.");
282     return;
283   }
284
285   apr_file_close(file);
286 }
287
288 int
289 chxj_update_cookie_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
290 {
291   apr_dbm_t           *f;
292   apr_file_t          *file;
293   apr_datum_t         dbmkey;
294   apr_datum_t         dbmval;
295   apr_status_t        retval;
296
297   DBG(r, "start chxj_update_cookie_dbm() cookie_id:[%s]", cookie_id);
298
299   file = chxj_cookie_db_lock(r);
300   if (! file) {
301     ERR(r, "mod_chxj: Can't lock cookie db");
302     DBG(r, "end   chxj_update_cookie_dbm() cookie_id:[%s]", cookie_id);
303     return CHXJ_FALSE;
304   }
305
306   retval = apr_dbm_open_ex(&f,
307                            "default",
308                            chxj_cookie_db_name_create(r, m->cookie_db_dir),
309                            APR_DBM_RWCREATE,
310                            APR_OS_DEFAULT,
311                            r->pool);
312   if (retval != APR_SUCCESS) {
313     ERR(r, "could not open dbm (type %s) auth file: %s",
314             "default",
315             chxj_cookie_db_name_create(r,m->cookie_db_dir));
316     chxj_cookie_db_unlock(r, file);
317     DBG(r, "end   chxj_update_cookie_dbm() cookie_id:[%s]", cookie_id);
318     return CHXJ_FALSE;
319   }
320
321
322   /*
323    * create key
324    */
325
326   dbmkey.dptr  = apr_pstrdup(r->pool, cookie_id);
327   dbmkey.dsize = strlen(cookie_id);
328
329   /*
330    * create val
331    */
332   dbmval.dptr  = apr_pstrdup(r->pool, store_string);
333   dbmval.dsize = strlen(store_string);
334
335   /*
336    * store to db
337    */
338   retval = apr_dbm_store(f, dbmkey, dbmval);
339   if (retval != APR_SUCCESS) {
340     ERR(r, "Cannot store Cookie data to DBM file `%s'",
341             chxj_cookie_db_name_create(r, m->cookie_db_dir));
342     apr_dbm_close(f);
343     chxj_cookie_db_unlock(r, file);
344     DBG(r, "end   chxj_update_cookie_dbm() cookie_id:[%s]", cookie_id);
345     return CHXJ_FALSE;
346   }
347   apr_dbm_close(f);
348   chxj_cookie_db_unlock(r, file);
349   DBG(r, "end   chxj_update_cookie_dbm() cookie_id:[%s]", cookie_id);
350   return CHXJ_TRUE;
351 }
352
353
354 char *
355 chxj_load_cookie_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id)
356 {
357   char                    *load_string = NULL;
358   apr_status_t            retval;
359   apr_dbm_t               *f;
360   apr_file_t              *file;
361   apr_datum_t             dbmval;
362   apr_datum_t             dbmkey;
363
364   DBG(r, "REQ[%X] start chxj_load_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
365   file = chxj_cookie_db_lock(r);
366   if (! file) {
367     ERR(r, "REQ[%X] mod_chxj: Can't lock cookie db", TO_ADDR(r));
368     DBG(r, "REQ[%X] end   chxj_load_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
369     return NULL;
370   }
371
372   retval = apr_dbm_open_ex(&f,
373                            "default",
374                            chxj_cookie_db_name_create(r, m->cookie_db_dir),
375                            APR_DBM_RWCREATE,
376                            APR_OS_DEFAULT,
377                            r->pool);
378   if (retval != APR_SUCCESS) {
379     char errstr[256];
380     ERR(r,
381          "%s:%d could not open dbm (type %s) auth file: %s (%d:%s)",
382          __FILE__,
383          __LINE__,
384          "default",
385          chxj_cookie_db_name_create(r, m->cookie_db_dir),
386          retval,
387          apr_strerror(retval, errstr, 255));
388     chxj_cookie_db_unlock(r, file);
389     DBG(r, "TO_REQ[%X] end   chxj_load_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
390     return NULL;
391   }
392
393   /*
394    * create key
395    */
396   dbmkey.dptr  = apr_pstrdup(r->pool, cookie_id);
397   dbmkey.dsize = strlen(dbmkey.dptr);
398
399   if (apr_dbm_exists(f, dbmkey)) {
400     retval = apr_dbm_fetch(f, dbmkey, &dbmval);
401     if (retval != APR_SUCCESS) {
402       char errstr[256];
403       ERR(r,
404           "%s:%d could not fetch dbm (type %s) auth file: %s(%d:%s)",
405           __FILE__,
406           __LINE__,
407           "default",
408           chxj_cookie_db_name_create(r, m->cookie_db_dir),
409           retval,
410           apr_strerror(retval, errstr, 255));
411       apr_dbm_close(f);
412       chxj_cookie_db_unlock(r, file);
413       DBG(r, "REQ[%X] end   chxj_load_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
414       return NULL;
415     }
416     load_string = apr_palloc(r->pool, dbmval.dsize+1);
417
418     memset(load_string, 0, dbmval.dsize+1);
419     memcpy(load_string, dbmval.dptr, dbmval.dsize);
420   }
421   else {
422     DBG(r, "REQ[%X] Not Found cookie_id:[%s]", TO_ADDR(r), cookie_id);
423     load_string = apr_pstrdup(r->pool, "");
424   }
425   apr_dbm_close(f);
426   chxj_cookie_db_unlock(r, file);
427   DBG(r, "REQ[%X] end   chxj_load_cookie_dbm() cookie_id:[%s]", TO_ADDR(r), cookie_id);
428   return load_string;
429 }
430
431
432 int
433 chxj_delete_cookie_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id)
434 {
435   apr_status_t      retval;
436   apr_file_t        *file;
437   apr_datum_t       dbmkey;
438   apr_dbm_t         *f;
439
440   DBG(r, "start chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
441   file = chxj_cookie_db_lock(r);
442   if (! file) {
443     ERR(r, "mod_chxj: Can't lock cookie db");
444     DBG(r, "end   chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
445     return CHXJ_FALSE;
446   }
447
448   retval = apr_dbm_open_ex(&f,
449                            "default",
450                            chxj_cookie_db_name_create(r, m->cookie_db_dir),
451                            APR_DBM_RWCREATE,
452                            APR_OS_DEFAULT,
453                            r->pool);
454   if (retval != APR_SUCCESS) {
455     ERR(r,
456          "could not open dbm (type %s) auth file: %s",
457          "default",
458          chxj_cookie_db_name_create(r,m->cookie_db_dir));
459     chxj_cookie_db_unlock(r, file);
460     DBG(r, "end   chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
461     return CHXJ_FALSE;
462   }
463
464   /*
465    * create key
466    */
467   dbmkey.dptr  = apr_pstrdup(r->pool, cookie_id);
468   dbmkey.dsize = strlen(dbmkey.dptr);
469   if (apr_dbm_exists(f, dbmkey)) {
470     apr_dbm_delete(f, dbmkey);
471   }
472   apr_dbm_close(f);
473   chxj_cookie_db_unlock(r, file);
474   DBG(r, "end   chxj_delete_cookie_dbm() cookie_id:[%s]", cookie_id);
475   return CHXJ_TRUE;
476 }
477
478
479 int
480 chxj_save_cookie_expire_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id)
481 {
482   apr_status_t            retval;
483   char                    *store_string;
484   apr_file_t              *file;
485   apr_datum_t             dbmkey;
486   apr_datum_t             dbmval;
487   apr_dbm_t               *f;
488
489   DBG(r, "start chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
490   file = chxj_cookie_expire_db_lock(r);
491   if (! file) {
492     ERR(r, "mod_chxj: Can't lock cookie db");
493     DBG(r, "end   chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
494     return CHXJ_FALSE;
495   }
496
497   retval = apr_dbm_open_ex(&f, 
498                            "default", 
499                            chxj_cookie_expire_db_name_create(r, m->cookie_db_dir), 
500                            APR_DBM_RWCREATE, 
501                            APR_OS_DEFAULT, 
502                            r->pool);
503   if (retval != APR_SUCCESS) {
504     ERR(r, "could not open dbm (type %s) auth file: %s", 
505             "default", 
506             chxj_cookie_expire_db_name_create(r,m->cookie_db_dir));
507     chxj_cookie_expire_db_unlock(r, file);
508     DBG(r, "end   chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
509     return CHXJ_FALSE;
510   }
511   /*
512    * create key
513    */
514
515   dbmkey.dptr  = apr_pstrdup(r->pool, cookie_id);
516   dbmkey.dsize = strlen(cookie_id);
517
518   /*
519    * create val
520    */
521   
522   store_string = apr_psprintf(r->pool, "%d", (int)time(NULL));
523   dbmval.dptr  = store_string;
524   dbmval.dsize = strlen(store_string);
525
526   /*
527    * store to db
528    */
529   retval = apr_dbm_store(f, dbmkey, dbmval);
530   if (retval != APR_SUCCESS) {
531     ERR(r, "Cannot store Cookie data to DBM file `%s'",
532             chxj_cookie_db_name_create(r, m->cookie_db_dir));
533     DBG(r, "end   chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
534     apr_dbm_close(f);
535     chxj_cookie_expire_db_unlock(r, file);
536     return CHXJ_FALSE;
537   }
538
539
540   apr_dbm_close(f);
541   chxj_cookie_expire_db_unlock(r, file);
542   DBG(r, "end   chxj_save_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
543
544   return CHXJ_TRUE;
545 }
546
547
548 int
549 chxj_delete_cookie_expire_dbm(request_rec *r, mod_chxj_config *m, const char *cookie_id)
550 {
551   apr_status_t      retval;
552   apr_datum_t       dbmkey;
553   apr_dbm_t         *f;
554   apr_file_t        *file;
555
556   DBG(r, "start chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
557   file = chxj_cookie_expire_db_lock(r);
558   if (! file) {
559     ERR(r, "mod_chxj: Can't lock cookie db");
560     DBG(r, "end   chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
561     return CHXJ_FALSE;
562   }
563   retval = apr_dbm_open_ex(&f,
564                            "default",
565                            chxj_cookie_expire_db_name_create(r, m->cookie_db_dir),
566                            APR_DBM_RWCREATE,
567                            APR_OS_DEFAULT,
568                            r->pool);
569   if (retval != APR_SUCCESS) {
570     ERR(r,
571          "could not open dbm (type %s) auth file: %s",
572          "default",
573          chxj_cookie_expire_db_name_create(r,m->cookie_db_dir));
574     chxj_cookie_expire_db_unlock(r, file);
575     DBG(r, "end   chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
576     return CHXJ_FALSE;
577   }
578
579   /*
580  *    * create key
581  *       */
582   dbmkey.dptr  = apr_pstrdup(r->pool, cookie_id);
583   dbmkey.dsize = strlen(dbmkey.dptr);
584   if (apr_dbm_exists(f, dbmkey)) {
585     apr_dbm_delete(f, dbmkey);
586   }
587   apr_dbm_close(f);
588   chxj_cookie_expire_db_unlock(r, file);
589   DBG(r, "end   chxj_delete_cookie_expire_dbm() cookie_id:[%s]", cookie_id);
590
591   return CHXJ_TRUE;
592 }
593
594
595 int
596 chxj_cookie_expire_gc_dbm(request_rec *r, mod_chxj_config *m)
597 {
598   apr_status_t      retval;
599   apr_datum_t       dbmkey;
600   apr_datum_t       dbmval;
601   apr_dbm_t         *f;
602   apr_file_t        *file;
603   time_t            now_time;
604
605   DBG(r, "start chxj_cookie_expire_gc_dbm()");
606
607   file = chxj_cookie_expire_db_lock(r);
608   if (! file) {
609     ERR(r, "mod_chxj: Can't lock cookie db");
610     DBG(r, "end   chxj_cookie_expire_gc_dbm()");
611     return CHXJ_FALSE;
612   }
613
614   retval = apr_dbm_open_ex(&f,
615                            "default",
616                            chxj_cookie_expire_db_name_create(r, m->cookie_db_dir),
617                            APR_DBM_RWCREATE,
618                            APR_OS_DEFAULT,
619                            r->pool);
620   if (retval != APR_SUCCESS) {
621     ERR(r, 
622          "could not open dbm (type %s) auth file: %s", 
623          "default", 
624          chxj_cookie_expire_db_name_create(r,m->cookie_db_dir));
625     chxj_cookie_expire_db_unlock(r, file);
626     DBG(r, "end   chxj_cookie_expire_gc_dbm()");
627     return CHXJ_FALSE;
628   }
629
630   /*
631    * create key
632    */
633   memset(&dbmkey, 0, sizeof(apr_datum_t));
634
635   now_time = time(NULL);
636
637   retval = apr_dbm_firstkey(f, &dbmkey);
638   if (retval == APR_SUCCESS) {
639     DBG(r, "firstkey=[%.*s]", (int)dbmkey.dsize, dbmkey.dptr);
640     do {
641       char* tmp;
642       char* old_cookie_id;
643       int   val_time;
644       int   cmp_time;
645
646       retval = apr_dbm_fetch(f, dbmkey, &dbmval);
647       if (retval != APR_SUCCESS) {
648         break;
649       }
650       tmp = apr_palloc(r->pool, dbmval.dsize+1);
651       memset(tmp, 0, dbmval.dsize+1);
652       memcpy(tmp, dbmval.dptr, dbmval.dsize);
653
654
655       val_time = atoi(tmp);
656
657       if (m->cookie_timeout == 0)
658         cmp_time = now_time - DEFAULT_COOKIE_TIMEOUT;
659       else
660         cmp_time = now_time - m->cookie_timeout;
661
662       DBG(r, "m->cookie_timeout=[%d]", (int)m->cookie_timeout);
663       DBG(r, "key=[%.*s] cmp_time=[%d] val_time=[%d]", (int)dbmkey.dsize, dbmkey.dptr, cmp_time, val_time);
664       if (cmp_time >= val_time) {
665         apr_dbm_delete(f, dbmkey);
666
667         old_cookie_id = apr_palloc(r->pool, dbmkey.dsize+1);
668         memset(old_cookie_id, 0, dbmkey.dsize+1);
669         memcpy(old_cookie_id, dbmkey.dptr, dbmkey.dsize);
670
671         chxj_delete_cookie(r,old_cookie_id);
672         DBG(r, "detect timeout cookie [%s]", old_cookie_id);
673       }
674
675       retval = apr_dbm_nextkey(f, &dbmkey);
676     } while(retval == APR_SUCCESS && dbmkey.dptr != NULL);
677   }
678
679   apr_dbm_close(f);
680   chxj_cookie_expire_db_unlock(r, file);
681   DBG(r, "end   chxj_cookie_expire_gc_dbm()");
682   return CHXJ_TRUE;
683 }
684
685
686 cookie_lock_t *
687 chxj_cookie_lock_dbm(request_rec *r, mod_chxj_config *UNUSED(m))
688 {
689   cookie_lock_t *ret = apr_palloc(r->pool, sizeof(*ret));
690   ret->file = chxj_cookie_db_lock(r);
691   return ret;
692 }
693
694
695 int
696 chxj_cookie_unlock_dbm(request_rec *r, cookie_lock_t *lock, mod_chxj_config *UNUSED(m))
697 {
698   chxj_cookie_expire_db_unlock(r, lock->file);
699   return 1; /* allways true */
700 }
701 /*
702  * vim:ts=2 et
703  */