75 const char *event,
int flagmysql,
int forcehash,
const char *tab)
81 unsigned char ch,lcch;
97 case_lowerb(
addr.s + j + 1,
addr.len - j - 1);
99 case_lowerb(lcaddr.s + 1,j - 1);
101 if (forcehash >= 0 && forcehash <= 52) {
102 ch = lcch = (
unsigned char) forcehash;
106 for (j = 0;j <
addr.len;++j) {
107 h = (h + (h << 5)) ^ (uint32) (
unsigned char)
addr.s[j];
108 lch = (lch + (lch << 5)) ^ (uint32) (
unsigned char) lcaddr.s[j];
110 lcch = 64 + (lch % 53);
117 if (!stralloc_copys(&fnlock,dbname))
die_nomem();
119 if (!stralloc_cats(&
fn,
"/subscribers/"))
die_nomem();
124 if (!stralloc_cats(&fnlock,
"/lock"))
die_nomem();
133 fdnew = open_trunc(
fnnew.s);
139 fd = open_read(
fn.s);
141 if (errno != ENOENT) { close(fdnew);
die_read(); }
147 if (getln(&
bi,&line,&
match,
'\0') == -1) {
151 if (line.len ==
addr.len)
152 if (!case_diffb(line.s,line.len,
addr.s)) {
154 if (!flagadd)
continue;
156 if (buffer_put(&
bo,line.s,line.len) == -1) {
164 if (flagadd && !flagwasthere)
169 if (buffer_flush(&
bo) == -1) { close(fdnew);
die_write(); }
170 if (fsync(fdnew) == -1) { close(fdnew);
die_write(); }
173 if (rename(
fnnew.s,
fn.s) == -1)
176 if ((ch == lcch) || flagwasthere) {
178 if (flagadd ^ flagwasthere) {
190 fn.s[
fn.len - 2] = ch;
192 fdnew = open_trunc(
fnnew.s);
196 fd = open_read(
fn.s);
198 if (errno != ENOENT) { close(fdnew);
die_read(); }
203 if (getln(&
bi,&line,&
match,
'\0') == -1)
206 if (line.len ==
addr.len)
207 if (!case_diffb(line.s,line.len,
addr.s)) {
211 if (buffer_put(&
bo,line.s,line.len) == -1)
218 if (buffer_flush(&
bo) == -1) { close(fdnew);
die_write(); }
219 if (fsync(fdnew) == -1) { close(fdnew);
die_write(); }
222 if (rename(
fnnew.s,
fn.s) == -1)
226 if (flagadd ^ flagwasthere) {
const char * logmsg(const char *dir, unsigned long num, unsigned long listno, unsigned long subs, int done)
int subscribe(const char *dbname, const char *userhost, int flagadd, const char *comment, const char *event, int flagmysql, int forcehash, const char *tab)