[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r3339 - in GNUnet: . src/applications/kvstore_sqlite src/ut
From: |
grothoff |
Subject: |
[GNUnet-SVN] r3339 - in GNUnet: . src/applications/kvstore_sqlite src/util/config_impl |
Date: |
Sun, 27 Aug 2006 15:51:21 -0700 (PDT) |
Author: grothoff
Date: 2006-08-27 15:51:18 -0700 (Sun, 27 Aug 2006)
New Revision: 3339
Modified:
GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c
GNUnet/src/util/config_impl/impl.c
GNUnet/todo
Log:
fixing kvstore
Modified: GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c
===================================================================
--- GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c 2006-08-27 22:13:36 UTC
(rev 3338)
+++ GNUnet/src/applications/kvstore_sqlite/kv_sqlite.c 2006-08-27 22:51:18 UTC
(rev 3339)
@@ -22,7 +22,7 @@
* @file applications/kvstore_sqlite/kv_sqlite.c
* @brief SQLite based implementation of the kvstore service
* @author Nils Durner
- *
+ * @author Christian Grothoff
* @todo Indexes, statistics
*
* Database: SQLite
@@ -41,66 +41,75 @@
* a failure of the command 'cmd' with the message given
* by strerror(errno).
*/
-#define DIE_SQLITE(cmd) do { GE_LOG(ectx, GE_FATAL | GE_ADMIN | GE_BULK,
_("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__,
sqlite3_errmsg(dbh->dbh)); abort(); } while(0);
+#define DIE_SQLITE(dbh, cmd) do { GE_LOG(ectx, GE_FATAL | GE_ADMIN | GE_BULK,
_("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__,
sqlite3_errmsg(dbh)); abort(); } while(0);
/**
* Log an error message at log-level 'level' that indicates
* a failure of the command 'cmd' on file 'filename'
* with the message given by strerror(errno).
*/
-#define LOG_SQLITE(level, cmd) do { GE_LOG(ectx, GE_ERROR | GE_ADMIN |
GE_BULK, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__,
sqlite3_errmsg(dbh->dbh)); } while(0);
+#define LOG_SQLITE(dbh, level, cmd) do { GE_LOG(ectx, GE_ERROR | GE_ADMIN |
GE_BULK, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__,
sqlite3_errmsg(dbh)); } while(0);
-static CoreAPIForApplication * coreAPI;
-
-static struct GE_Context * ectx;
-
/**
* @brief Wrapper for SQLite
*/
typedef struct {
- /* Native SQLite database handle - may not be shared between threads! */
- sqlite3 *dbh;
- /* Thread ID owning this handle */
+
+ /**
+ * Native SQLite database handle - may not be shared between threads!
+ */
+ sqlite3 * dbh;
+
+ /**
+ * Thread ID owning this handle
+ */
struct PTHREAD * tid;
- /* Synchronized access to sqlite */
- struct MUTEX * DATABASE_Lock_;
+
} sqliteHandle;
/**
* @brief Information about the database
*/
typedef struct {
- struct MUTEX * DATABASE_Lock_;
- /** name of the database */
- char *name;
+ /**
+ * bytes used
+ */
+ double payload;
- /** filename of this database */
- char *fn;
+ /**
+ * name of the database
+ */
+ char * name;
- /** bytes used */
- double payload;
+ /**
+ * filename of this database
+ */
+ char * fn;
- unsigned int lastSync;
-
- /* Open handles */
+ /**
+ * List of open handles
+ */
+ sqliteHandle ** handles;
+
+ /**
+ * Open handles (one per thread)
+ */
unsigned int handle_count;
- /* List of open handles */
- sqliteHandle *handles;
-
- /* Is database closed? */
- int closed;
+ unsigned int lastSync;
+
} sqliteDatabase;
+static CoreAPIForApplication * coreAPI;
-static unsigned int databases = 0;
+static struct GE_Context * ectx;
-static sqliteDatabase *dbs;
+static unsigned int databases;
-static sqliteHandle *getDBHandle(const char *name);
+static sqliteDatabase ** dbs;
-static struct MUTEX * databasesLock;
+static struct MUTEX * lock;
/**
* @brief Encode a binary buffer "in" of size n bytes so that it contains
@@ -129,7 +138,6 @@
}
out++;
}
-
return (int) (out - start);
}
@@ -162,58 +170,63 @@
* @brief Prepare a SQL statement
*/
static int sq_prepare(sqliteHandle *dbh,
- const char *zSql, /* SQL statement, UTF-8 encoded */
- sqlite3_stmt **ppStmt) { /* OUT: Statement handle */
+ const char *zSql, /* SQL statement, UTF-8 encoded */
+ sqlite3_stmt **ppStmt) { /* OUT: Statement handle */
char * dummy;
+
return sqlite3_prepare(dbh->dbh,
- zSql,
- strlen(zSql),
- ppStmt,
- (const char**) &dummy);
+ zSql,
+ strlen(zSql),
+ ppStmt,
+ (const char**) &dummy);
}
/**
- * @brief Create new database structure
+ * Get path to database file
*/
-static void new_db(sqliteDatabase *db,
- const char *name) {
- char *dir;
+static char * getDBFileName(const char * name) {
+ char * dir;
+ char * fn;
size_t mem;
- memset(db, sizeof(sqliteDatabase), 0);
-
- db->DATABASE_Lock_ = MUTEX_CREATE(NO);
-
- /* Get path to database file */
GC_get_configuration_value_filename(coreAPI->cfg,
"KEYVALUE_DATABASE",
"DIR",
VAR_DAEMON_DIRECTORY "/kvstore/",
&dir);
- mem = strlen(dir) + strlen(name) + 5;
- db->fn = (char *) MALLOC(mem);
- SNPRINTF(db->fn,
+ disk_directory_create(ectx, dir);
+ mem = strlen(dir) + strlen(name) + 6;
+ fn = MALLOC(mem);
+ SNPRINTF(fn,
mem,
"%s/%s.dat",
dir,
name);
- FREE(dir);
- db->name = STRDUP(name);
+ FREE(dir);
+ return fn;
}
/**
* @brief Get information about an open database
* @param name the name of the database
*/
-static sqliteDatabase *getDB(const char *name)
-{
+static sqliteDatabase * getDB(const char *name) {
unsigned int idx;
+ sqliteDatabase * db;
- for(idx = 0; idx < databases; idx++)
- if (!dbs[idx].closed && strcmp(dbs[idx].name, name) == 0)
- return dbs + idx;
-
- return NULL;
+ for (idx = 0; idx < databases; idx++)
+ if (0 == strcmp(dbs[idx]->name, name))
+ return dbs[idx];
+ db = MALLOC(sizeof(sqliteDatabase));
+ memset(db,
+ 0,
+ sizeof(sqliteDatabase));
+ db->fn = getDBFileName(name);
+ db->name = STRDUP(name);
+ APPEND(dbs,
+ databases,
+ db);
+ return db;
}
/**
@@ -223,60 +236,42 @@
* We therefore (re)open the database in each thread.
* @return the native SQLite database handle
*/
-static sqliteHandle *getDBHandle(const char *name) {
+static sqliteHandle * getDBHandle(const char *name) {
unsigned int idx;
- sqliteHandle *dbh = NULL;
- sqliteDatabase *db = NULL;
+ sqliteHandle * dbh;
+ sqliteDatabase * db;
- MUTEX_LOCK(databasesLock);
-
- /* Is database already open? */
+ MUTEX_LOCK(lock);
db = getDB(name);
- if (db == NULL)
- {
- GROW(dbs, databases, databases + 1);
- db = dbs + databases - 1;
-
- new_db(db, name);
- }
-
- MUTEX_UNLOCK(databasesLock);
- MUTEX_LOCK(db->DATABASE_Lock_);
-
- /* Was it opened by this thread? */
for (idx = 0; idx < db->handle_count; idx++)
- if (PTHREAD_TEST_SELF(db->handles[idx].tid)) {
- dbh = db->handles + idx;
- break;
+ if (PTHREAD_TEST_SELF(db->handles[idx]->tid)) {
+ sqliteHandle * ret = db->handles[idx];
+ MUTEX_UNLOCK(lock);
+ return ret;
}
-
- if (idx == db->handle_count) {
- /* we haven't opened the DB for this thread yet */
- GROW(db->handles,
- db->handle_count,
- db->handle_count + 1);
- dbh = db->handles + db->handle_count - 1;
- dbh->tid = PTHREAD_GET_SELF();
- dbh->DATABASE_Lock_ = db->DATABASE_Lock_;
-
- /* Open database */
- if (sqlite3_open(db->fn, &dbh->dbh) != SQLITE_OK) {
- GE_LOG(ectx, GE_ERROR | GE_BULK | GE_USER,
- _("Unable to initialize SQLite KVStore.\n"));
-
- FREE(db->fn);
- FREE(db);
- return NULL;
- }
-
- sqlite3_exec(dbh->dbh, "PRAGMA temp_store=MEMORY", NULL, NULL, NULL);
- sqlite3_exec(dbh->dbh, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
- sqlite3_exec(dbh->dbh, "PRAGMA count_changes=OFF", NULL, NULL, NULL);
- sqlite3_exec(dbh->dbh, "PRAGMA page_size=4096", NULL, NULL, NULL);
+ /* we haven't opened the DB for this thread yet */
+ dbh = MALLOC(sizeof(sqliteHandle));
+ dbh->tid = PTHREAD_GET_SELF();
+ if (sqlite3_open(db->fn,
+ &dbh->dbh) != SQLITE_OK) {
+ printf("FN: %s\n", db->fn);
+ LOG_SQLITE(dbh->dbh,
+ GE_ERROR | GE_BULK | GE_USER,
+ "sqlite3_open");
+ sqlite3_close(dbh->dbh);
+ MUTEX_UNLOCK(lock);
+ PTHREAD_REL_SELF(dbh->tid);
+ FREE(dbh);
+ return NULL;
}
-
- MUTEX_UNLOCK(db->DATABASE_Lock_);
-
+ APPEND(db->handles,
+ db->handle_count,
+ dbh);
+ sqlite3_exec(dbh->dbh, "PRAGMA temp_store=MEMORY", NULL, NULL, NULL);
+ sqlite3_exec(dbh->dbh, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+ sqlite3_exec(dbh->dbh, "PRAGMA count_changes=OFF", NULL, NULL, NULL);
+ sqlite3_exec(dbh->dbh, "PRAGMA page_size=4096", NULL, NULL, NULL);
+ MUTEX_UNLOCK(lock);
return dbh;
}
@@ -284,55 +279,46 @@
unsigned int idx;
for (idx = 0; idx < db->handle_count; idx++) {
- sqliteHandle * dbh = db->handles + idx;
+ sqliteHandle * dbh = db->handles[idx];
PTHREAD_REL_SELF(dbh->tid);
if (sqlite3_close(dbh->dbh) != SQLITE_OK)
- LOG_SQLITE(LOG_ERROR,
+ LOG_SQLITE(dbh->dbh,
+ LOG_ERROR,
"sqlite_close");
+ FREE(dbh);
}
- FREE(db->handles);
- db->handle_count = 0;
-
- MUTEX_DESTROY(db->DATABASE_Lock_);
+ GROW(db->handles,
+ db->handle_count,
+ 0);
FREE(db->fn);
FREE(db->name);
-
- db->closed = 1;
-}
-
-static void shutdown_database(sqliteDatabase *db)
-{
FREE(db);
}
-static void sqlite_shutdown() {
- unsigned int idx;
-
-#if DEBUG_SQLITE
- GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER, "SQLite KVStore: closing
database\n");
-#endif
-
- for (idx = 0; idx < databases; idx++)
- if (!dbs[idx].closed)
- {
- close_database(dbs + idx);
- shutdown_database(dbs + idx);
- }
-
- GROW(dbs, databases, 0);
-}
-
/**
* @brief Delete the database.
*/
-static void dropDatabase(const char *name) {
- sqliteDatabase *db = getDB(name);
-
- char *fn = STRDUP(db->fn);
- close_database(db);
+static void dropDatabase(const char * name) {
+ sqliteDatabase * db;
+ unsigned int idx;
+ char * fn;
+
+ MUTEX_LOCK(lock);
+ for (idx = 0; idx < databases; idx++) {
+ if (0 == strcmp(dbs[idx]->name, name)) {
+ db = dbs[idx];
+ close_database(db);
+ dbs[idx] = dbs[databases-1];
+ GROW(dbs,
+ databases,
+ databases - 1);
+ break;
+ }
+ }
+ fn = getDBFileName(name);
UNLINK(fn);
FREE(fn);
- db->closed = 1;
+ MUTEX_UNLOCK(lock);
}
/**
@@ -340,33 +326,36 @@
* @param table the name of the Key/Value-Table
* @return a handle
*/
-static KVHandle *getTable(const char *database, const char *table)
-{
+static KVHandle *getTable(const char *database,
+ const char *table) {
sqlite3_stmt *stmt;
unsigned int len;
KVHandle *ret;
sqliteHandle *dbh;
char *idx;
- dbh = getDBHandle(database);
- MUTEX_LOCK(dbh->DATABASE_Lock_);
-
- sq_prepare(dbh, "Select 1 from sqlite_master where tbl_name = ?",
- &stmt);
+ dbh = getDBHandle(database);
+ if (dbh == NULL)
+ return NULL;
+ sq_prepare(dbh,
+ "Select 1 from sqlite_master where tbl_name = ?",
+ &stmt);
len = strlen(table);
sqlite3_bind_text(stmt, 1, table, len, SQLITE_STATIC);
- if (sqlite3_step(stmt) == SQLITE_DONE)
- {
+ if (sqlite3_step(stmt) == SQLITE_DONE) {
char *create = malloc(len + 58);
- sprintf(create, "CREATE TABLE %s (gn_key BLOB, gn_val BLOB, gn_age
BIGINT)", table);
+ sprintf(create,
+ "CREATE TABLE %s (gn_key BLOB, gn_val BLOB, gn_age BIGINT)",
+ table);
if (sqlite3_exec(dbh->dbh, create, NULL, NULL, NULL) != SQLITE_OK)
{
- LOG_SQLITE(LOG_ERROR, "sqlite_create");
+ LOG_SQLITE(dbh->dbh,
+ LOG_ERROR,
+ "sqlite_create");
sqlite3_finalize(stmt);
free(create);
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
return NULL;
}
@@ -376,11 +365,11 @@
/* FIXME: more indexes */
idx = (char *) malloc(len + 34);
- sprintf(idx, "CREATE INDEX idx_key ON %s (gn_key)", table);
+ sprintf(idx,
+ "CREATE INDEX idx_key ON %s (gn_key)",
+ table);
sqlite3_exec(dbh->dbh, idx, NULL, NULL, NULL);
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
ret = MALLOC(sizeof(KVHandle));
ret->table = STRDUP(table);
ret->db = STRDUP(database);
@@ -398,9 +387,13 @@
* @param handler callback function to be called for every result (may be NULL)
* @param closure optional parameter for handler
*/
-static void *get(KVHandle *kv, void *key, int keylen, unsigned int sort,
- unsigned int limit, KVCallback handler, void *closure)
-{
+static void *get(KVHandle *kv,
+ void *key,
+ int keylen,
+ unsigned int sort,
+ unsigned int limit,
+ KVCallback handler,
+ void *closure) {
unsigned int len, enclen, retlen;
char *sel, *order, *where, limit_spec[30];
sqlite3_stmt *stmt;
@@ -409,6 +402,9 @@
unsigned char *key_enc;
void *ret_dec;
+ dbh = getDBHandle(kv->db);
+ if (dbh == NULL)
+ return NULL;
ret = NULL;
ret_dec = NULL;
@@ -446,11 +442,13 @@
else
*limit_spec = 0;
- sprintf(sel, "SELECT gn_val FROM %s %s %s %s", kv->table, where, order,
limit_spec);
+ sprintf(sel,
+ "SELECT gn_val FROM %s %s %s %s",
+ kv->table,
+ where,
+ order,
+ limit_spec);
- dbh = getDBHandle(kv->db);
- MUTEX_LOCK(dbh->DATABASE_Lock_);
-
sq_prepare(dbh, sel, &stmt);
if (key)
sqlite3_bind_blob(stmt, 1, key_enc, enclen, SQLITE_STATIC);
@@ -472,20 +470,14 @@
FREE(sel);
FREENONNULL(key_enc);
FREE(ret_dec);
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
sqlite3_finalize(stmt);
return ret;
}
- }
-
+ }
sqlite3_finalize(stmt);
-
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
FREE(sel);
- FREENONNULL(key_enc);
-
+ FREENONNULL(key_enc);
return ret_dec;
}
@@ -509,10 +501,15 @@
unsigned char *key_enc, *val_enc;
unsigned int keyenc_len, valenc_len;
+ dbh = getDBHandle(kv->db);
+ if (dbh == NULL)
+ return SYSERR;
len = strlen(kv->table);
ins = MALLOC(len + 68);
- sprintf(ins, "INSERT INTO %s(gn_key, gn_val, gn_age) values (?, ?, ?)",
kv->table);
+ sprintf(ins,
+ "INSERT INTO %s(gn_key, gn_val, gn_age) values (?, ?, ?)",
+ kv->table);
key_enc = MALLOC(keylen * 2);
keyenc_len = sqlite_encode_binary(key, keylen, key_enc);
@@ -520,9 +517,6 @@
val_enc = MALLOC(vallen * 2);
valenc_len = sqlite_encode_binary(val, vallen, val_enc);
- dbh = getDBHandle(kv->db);
- MUTEX_LOCK(dbh->DATABASE_Lock_);
-
sq_prepare(dbh, ins, &stmt);
sqlite3_bind_blob(stmt, 1, key_enc, keyenc_len, SQLITE_STATIC);
sqlite3_bind_blob(stmt, 2, val_enc, valenc_len, SQLITE_STATIC);
@@ -532,17 +526,13 @@
FREE(ins);
FREE(key_enc);
FREE(val_enc);
- LOG_SQLITE(LOG_ERROR, "put");
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
- sqlite3_finalize(stmt);
-
+ LOG_SQLITE(dbh->dbh,
+ LOG_ERROR,
+ "put");
+ sqlite3_finalize(stmt);
return SYSERR;
- }
-
+ }
sqlite3_finalize(stmt);
-
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
FREE(ins);
FREE(key_enc);
FREE(val_enc);
@@ -566,7 +556,11 @@
sqliteHandle *dbh;
unsigned char *keyenc;
unsigned int keyenc_len;
-
+
+ dbh = getDBHandle(kv->db);
+ if (dbh == NULL)
+ return SYSERR;
+
len = strlen(kv->table);
del = MALLOC(len + 52);
bind = 1;
@@ -586,12 +580,8 @@
keyenc = MALLOC(keylen * 2);
keyenc_len = sqlite_encode_binary(key, keylen, keyenc);
- dbh = getDBHandle(kv->db);
- MUTEX_LOCK(dbh->DATABASE_Lock_);
-
sq_prepare(dbh, del, &stmt);
- if (key)
- {
+ if (key) {
sqlite3_bind_blob(stmt, 1, keyenc, keyenc_len, SQLITE_STATIC);
bind++;
}
@@ -603,17 +593,13 @@
{
FREE(del);
FREE(keyenc);
- LOG_SQLITE(LOG_ERROR, "delete");
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
+ LOG_SQLITE(dbh->dbh,
+ LOG_ERROR, "delete");
sqlite3_finalize(stmt);
return SYSERR;
- }
-
+ }
sqlite3_finalize(stmt);
-
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
FREE(del);
FREE(keyenc);
@@ -624,8 +610,7 @@
* @brief Close a handle to a Key/Value-Table
* @param kv the handle to close
*/
-static void closeTable(KVHandle *kv)
-{
+static void closeTable(KVHandle *kv) {
FREE(kv->table);
FREE(kv->db);
}
@@ -639,33 +624,24 @@
{
sqlite3_stmt *stmt;
sqliteHandle *dbh;
+ char * drop;
- char *drop = (void *) MALLOC(12 + strlen(kv->table));
-
- sprintf(drop, "DROP TABLE %s", kv->table);
dbh = getDBHandle(kv->db);
- MUTEX_LOCK(dbh->DATABASE_Lock_);
-
+ if (dbh == NULL)
+ return SYSERR;
+ drop = MALLOC(12 + strlen(kv->table));
+ sprintf(drop, "DROP TABLE %s", kv->table);
sq_prepare(dbh, drop, &stmt);
-
- if (sqlite3_step(stmt) != SQLITE_DONE)
- {
+ if (sqlite3_step(stmt) != SQLITE_DONE) {
FREE(drop);
- LOG_SQLITE(LOG_ERROR, "drop");
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
- sqlite3_finalize(stmt);
-
+ LOG_SQLITE(dbh->dbh,
+ LOG_ERROR, "drop");
+ sqlite3_finalize(stmt);
return SYSERR;
- }
-
+ }
sqlite3_finalize(stmt);
-
- MUTEX_UNLOCK(dbh->DATABASE_Lock_);
-
- FREE(drop);
-
+ FREE(drop);
closeTable(kv);
-
return OK;
}
@@ -677,10 +653,10 @@
#if DEBUG_SQLITE
GE_LOG(ectx,
GE_DEBUG | GE_REQUEST | GE_USER,
- "SQLite: initializing database\n");
+ "KV-SQLite: initializing database\n");
#endif
- databasesLock = MUTEX_CREATE(NO);
+ lock = MUTEX_CREATE(NO);
coreAPI = capi;
api.closeTable = &closeTable;
api.del = &del;
@@ -696,14 +672,19 @@
* Shutdown the module.
*/
void release_module_kvstore_sqlite() {
- sqlite_shutdown();
+ unsigned int idx;
+
+ for (idx = 0; idx < databases; idx++)
+ close_database(dbs[idx]);
+ GROW(dbs, databases, 0);
+
#if DEBUG_SQLITE
GE_LOG(ectx,
GE_DEBUG | GE_REQUEST | GE_USER,
"SQLite KVStore: database shutdown\n");
#endif
- MUTEX_DESTROY(databasesLock);
+ MUTEX_DESTROY(lock);
coreAPI = NULL;
}
Modified: GNUnet/src/util/config_impl/impl.c
===================================================================
--- GNUnet/src/util/config_impl/impl.c 2006-08-27 22:13:36 UTC (rev 3338)
+++ GNUnet/src/util/config_impl/impl.c 2006-08-27 22:51:18 UTC (rev 3339)
@@ -649,26 +649,29 @@
if (orig[i] == '\0')
return orig;
orig[i] = '\0';
- _get_configuration_value_string(cfg,
- section,
- &orig[1],
- NULL,
- &prefix);
- if (prefix == NULL)
- _get_configuration_value_string(cfg,
- "",
- &orig[1],
- NULL,
- &prefix);
- if (prefix == NULL) {
- const char * env = getenv(&orig[1]);
- if (env != NULL)
- prefix = STRDUP(env);
+ prefix = NULL;
+ if (0 != _get_configuration_value_string(cfg,
+ section,
+ &orig[1],
+ "",
+ &prefix)) {
+ FREE(prefix);
+ if (0 != _get_configuration_value_string(cfg,
+ "",
+ &orig[1],
+ "",
+ &prefix)) {
+ const char * env = getenv(&orig[1]);
+
+ FREE(prefix);
+ if (env != NULL) {
+ prefix = STRDUP(env);
+ } else {
+ orig[i] = DIR_SEPARATOR;
+ return orig;
+ }
+ }
}
- if (prefix == NULL) {
- orig[i] = DIR_SEPARATOR;
- return orig;
- }
result = MALLOC(strlen(prefix) +
strlen(&orig[i+1]) + 2);
strcpy(result, prefix);
Modified: GNUnet/todo
===================================================================
--- GNUnet/todo 2006-08-27 22:13:36 UTC (rev 3338)
+++ GNUnet/todo 2006-08-27 22:51:18 UTC (rev 3339)
@@ -21,7 +21,6 @@
+ use new loggers in for CS error reporting
* make testcases compile & pass again:
+ session -- compiles, but fails (peers do not connect!)
- + kvstore_sqlite -- compiles, but fails!
+ gap
+ fs/ecrs
+ fs/namespace
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r3339 - in GNUnet: . src/applications/kvstore_sqlite src/util/config_impl,
grothoff <=