/** * Go through the database, read and add to the server all * the registrations stored. * * @param c the configuration of the db * @param s the server */ int db_create_registrations(struct config *c, struct server *s) { char *q = "SELECT * FROM registrations WHERE server_id = %i;"; struct registration *r; char *name, *pass; dbi_result res; res = dbi_conn_queryf(c->conn, q, s->id); if (res) { while (dbi_result_next_row(res)) { r = new_registration(); r->db_id = dbi_result_get_uint(res, "id"); r->global_flags = dbi_result_get_uint(res, "serveradmin"); name = dbi_result_get_string_copy(res, "name"); strncpy(r->name, name, MIN(29, strlen(name))); pass = dbi_result_get_string_copy(res, "password"); strcpy(r->password, pass); add_registration(s, r); /* free temporary variables */ free(pass); free(name); } dbi_result_free(res); } return 1; }
void refresh_database(dbi_conn conn) { dbi_result result; char qry[1024]; sprintf(qry, "SELECT pr_pop3_def.id, pr_pop3_def.domid, pr_pop3_def.tblid, pr_realm.name, " " pr_pop3_def.ipaddress, pr_pop3_def.username, " " pr_pop3_def.password, " " pr_pop3_def.yellow, pr_pop3_def.red " "FROM pr_pop3_def, pr_realm " "WHERE pr_pop3_def.id > 1 and pr_pop3_def.disable <> 'yes'" " and pr_pop3_def.pgroup = '%d' and pr_realm.id = pr_pop3_def.domid", (unsigned)OPT_VALUE_GROUPID); result = db_query(conn, 1, qry); if (!result) { return; } while (dbi_result_next_row(result)) { int id; struct probedef *probe; id = dbi_result_get_uint(result, "id"); probe = g_hash_table_lookup(cache, &id); if (!probe) { probe = g_malloc0(sizeof(struct probedef)); if (dbi_result_get_uint(result, "domid") > 1) { probe->probeid = dbi_result_get_uint(result, "tblid"); probe->realm=strdup(dbi_result_get_string(result, "name")); } else { probe->probeid = probe->id; } g_hash_table_insert(cache, guintdup(id), probe); } if (probe->ipaddress) g_free(probe->ipaddress); probe->ipaddress = dbi_result_get_string_copy(result, "ipaddress"); if (probe->username) g_free(probe->username); probe->username = dbi_result_get_string_copy(result, "username"); if (probe->password) g_free(probe->password); probe->password = dbi_result_get_string_copy(result, "password"); probe->yellow = dbi_result_get_float(result, "yellow"); probe->red = dbi_result_get_float(result, "red"); if (probe->msg) g_free(probe->msg); probe->msg = NULL; probe->seen = 1; } if (dbi_conn_error_flag(conn)) { const char *errmsg; dbi_conn_error(conn, &errmsg); LOG(LOG_ERR, "%s", errmsg); g_hash_table_foreach(cache, reset_seen, NULL); } else { g_hash_table_foreach_remove(cache, return_seen, NULL); } dbi_result_free(result); }
const char *dbi_result_get_string_default_copy(dbi_result Result, const char *fieldname, const char *def) { const char *ret = dbi_result_get_string_copy(Result, fieldname); if (ret) return ret; return strdup(def); }
void refresh_database(database *db) { dbi_result result; char qry[1024]; char *error; sprintf(qry, "SELECT pr_mysqlstats_def.id, pr_mysqlstats_def.domid, pr_mysqlstats_def.tblid, pr_realm.name, " " pr_mysqlstats_def.ipaddress, pr_mysqlstats_def.dbname, " " pr_mysqlstats_def.dbuser, pr_mysqlstats_def.dbpasswd," " pr_mysqlstats_def.yellow, pr_mysqlstats_def.red " "FROM pr_mysqlstats_def, pr_realm " "WHERE pr_mysqlstats_def.id > 1 and pr_mysqlstats_def.disable <> 'yes'" " and pr_mysqlstats_def.pgroup = '%d' and pr_realm.id = pr_mysqlstats_def.domid", (unsigned)OPT_VALUE_GROUPID); result = db_query(db, 1, qry); if (!result) { return; } while (dbi_result_next_row(result)) { int id; struct probedef *probe; id = dbi_result_get_int(result, "id"); probe = g_hash_table_lookup(cache, &id); if (!probe) { probe = g_malloc0(sizeof(struct probedef)); probe->id = id; if (dbi_result_get_int(result, "domid") > 1) { probe->probeid = dbi_result_get_int(result, "tblid"); probe->realm = dbi_result_get_string_copy(result, "name"); } else { probe->probeid = probe->id; } //fprintf(stderr, "Adding %u\n", id); g_hash_table_insert(cache, guintdup(id), probe); } if (probe->ipaddress) g_free(probe->ipaddress); probe->ipaddress = dbi_result_get_string_copy(result, "ipaddress"); if (probe->dbname) g_free(probe->dbname); probe->dbname = dbi_result_get_string_copy(result, "dbname"); if (probe->dbuser) g_free(probe->dbuser); probe->dbuser = dbi_result_get_string_copy(result, "dbuser"); if (probe->dbpasswd) g_free(probe->dbpasswd); probe->dbpasswd = dbi_result_get_string_copy(result, "dbpasswd"); probe->yellow = dbi_result_get_float(result, "yellow"); probe->red = dbi_result_get_float(result, "yellow"); if (probe->msg) g_free(probe->msg); probe->msg = NULL; probe->seen = 1; } dbi_result_free(result); if (dbi_conn_error(db, &error) == DBI_ERROR_NONE) { g_hash_table_foreach_remove(cache, return_seen, NULL); } else { LOG(LOG_ERR, "%s", error); g_hash_table_foreach(cache, reset_seen, NULL); } }
unsigned int dbi_result_get_fields(dbi_result Result, const char *format, ...) { char **tokens, **fieldnames; unsigned int curidx = 0, numtokens = 0, uflag; va_list ap; if (!RESULT) return DBI_FIELD_ERROR; numtokens = _parse_field_formatstr(format, &tokens, &fieldnames); if (numtokens == DBI_FIELD_ERROR) { return numtokens; } va_start(ap, format); while (curidx < numtokens) { uflag = strlen(tokens[curidx]) > 1 && tokens[curidx][0] == 'u'; switch (tokens[curidx][strlen(tokens[curidx])-1]) { case 'c': /* char */ if (uflag) /* unsigned */ *va_arg(ap, unsigned char *) = dbi_result_get_uchar(Result, fieldnames[curidx]); else *va_arg(ap, char *) = dbi_result_get_char(Result, fieldnames[curidx]); break; case 'h': /* sHort ("S"tring was taken) */ if (uflag) /* unsigned */ *va_arg(ap, unsigned short *) = dbi_result_get_ushort(Result, fieldnames[curidx]); else *va_arg(ap, short *) = dbi_result_get_short(Result, fieldnames[curidx]); break; case 'l': /* 4-byte integer (both l and i work) */ case 'i': if (uflag) /* unsigned */ *va_arg(ap, unsigned int *) = dbi_result_get_uint(Result, fieldnames[curidx]); else *va_arg(ap, int *) = dbi_result_get_int(Result, fieldnames[curidx]); break; case 'L': /* long long */ if (uflag) /* unsigned */ *va_arg(ap, unsigned long long *) = dbi_result_get_ulonglong(Result, fieldnames[curidx]); else *va_arg(ap, long long *) = dbi_result_get_longlong(Result, fieldnames[curidx]); break; case 'f': /* float */ *va_arg(ap, float *) = dbi_result_get_float(Result, fieldnames[curidx]); break; case 'd': /* double */ *va_arg(ap, double *) = dbi_result_get_double(Result, fieldnames[curidx]); break; case 's': /* string */ *va_arg(ap, const char **) = dbi_result_get_string(Result, fieldnames[curidx]); break; case 'b': /* binary */ *va_arg(ap, const unsigned char **) = dbi_result_get_binary(Result, fieldnames[curidx]); break; case 'S': /* string copy */ *va_arg(ap, char **) = dbi_result_get_string_copy(Result, fieldnames[curidx]); break; case 'B': /* binary copy */ *va_arg(ap, unsigned char **) = dbi_result_get_binary_copy(Result, fieldnames[curidx]); break; case 'm': /* datetiMe (what... you have any better ideas?? */ *va_arg(ap, time_t *) = dbi_result_get_datetime(Result, fieldnames[curidx]); break; } curidx++; } va_end(ap); _free_string_list(tokens, numtokens); _free_string_list(fieldnames, numtokens); return numtokens; }
static void _bind_helper_string_copy(_field_binding_t *binding) { *(char **)binding->bindto = dbi_result_get_string_copy((dbi_result)binding->result, binding->fieldname); }
static ftpd_chroot_status_t ftpd_dbi_map_chroot(const request_rec *r, const char **ret_chroot, const char **ret_initroot) { ftpd_chroot_status_t ARV = FTPD_CHROOT_USER_NOT_FOUND; ftpd_dbi_config *conf; const char *query; const char *chroot; ftpd_dbi_rest *dbi_res; dbi_result result; ftpd_dbi_dconfig *dconf = ap_get_module_config(r->per_dir_config, &ftpd_dbi_module); conf = apr_hash_get(ftpd_dbi_config_hash, dconf->id, APR_HASH_KEY_STRING); if (conf == NULL) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "[mod_ftpd_dbi.c] - Server Config for \"%s\" was not found", dconf->id); return FTPD_CHROOT_FAIL; } ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "[mod_ftpd_dbi.c] Attempting to Acquire DBI Connection"); apr_reslist_acquire(conf->pool, (void **) &dbi_res); /* make the query to get the user's password */ if (conf->rec.isactive_field) { if (conf->rec.chroot_query == NULL) { query = "SELECT &{ChrootField} FROM &{Table} WHERE &{UsernameField}=&{GivenUsername} AND &{IsActiveField}!=0 LIMIT 0,1"; } else { query = conf->rec.chroot_query; } } else { if (conf->rec.chroot_query == NULL) { query = "SELECT &{ChrootField} FROM &{Table} WHERE &{UsernameField}=&{GivenUsername} LIMIT 0,1"; } else { query = conf->rec.chroot_query; } } /* perform the query */ if ((query = populate_querystring(r, query, conf, dconf, dbi_res, r->user)) && safe_dbi_query(dbi_res, &result, r, query) == 0) { /* store the query result */ if (dbi_result_next_row(result) && dbi_result_get_numrows(result) == 1) { chroot = dbi_result_get_string_copy(result, conf->rec.chroot_field); if ((chroot == NULL) || (strcmp(chroot, "ERROR") == 0)) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "[mod_ftpd_dbi.c] - libdbi returned an error when retrieving the chroot."); ARV = FTPD_CHROOT_FAIL; } else { // XXXX: Do more checks of the chroot here! *ret_chroot = apr_pstrdup(r->pool, chroot); ARV = FTPD_CHROOT_USER_FOUND; } } else { if (dbi_result_get_numrows(result) == 0) { ARV = FTPD_CHROOT_USER_NOT_FOUND; } else { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "[mod_ftpd_dbi.c] %lu row(s) was not returned by dbi_result_get_numrows(result)", (unsigned long) dbi_result_get_numrows(result)); ARV = FTPD_CHROOT_FAIL; } } dbi_result_free(result); } else { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "[mod_ftpd_dbi.c] Query Failed!"); ARV = FTPD_CHROOT_FAIL; } safe_dbi_rel_server(conf->pool, dbi_res, r); return ARV; }