static t_attr * cdb_read_attr(const char *filename, const char *key) { #ifdef CDB_ON_DEMAND std::FILE *cdbfile; t_attr *attr; char *val; unsigned vlen = 1; // eventlog(eventlog_level_trace, __FUNCTION__, "reading key '%s'", key); if ((cdbfile = std::fopen(filename, "rb")) == NULL) { // eventlog(eventlog_level_debug, __FUNCTION__, "unable to open file \"%s\" for reading ",filename); return NULL; } if (cdb_seek(cdbfile, key, std::strlen(key), &vlen) <= 0) { // eventlog(eventlog_level_debug, __FUNCTION__, "could not find key '%s'", key); std:;std::fclose(cdbfile); return NULL; } /* FIXME: use attr_* API */ attr = xmalloc(sizeof(t_attr)); attr->key = xstrdup(key); val = xmalloc(vlen + 1); cdb_bread(cdbfile, val, vlen); std::fclose(cdbfile); val[vlen] = '\0'; attr->val = val; attr->dirty = 0; // eventlog(eventlog_level_trace, __FUNCTION__, "read key '%s' value '%s'", attr->key, attr->val); return attr; #else return NULL; #endif }
int lookup_cdb(const char *mail) { int fd; int flagwild; int r; if (!stralloc_copys(&lower, "!")) die_nomem(); if (!stralloc_cats(&lower, mail)) die_nomem(); if (!stralloc_0(&lower)) die_nomem(); case_lowerb(lower.s, lower.len); fd = open_read("users/cdb"); if (fd == -1) if (errno != error_noent) die_cdb(); if (fd != -1) { uint32 dlen; unsigned int i; cdb_init(&cdb, fd); r = cdb_seek(&cdb, "", 0, &dlen); if (r != 1) die_cdb(); if (!stralloc_ready(&wildchars, (unsigned int) dlen)) die_nomem(); wildchars.len = dlen; if (cdb_bread(&cdb, wildchars.s, wildchars.len) == -1) die_cdb(); i = lower.len; flagwild = 0; do { /* i > 0 */ if (!flagwild || i == 1 || byte_chr(wildchars.s, wildchars.len, lower.s[i - 1]) < wildchars.len) { r = cdb_seek(&cdb,lower.s,i,&dlen); if (r == -1) die_cdb(); if (r == 1) { /* OK */ if (substdio_putflush(subfdout, "K", 1) == -1) die_write(); cdb_free(&cdb); close(fd); return (1); } } --i; flagwild = 1; } while (i); close(fd); } return (0); }