aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2013-08-01 19:20:54 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2013-08-02 10:48:54 +0300
commit73f605f76d82aec40a7f1bbd309e2097d9abfd42 (patch)
tree5820713d17efcb482a8801f4f805b0ae121903f7
parentd78a58be5fa2385987a3141ccbe942107332e677 (diff)
downloadvmod-tbf-73f605f76d82aec40a7f1bbd309e2097d9abfd42.tar.gz
vmod-tbf-73f605f76d82aec40a7f1bbd309e2097d9abfd42.tar.bz2
Switch to CDB environment.
* configure.ac: Version 0.99.91 * src/tbf.c (dbdir): New static. (tbf_set_db_name): Remove. (tbf_set_db_dir): New function. (tbf_open): Rename the parameter and related variables. Create a CDB environment and the database in it. (vmod_open): Change semantics of the first argument. * src/vmod-tbf.3: Update. * tests/Makefile.am (distclean-local): New rule, instead of DISTCLEANFILES. * tests/test00.vtc: Update call to tbf.open. * tests/test01.vtc: Likewise. * tests/test02.vtc: Likewise. * tests/test03.vtc: Likewise.
-rw-r--r--configure.ac2
-rw-r--r--src/tbf.c212
-rw-r--r--src/vmod-tbf.332
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/test00.vtc2
-rw-r--r--tests/test01.vtc2
-rw-r--r--tests/test02.vtc2
-rw-r--r--tests/test03.vtc2
8 files changed, 175 insertions, 83 deletions
</
diff --git a/configure.ac b/configure.ac
index 9c228f6..4ca4e6f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -16,3 +16,3 @@
16AC_PREREQ(2.69) 16AC_PREREQ(2.69)
17AC_INIT([vmod-tbf], 0.99.90, [gray@gnu.org]) 17AC_INIT([vmod-tbf], 0.99.91, [gray@gnu.org])
18AC_CONFIG_AUX_DIR([build-aux]) 18AC_CONFIG_AUX_DIR([build-aux])
diff --git a/src/tbf.c b/src/tbf.c
index 1dfb6c6..7050fc7 100644
--- a/src/tbf.c
+++ b/src/tbf.c
@@ -22,2 +22,3 @@
22#include <inttypes.h> 22#include <inttypes.h>
23#include <sys/stat.h>
23#include <db.h> 24#include <db.h>
@@ -43,3 +44,9 @@ debugprt(const char *fmt, ...)
43 44
45#define DEFDBNAME "tbf.bdb"
46#define DEFOPENPARAMS "truncate"
47#define DBFILEMODE 0640
48
49static char *dbdir;
44static char *dbname; 50static char *dbname;
51static DB_ENV *dbenv;
45static DB *db; 52static DB *db;
@@ -50,3 +57,2 @@ static int tbf_disabled;
50static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 57static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
51#define DBFILEMODE 0640
52 58
@@ -124,15 +130,14 @@ keylock_remove_safe(struct keylock *kp)
124static void 130static void
125tbf_set_db_name(const char *file_name) 131tbf_set_db_dir(const char *dir)
126{ 132{
127 if (dbname) 133 if (dbdir)
128 free(dbname); 134 free(dbdir);
129 dbname = strdup(file_name); 135 dbdir = strdup(dir);
130 if (!dbname) 136 AN(dbdir);
131 abort();
132} 137}
133 138
134struct mode_kw { 139struct param_kw {
135 char *mkw_str; 140 char *pkw_str;
136 int mkw_len; 141 int pkw_len;
137 int mkw_tok; 142 int pkw_tok;
138}; 143};
@@ -140,15 +145,17 @@ struct mode_kw {
140enum { 145enum {
141 MKW_TRUNCATE, 146 PKW_TRUNCATE,
142 MKW_MODE, 147 PKW_MODE,
143 MKW_SYNC, 148 PKW_SYNC,
144 MKW_DEBUG, 149 PKW_DEBUG,
150 PKW_DBNAME
145}; 151};
146 152
147static struct mode_kw mode_kw_tab[] = { 153static struct param_kw param_kw_tab[] = {
148#define S(s) #s, sizeof(#s)-1 154#define S(s) #s, sizeof(#s)-1
149 { S(truncate), MKW_TRUNCATE }, 155 { S(truncate), PKW_TRUNCATE },
150 { S(trunc), MKW_TRUNCATE }, 156 { S(trunc), PKW_TRUNCATE },
151 { S(mode=), MKW_MODE }, 157 { S(mode=), PKW_MODE },
152 { S(sync=), MKW_SYNC }, 158 { S(sync=), PKW_SYNC },
153 { S(debug=), MKW_DEBUG }, 159 { S(debug=), PKW_DEBUG },
160 { S(dbname=), PKW_DBNAME },
154 { NULL } 161 { NULL }
@@ -158,6 +165,5 @@ static struct mode_kw mode_kw_tab[] = {
158static void 165static void
159tbf_open(const char *mode) 166tbf_open(const char *params)
160{ 167{
161 int rc; 168 int rc;
162 int flags = DB_CREATE|DB_THREAD;
163 int filemode = DBFILEMODE; 169 int filemode = DBFILEMODE;
@@ -165,17 +171,19 @@ tbf_open(const char *mode)
165 char *p; 171 char *p;
172 struct stat st;
173 int truncate = 0;
166 174
167 if (!dbname) 175 if (!dbdir) {
168 tbf_set_db_name(LOCALSTATEDIR "/tbf.db"); 176 dbdir = strdup(LOCALSTATEDIR "/vmod-tbf");
169 177 AN(dbdir);
170 rc = db_create(&db, NULL, 0);
171 if (rc) {
172 syslog(LOG_DAEMON|LOG_ERR, "cannot create db struct");
173 return;
174 } 178 }
175 179 if (!dbname) {
176 while (*mode) { 180 dbname = strdup(DEFDBNAME);
177 struct mode_kw *mkw; 181 AN(dbname);
182 }
183
184 while (*params) {
185 struct param_kw *pkw;
178 186
179 for (mkw = mode_kw_tab; mkw->mkw_str; mkw++) { 187 for (pkw = param_kw_tab; pkw->pkw_str; pkw++) {
180 if (strncmp(mode, mkw->mkw_str, mkw->mkw_len) == 0) 188 if (strncmp(params, pkw->pkw_str, pkw->pkw_len) == 0)
181 break; 189 break;
@@ -183,4 +191,4 @@ tbf_open(const char *mode)
183 191
184 if (!mkw->mkw_str) { 192 if (!pkw->pkw_str) {
185 syslog(LOG_DAEMON|LOG_ERR, "invalid keyword %s", mode); 193 syslog(LOG_DAEMON|LOG_ERR, "invalid keyword %s", params);
186 break; 194 break;
@@ -188,12 +196,12 @@ tbf_open(const char *mode)
188 196
189 mode += mkw->mkw_len; 197 params += pkw->pkw_len;
190 198
191 switch (mkw->mkw_tok) { 199 switch (pkw->pkw_tok) {
192 case MKW_TRUNCATE: 200 case PKW_TRUNCATE:
193 flags |= DB_TRUNCATE; 201 truncate = 1;
194 break; 202 break;
195 203
196 case MKW_MODE: 204 case PKW_MODE:
197 errno = 0; 205 errno = 0;
198 n = strtoul(mode, &p, 8); 206 n = strtoul(params, &p, 8);
199 if (errno || (n & ~0777) || !(*p == 0 || *p == ';')) { 207 if (errno || (n & ~0777) || !(*p == 0 || *p == ';')) {
@@ -201,6 +209,6 @@ tbf_open(const char *mode)
201 "invalid file mode near %s", p); 209 "invalid file mode near %s", p);
202 mode += strlen(mode); 210 params += strlen(params);
203 } else { 211 } else {
204 filemode = n; 212 filemode = n;
205 mode = p; 213 params = p;
206 } 214 }
@@ -208,5 +216,5 @@ tbf_open(const char *mode)
208 216
209 case MKW_SYNC: 217 case PKW_SYNC:
210 errno = 0; 218 errno = 0;
211 n = strtoul(mode, &p, 10); 219 n = strtoul(params, &p, 10);
212 if (errno || !(*p == 0 || *p == ';')) { 220 if (errno || !(*p == 0 || *p == ';')) {
@@ -214,3 +222,3 @@ tbf_open(const char *mode)
214 "invalid count near %s", p); 222 "invalid count near %s", p);
215 mode += strlen(mode); 223 params += strlen(params);
216 } else { 224 } else {
@@ -218,3 +226,3 @@ tbf_open(const char *mode)
218 autosync_count = 0; 226 autosync_count = 0;
219 mode = p; 227 params = p;
220 } 228 }
@@ -222,5 +230,5 @@ tbf_open(const char *mode)
222 230
223 case MKW_DEBUG: 231 case PKW_DEBUG:
224 errno = 0; 232 errno = 0;
225 n = strtoul(mode, &p, 10); 233 n = strtoul(params, &p, 10);
226 if (errno || !(*p == 0 || *p == ';')) { 234 if (errno || !(*p == 0 || *p == ';')) {
@@ -228,16 +236,28 @@ tbf_open(const char *mode)
228 "invalid debug level near %s", p); 236 "invalid debug level near %s", p);
229 mode += strlen(mode); 237 params += strlen(params);
230 } else { 238 } else {
231 debug_level = n; 239 debug_level = n;
232 mode = p; 240 params = p;
233 } 241 }
242 break;
243
244 case PKW_DBNAME:
245 if (dbname)
246 free(dbname);
247 n = strcspn(params, ";");
248 dbname = malloc(n + 1);
249 AN(dbname);
250 memcpy(dbname, params, n);
251 dbname[n] = 0;
252 params += n;
253 break;
234 } 254 }
235 255
236 if (*mode == 0) 256 if (*params == 0)
237 break; 257 break;
238 else if (*mode == ';') 258 else if (*params == ';')
239 mode++; 259 params++;
240 else { 260 else {
241 syslog(LOG_DAEMON|LOG_ERR, 261 syslog(LOG_DAEMON|LOG_ERR,
242 "expected ';' near %s", mode); 262 "expected ';' near %s", params);
243 break; 263 break;