77 const char *event,
int flagmysql,
int forcehash,
const char *tab)
83 char szhash[3] =
"00";
84 const char *r = (
char *) 0;
85 const char *table = (
char *) 0;
86 const char **ptable = &table;
90 unsigned char ch,lcch;
97 if (tab) ptable = &tab;
99 if (!flagmysql || (r =
opensql(dbname,ptable))) {
100 if (r && *r)
logmsg(WH0,111,FATAL,r);
112 case_lowerb(
addr.s + j + 1,
addr.len - j - 1);
114 case_lowerb(lcaddr.s + 1,j - 1);
116 if (forcehash >= 0 && forcehash <= 52) {
117 ch = lcch = (
unsigned char) forcehash;
121 for (j = 0;j <
addr.len;++j) {
122 h = (h + (h << 5)) ^ (uint32) (
unsigned char)
addr.s[j];
123 lch = (lch + (lch << 5)) ^ (uint32) (
unsigned char) lcaddr.s[j];
125 lcch = 64 + (lch % 53);
132 if (!stralloc_copys(&fnlock,dbname))
die_nomem();
134 if (!stralloc_cats(&
fn,
"/subscribers/"))
die_nomem();
139 if (!stralloc_cats(&fnlock,
"/lock"))
die_nomem();
148 fdnew = open_trunc(
fnnew.s);
154 fd = open_read(
fn.s);
156 if (errno != ENOENT) { close(fdnew);
die_read(); }
162 if (getln(&
bi,&line,&
match,
'\0') == -1) {
166 if (line.len ==
addr.len)
167 if (!case_diffb(line.s,line.len,
addr.s)) {
169 if (!flagadd)
continue;
171 if (buffer_bput(&
bo,line.s,line.len) == -1) {
179 if (flagadd && !flagwasthere)
184 if (buffer_flush(&
bo) == -1) { close(fdnew);
die_write(); }
185 if (fsync(fdnew) == -1) { close(fdnew);
die_write(); }
188 if (rename(
fnnew.s,
fn.s) == -1)
191 if ((ch == lcch) || flagwasthere) {
193 if (flagadd ^ flagwasthere) {
205 fn.s[
fn.len - 2] = ch;
207 fdnew = open_trunc(
fnnew.s);
211 fd = open_read(
fn.s);
213 if (errno != ENOENT) { close(fdnew);
die_read(); }
218 if (getln(&ss,&line,&
match,
'\0') == -1)
221 if (line.len ==
addr.len)
222 if (!case_diffb(line.s,line.len,
addr.s)) {
226 if (buffer_bput(&
bo,line.s,line.len) == -1)
233 if (buffer_flush(&
bo) == -1) { close(fdnew);
die_write(); }
234 if (fsync(fdnew) == -1) { close(fdnew);
die_write(); }
237 if (rename(
fnnew.s,
fn.s) == -1)
241 if (flagadd ^ flagwasthere) {
262 case_lowerb(cpat + 1,
addr.len - j - 1);
271 case_lowerb(lcaddr.s,j);
273 for (j = 0;j < lcaddr.len;++j) {
274 h = (h + (h << 5)) ^ (uint32) (
unsigned char) lcaddr.s[j];
278 ch = (forcehash % 100);
280 szhash[0] =
'0' + ch / 10;
281 szhash[1] =
'0' + (ch % 10);
284 if (!stralloc_copys(&line,
"LOCK TABLES "))
die_nomem();
285 if (!stralloc_cats(&line,table))
die_nomem();
286 if (!stralloc_cats(&line,
" WRITE"))
die_nomem();
287 if (mysql_real_query(
mysql,line.s,line.len))
289 if (!stralloc_copys(&line,
"SELECT address FROM "))
die_nomem();
290 if (!stralloc_cats(&line,table))
die_nomem();
291 if (!stralloc_cats(&line,
" WHERE address='"))
die_nomem();
293 if (!stralloc_cats(&line,
"'"))
die_nomem();
294 if (mysql_real_query(
mysql,line.s,line.len))
296 if (!(result = mysql_use_result(
mysql)))
299 if ((row = mysql_fetch_row(result))) {
300 while (mysql_fetch_row(result));
301 mysql_free_result(result);
302 if (mysql_query(
mysql,
"UNLOCK TABLES"))
306 mysql_free_result(result);
307 if (mysql_errno(
mysql))
309 if (!stralloc_copys(&line,
"INSERT INTO "))
die_nomem();
310 if (!stralloc_cats(&line,table))
die_nomem();
311 if (!stralloc_cats(&line,
" (address,hash) VALUES ('"))
die_nomem();
313 if (!stralloc_cats(&line,
"',"))
die_nomem();
314 if (!stralloc_cats(&line,szhash))
die_nomem();
315 if (!stralloc_cats(&line,
")"))
die_nomem();
316 if (mysql_real_query(
mysql,line.s,line.len))
318 if (mysql_query(
mysql,
"UNLOCK TABLES"))
322 if (!stralloc_copys(&line,
"DELETE FROM "))
die_nomem();
323 if (!stralloc_cats(&line,table))
die_nomem();
324 if (!stralloc_cats(&line,
" WHERE address='"))
die_nomem();
326 if (forcehash >= 0) {
327 if (!stralloc_cats(&line,
"' AND hash="))
die_nomem();
328 if (!stralloc_cats(&line,szhash))
die_nomem();
330 if (!stralloc_cats(&line,
"' AND hash BETWEEN 0 AND 52"))
die_nomem();
332 if (mysql_real_query(
mysql,line.s,line.len))
334 if (mysql_affected_rows(
mysql) == 0)
343 if (!stralloc_copys(&logline,
"INSERT INTO "))
die_nomem();
344 if (!stralloc_cats(&logline,table))
die_nomem();
345 if (!stralloc_cats(&logline,
"_slog (address,edir,etype,fromline) VALUES ('"))
die_nomem();
348 if (!stralloc_cats(&logline,
"','+','"))
die_nomem();
350 if (!stralloc_cats(&logline,
"','-','"))
die_nomem();
354 if (!stralloc_catb(&logline,event + 1,1))
die_nomem();
355 if (!stralloc_cats(&logline,
"','"))
die_nomem();
362 if (!stralloc_cats(&logline,
"')"))
die_nomem();
364 if (mysql_real_query(
mysql,logline.s,logline.len))
366 if (!stralloc_0(&
addr))