END_TEST START_TEST (uri_parse_params_test) { int res; const char *uri; char *host = NULL, *path = NULL, *username, *password; unsigned int port = 0; pr_table_t *params = NULL; params = pr_table_alloc(p, 1); mark_point(); uri = "sql://castaglia.org?foo"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res < 0, "Failed to handle invalid URI '%s'", uri); fail_unless(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL, strerror(errno), errno); mark_point(); pr_table_empty(params); uri = "sql://castaglia.org?foo="; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); res = pr_table_count(params); fail_unless(res == 1, "Expected 1 parameter, got %d", res); mark_point(); uri = "sql://castaglia.org?foo=&"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res < 0, "Failed to handle invalid URI '%s'", uri); fail_unless(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL, strerror(errno), errno); mark_point(); uri = "sql://castaglia.org?foo=bar&foo=baz"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); res = pr_table_count(params); fail_unless(res == 1, "Expected 1 parameter, got %d", res); mark_point(); uri = "sql://castaglia.org?foo=bar&baz=quxx&foo=baz"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); res = pr_table_count(params); fail_unless(res == 2, "Expected 2 parameters, got %d", res); pr_table_empty(params); pr_table_free(params); }
int vroot_fsio_closedir(pr_fs_t *fs, void *dirh) { int res; res = closedir((DIR *) dirh); if (vroot_dirtab != NULL) { unsigned long lookup_dirh; int count; lookup_dirh = (unsigned long) dirh; (void) pr_table_kremove(vroot_dirtab, &lookup_dirh, sizeof(unsigned long), NULL); /* If the dirtab table is empty, destroy the table. */ count = pr_table_count(vroot_dirtab); if (count == 0) { pr_table_empty(vroot_dirtab); destroy_pool(vroot_dir_pool); vroot_dir_pool = NULL; vroot_dirtab = NULL; vroot_dir_aliases = NULL; vroot_dir_idx = -1; } } return res; }
END_TEST START_TEST (uri_parse_path_test) { int res; const char *uri; char *expected, *host = NULL, *path = NULL, *username, *password; unsigned int port = 0; pr_table_t *params = NULL; params = pr_table_alloc(p, 1); mark_point(); uri = "sql://castaglia.org"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); fail_unless(path == NULL, "Expected null path, got %s", path); mark_point(); uri = "sql://castaglia.org/path"; expected = "/path"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); fail_unless(path != NULL, "Expected path, got null"); fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected, path); mark_point(); uri = "sql://castaglia.org:1234/path/to/resource"; expected = "/path/to/resource"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); fail_unless(path != NULL, "Expected path, got null"); fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected, path); mark_point(); uri = "sql://castaglia.org:1234/path/to/resource?key=val"; expected = "/path/to/resource"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); fail_unless(path != NULL, "Expected path, got null"); fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected, path); pr_table_empty(params); pr_table_free(params); }
int var_free(void) { if (var_pool) { if (var_tab) { pr_table_empty(var_tab); pr_table_free(var_tab); } destroy_pool(var_pool); var_pool = NULL; var_tab = NULL; } return 0; }
void pr_auth_endpwent(pool *p) { cmd_rec *cmd = NULL; cmd = make_cmd(p, 0); (void) dispatch_auth(cmd, "endpwent", NULL); if (cmd->tmp_pool) { destroy_pool(cmd->tmp_pool); cmd->tmp_pool = NULL; } if (auth_tab) { pr_trace_msg(trace_channel, 5, "emptying authcache"); (void) pr_table_empty(auth_tab); (void) pr_table_free(auth_tab); auth_tab = NULL; } return; }
int pr_memcache_conn_close(pr_memcache_t *mcache) { if (mcache == NULL) { errno = EINVAL; return -1; } mcache->refcount--; if (mcache->refcount == 0) { memcached_free(mcache->mc); if (mcache->namespace_tab != NULL) { (void) pr_table_empty(mcache->namespace_tab); (void) pr_table_free(mcache->namespace_tab); mcache->namespace_tab = NULL; } } return 0; }
END_TEST START_TEST (uri_parse_real_uris_test) { int res; const char *uri; char *host = NULL, *path = NULL, *username = NULL, *password = NULL; char *expected; unsigned int port = 0; pr_table_t *params = NULL; params = pr_table_alloc(p, 1); mark_point(); host = path = username = password = NULL; port = 0; pr_table_empty(params); uri = "sql://*****:*****@server:12345/dbname"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); expected = "server"; fail_unless(host != NULL, "Expected host, got null"); fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'", expected, host); expected = "/dbname"; fail_unless(path != NULL, "Expected path, got null"); fail_unless(strcmp(path, expected) == 0, "Expected '%s', got '%s'", expected, path); expected = "user"; fail_unless(username != NULL, "Expected username, got null"); fail_unless(strcmp(username, expected) == 0, "Expected '%s', got '%s'", expected, username); expected = "pass"; fail_unless(password != NULL, "Expected password, got null"); fail_unless(strcmp(password, expected) == 0, "Expected '%s', got '%s'", expected, password); fail_unless(port == 12345, "Expected 12345, got %u", port); res = pr_table_count(params); fail_unless(res == 0, "Expected 0 parameters, got %d", res); mark_point(); host = path = username = password = NULL; port = 0; pr_table_empty(params); uri = "sql:///path/to/sqlite.db?database=dbname"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); expected = "/path/to/sqlite.db"; fail_unless(host != NULL, "Expected host, got null"); fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'", expected, host); fail_unless(path == NULL, "Expected null, got path '%s'", path); fail_unless(username == NULL, "Expected null, got username '%s'", username); fail_unless(password == NULL, "Expected null, got password '%s'", password); fail_unless(port == 0, "Expected 0, got %u", port); res = pr_table_count(params); fail_unless(res == 1, "Expected 1 parameter, got %d", res); /* Note that this will not parse as expected. Using an absolute path as * the hostname makes it hard to determine the URL path, as the same * path separators are used. */ mark_point(); host = path = username = password = NULL; port = 0; pr_table_empty(params); uri = "sql:///path/to/sqlite.db/dbname"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); expected = "/path/to/sqlite.db/dbname"; fail_unless(host != NULL, "Expected host, got null"); fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'", expected, host); fail_unless(path == NULL, "Expected null, got path '%s'", path); fail_unless(username == NULL, "Expected null, got username '%s'", username); fail_unless(password == NULL, "Expected null, got password '%s'", password); fail_unless(port == 0, "Expected 0, got %u", port); res = pr_table_count(params); fail_unless(res == 0, "Expected 0 parameters, got %d", res); mark_point(); host = path = username = password = NULL; port = 0; pr_table_empty(params); uri = "sql://*****:*****@localhost?database=proftpd&ctx=vhostctx&conf=vhostconf&map=vhostmap&base_id=7"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); expected = "localhost"; fail_unless(host != NULL, "Expected host, got null"); fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'", expected, host); fail_unless(path == NULL, "Expected null, got path '%s'", path); expected = "foo"; fail_unless(username != NULL, "Expected username, got null"); fail_unless(strcmp(username, expected) == 0, "Expected '%s', got '%s'", expected, username); expected = "bar"; fail_unless(password != NULL, "Expected password, got null"); fail_unless(strcmp(password, expected) == 0, "Expected '%s', got '%s'", expected, password); fail_unless(port == 0, "Expected 0, got %u", port); res = pr_table_count(params); fail_unless(res == 5, "Expected 5 parameters, got %d", res); mark_point(); host = path = username = password = NULL; port = 0; pr_table_empty(params); uri = "sql:///Users/tj/git/proftpd-mod_conf_sql/proftpd.db?ctx=ftpctx:id,parent_id,name,type,value&conf=ftpconf:id,type,value"; res = sqlconf_uri_parse(p, uri, &host, &port, &path, &username, &password, params); fail_unless(res == 0, "Failed to parse URI '%s': %s", uri, strerror(errno)); expected = "/Users/tj/git/proftpd-mod_conf_sql/proftpd.db"; fail_unless(host != NULL, "Expected host, got null"); fail_unless(strcmp(host, expected) == 0, "Expected '%s', got '%s'", expected, host); fail_unless(path == NULL, "Expected null, got path '%s'", path); fail_unless(username == NULL, "Expected null, got username"); fail_unless(password == NULL, "Expected null, got password"); fail_unless(port == 0, "Expected 0, got %u", port); res = pr_table_count(params); fail_unless(res == 2, "Expected 2 parameters, got %d", res); pr_table_empty(params); pr_table_free(params); }
int proxy_db_close(pool *p, const char *schema_name) { if (p == NULL) { errno = EINVAL; return -1; } if (proxy_dbh != NULL) { pool *tmp_pool; sqlite3_stmt *pstmt; int res; tmp_pool = make_sub_pool(p); /* If we're given a schema name, then just detach that schema from the * database handle. */ if (schema_name != NULL) { const char *stmt; stmt = pstrcat(tmp_pool, "DETACH DATABASE ", schema_name, ";", NULL); res = sqlite3_exec(proxy_dbh, stmt, NULL, NULL, NULL); if (res != SQLITE_OK) { pr_trace_msg(trace_channel, 2, "error detaching '%s' from existing SQLite handle using '%s': %s", schema_name, stmt, sqlite3_errmsg(proxy_dbh)); destroy_pool(tmp_pool); errno = EPERM; return -1; } destroy_pool(tmp_pool); return 0; } /* Make sure to close/finish any prepared statements associated with * the database. */ pstmt = sqlite3_next_stmt(proxy_dbh, NULL); while (pstmt != NULL) { sqlite3_stmt *next; const char *sql; pr_signals_handle(); next = sqlite3_next_stmt(proxy_dbh, pstmt); sql = pstrdup(tmp_pool, sqlite3_sql(pstmt)); res = sqlite3_finalize(pstmt); if (res != SQLITE_OK) { pr_trace_msg(trace_channel, 2, "error finishing prepared statement '%s': %s", sql, sqlite3_errmsg(proxy_dbh)); } else { pr_trace_msg(trace_channel, 18, "finished prepared statement '%s'", sql); } pstmt = next; } destroy_pool(tmp_pool); res = sqlite3_close(proxy_dbh); if (res != SQLITE_OK) { pr_trace_msg(trace_channel, 2, "error closing SQLite database: %s", sqlite3_errmsg(proxy_dbh)); errno = EPERM; return -1; } pr_trace_msg(trace_channel, 18, "%s", "closed SQLite database"); proxy_dbh = NULL; } pr_table_empty(prepared_stmts); pr_table_free(prepared_stmts); prepared_stmts = NULL; return 0; }