[asterisk-commits] qwell: branch group/ast_storage r66605 - in
/team/group/ast_storage: include/...
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Wed May 30 09:16:41 MST 2007
Author: qwell
Date: Wed May 30 11:16:40 2007
New Revision: 66605
URL: http://svn.digium.com/view/asterisk?view=rev&rev=66605
Log:
A few things I added during the drive home from astridevcon (no, I wasn't driving and coding)
Add a few fixes (ie; don't use malloc)
Add a new status function, so a storage backend can show additional information
Add a NULL backend
Add the ability to get the status of a single backend from the CLI
Modified:
team/group/ast_storage/include/asterisk/storage.h
team/group/ast_storage/main/storage.c
team/group/ast_storage/res/res_storage_file.c
team/group/ast_storage/res/res_storage_odbc.c
Modified: team/group/ast_storage/include/asterisk/storage.h
URL: http://svn.digium.com/view/asterisk/team/group/ast_storage/include/asterisk/storage.h?view=diff&rev=66605&r1=66604&r2=66605
==============================================================================
--- team/group/ast_storage/include/asterisk/storage.h (original)
+++ team/group/ast_storage/include/asterisk/storage.h Wed May 30 11:16:40 2007
@@ -43,7 +43,8 @@
void *(*opendir)(struct ast_storage *st, const char *objectpath);
int (*readdir)(struct ast_storage *st, void *dirptr, struct ast_storage_dirent *dirent);
int (*closedir)(struct ast_storage *st, void *dirptr);
- AST_LIST_ENTRY(ast_storage_be) list;
+ int (*status)(struct ast_storage *st, int fd);
+ AST_RWLIST_ENTRY(ast_storage_be) list;
struct ast_module *module;
};
@@ -124,6 +125,11 @@
*/
int ast_storage_count(struct ast_storage *st, const char *objectname);
+/*! \brief Get storage engine by name
+ * \param name Name of storage engine
+ */
+struct ast_storage_be *ast_storage_getbyname(const char *name);
+
/*! \brief Specify a backend specific parameter
* \param st Storage instance
* \param var Parameter name
Modified: team/group/ast_storage/main/storage.c
URL: http://svn.digium.com/view/asterisk/team/group/ast_storage/main/storage.c?view=diff&rev=66605&r1=66604&r2=66605
==============================================================================
--- team/group/ast_storage/main/storage.c (original)
+++ team/group/ast_storage/main/storage.c Wed May 30 11:16:40 2007
@@ -1,7 +1,7 @@
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 1999 - 2006, Digium, Inc.
+ * Copyright (C) 1999 - 2007, Digium, Inc.
*
* Mark Spencer <markster at digium.com>
*
@@ -33,25 +33,25 @@
#include "asterisk/linkedlists.h"
#include "asterisk/module.h"
-static AST_LIST_HEAD_STATIC(storage_engines, ast_storage_be);
+static AST_RWLIST_HEAD_STATIC(storage_engines, ast_storage_be);
int __ast_register_storage(const struct ast_storage_be *e, struct ast_module *mod)
{
struct ast_storage_be *tmp;
- if (AST_LIST_LOCK(&storage_engines)) {
- ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
- return -1;
- }
- AST_LIST_TRAVERSE(&storage_engines, tmp, list) {
+ if (AST_RWLIST_WRLOCK(&storage_engines)) {
+ ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
+ return -1;
+ }
+ AST_RWLIST_TRAVERSE(&storage_engines, tmp, list) {
if (!strcasecmp(e->name, tmp->name)) {
- AST_LIST_UNLOCK(&storage_engines);
+ AST_RWLIST_UNLOCK(&storage_engines);
ast_log(LOG_WARNING, "Tried to register storage engine '%s', already registered\n", e->name);
return -1;
}
}
if (!(tmp = ast_calloc(1, sizeof(*tmp)))) {
- AST_LIST_UNLOCK(&storage_engines);
+ AST_RWLIST_UNLOCK(&storage_engines);
return -1;
}
*tmp = *e;
@@ -59,8 +59,8 @@
memset(&tmp->list, 0, sizeof(tmp->list));
- AST_LIST_INSERT_HEAD(&storage_engines, tmp, list);
- AST_LIST_UNLOCK(&storage_engines);
+ AST_RWLIST_INSERT_TAIL(&storage_engines, tmp, list);
+ AST_RWLIST_UNLOCK(&storage_engines);
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "Registered storage engine '%s'\n", e->name);
@@ -72,19 +72,19 @@
struct ast_storage_be *tmp;
int res = -1;
- if (AST_LIST_LOCK(&storage_engines)) {
- ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
- return -1;
- }
- AST_LIST_TRAVERSE_SAFE_BEGIN(&storage_engines, tmp, list) {
+ if (AST_RWLIST_WRLOCK(&storage_engines)) {
+ ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
+ return -1;
+ }
+ AST_RWLIST_TRAVERSE_SAFE_BEGIN(&storage_engines, tmp, list) {
if (!strcasecmp(name, tmp->name)) {
- AST_LIST_REMOVE_CURRENT(&storage_engines, list);
+ AST_RWLIST_REMOVE_CURRENT(&storage_engines, list);
free(tmp);
res = 0;
}
}
- AST_LIST_TRAVERSE_SAFE_END
- AST_LIST_UNLOCK(&storage_engines);
+ AST_RWLIST_TRAVERSE_SAFE_END
+ AST_RWLIST_UNLOCK(&storage_engines);
if (!res) {
if (option_verbose > 1)
@@ -99,7 +99,7 @@
{
struct ast_storage_be *e;
- AST_LIST_TRAVERSE(&storage_engines, e, list) {
+ AST_RWLIST_TRAVERSE(&storage_engines, e, list) {
if (!strcasecmp(e->name, storage_type))
return e->new(uri);
}
@@ -163,6 +163,22 @@
return count;
}
+struct ast_storage_be *ast_storage_getbyname(const char *name)
+{
+ struct ast_storage_be *e;
+ if (AST_RWLIST_RDLOCK(&storage_engines)) {
+ ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
+ return NULL;
+ }
+
+ AST_RWLIST_TRAVERSE(&storage_engines, e, list) {
+ if (!strcasecmp(name, e->name))
+ break;
+ }
+ AST_RWLIST_UNLOCK(&storage_engines);
+ return e;
+}
+
static int show_storage_engines(int fd, int argc, char *argv[])
{
struct ast_storage_be *e;
@@ -172,33 +188,90 @@
return RESULT_SHOWUSAGE;
ast_cli(fd, "Storage Engine\n");
- if (AST_LIST_LOCK(&storage_engines)) {
- ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
- return -1;
- }
-
- AST_LIST_TRAVERSE(&storage_engines, e, list) {
+ if (AST_RWLIST_RDLOCK(&storage_engines)) {
+ ast_log(LOG_WARNING, "Unable to lock storage engine list\n");
+ return RESULT_FAILURE;
+ }
+
+ AST_RWLIST_TRAVERSE(&storage_engines, e, list) {
ast_cli(fd, "%s\n", e->name);
count_se++;
}
- AST_LIST_UNLOCK(&storage_engines);
- ast_cli(fd, "%d storage engines registered.\n", count_se);
+ AST_RWLIST_UNLOCK(&storage_engines);
+ ast_cli(fd, "%d storage engine%s registered.\n", count_se, count_se == 1 ? "" : "s");
return RESULT_SUCCESS;
+}
+
+static int show_storage_engine(int fd, int argc, char *argv[])
+{
+ struct ast_storage_be *e;
+
+ if (argc != 5)
+ return RESULT_SHOWUSAGE;
+
+ if ((e = ast_storage_getbyname(argv[4]))) {
+ ast_cli(fd, "Storage Engine: %s\n", e->name);
+ ast_cli(fd, "Can get : %s\n", e->get ? "yes" : "no");
+ ast_cli(fd, "Can put : %s\n", e->put ? "yes" : "no");
+ ast_cli(fd, "Can delete : %s\n", e->delete ? "yes" : "no");
+ ast_cli(fd, "Can opendir : %s\n", e->opendir ? "yes" : "no");
+ ast_cli(fd, "Can readdir : %s\n", e->readdir ? "yes" : "no");
+ ast_cli(fd, "Can closedir : %s\n", e->closedir ? "yes" : "no");
+ if (e->status) {
+ ast_cli(fd, "\n");
+ ast_cli(fd, "Additional status\n");
+ e->status((struct ast_storage *)e, fd);
+ }
+ } else {
+ ast_cli(fd, "No storage engine named '%s' found.\n", argv[4]);
+ }
+ return RESULT_SUCCESS;
+}
+
+static char *complete_show_storage_engines(const char *line, const char *word, int pos, int state)
+{
+ struct ast_storage_be *e;
+ char *ret = NULL;
+ int which = 0;
+ int wordlen = strlen(word);
+
+ AST_RWLIST_RDLOCK(&storage_engines);
+ AST_RWLIST_TRAVERSE(&storage_engines, e, list) {
+ if (!strncasecmp(word, e->name, wordlen) && ++which > state) {
+ ret = strdup(e->name);
+ break;
+ }
+ }
+ AST_RWLIST_UNLOCK(&storage_engines);
+
+ return ret;
}
char show_storage_engines_usage[] =
"Usage: core show storage engines\n"
" Displays currently registered storage engines (if any)\n";
+
+char show_storage_engine_usage[] =
+"Usage: core show storage engine <engine>\n"
+" Displays capabilities of requested storage engine\n";
struct ast_cli_entry cli_storage[] = {
{ { "core", "show", "storage", "engines" },
show_storage_engines, "Displays storage engines",
show_storage_engines_usage },
+
+ { { "core", "show", "storage", "engine", NULL },
+ show_storage_engine, "Displays storage engine capabilities",
+ show_storage_engine_usage, complete_show_storage_engines },
};
+const struct ast_storage_be null_se = {
+ .name = "null",
+};
+
int ast_storage_engine_init(void)
{
+ __ast_register_storage(&null_se, NULL);
ast_cli_register_multiple(cli_storage, sizeof(cli_storage) / sizeof(struct ast_cli_entry));
return 0;
}
-
Modified: team/group/ast_storage/res/res_storage_file.c
URL: http://svn.digium.com/view/asterisk/team/group/ast_storage/res/res_storage_file.c?view=diff&rev=66605&r1=66604&r2=66605
==============================================================================
--- team/group/ast_storage/res/res_storage_file.c (original)
+++ team/group/ast_storage/res/res_storage_file.c Wed May 30 11:16:40 2007
@@ -50,7 +50,7 @@
static struct ast_storage *se_new_file(const char *uri)
{
- struct ast_storage_file *fst = malloc(sizeof(struct ast_storage_file));
+ struct ast_storage_file *fst = ast_calloc(1, sizeof(struct ast_storage_file));
ast_copy_string(fst->rootpath, uri + 6, sizeof(fst->rootpath));
fst->be = &file_se;
return ((struct ast_storage *)fst);
@@ -154,7 +154,7 @@
static void *se_opendir_file(struct ast_storage *st, const char *objectpath)
{
struct ast_storage_file *fst = (struct ast_storage_file *)st;
- struct file_storage_dir *dir = malloc(sizeof *dir);
+ struct file_storage_dir *dir = ast_calloc(1, sizeof(*dir));
if (objectpath[0] == '/')
ast_copy_string(dir->path, objectpath, sizeof(dir->path));
Modified: team/group/ast_storage/res/res_storage_odbc.c
URL: http://svn.digium.com/view/asterisk/team/group/ast_storage/res/res_storage_odbc.c?view=diff&rev=66605&r1=66604&r2=66605
==============================================================================
--- team/group/ast_storage/res/res_storage_odbc.c (original)
+++ team/group/ast_storage/res/res_storage_odbc.c Wed May 30 11:16:40 2007
@@ -37,6 +37,7 @@
#include "asterisk/res_odbc.h"
#include "asterisk/app.h"
#include "asterisk/config.h"
+#include "asterisk/cli.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -579,6 +580,13 @@
return -1;
}
+static int se_status_odbc(struct ast_storage *st, int fd)
+{
+ struct ast_storage_odbc *ost = (struct ast_storage_odbc *)st;
+ ast_cli(fd, "Connected: %s\n", (ost->conn && ost->conn->up) ? "yes" : "no");
+ return 0;
+}
+
static const struct ast_storage_be odbc_se = {
.name = "odbc",
.new = se_new_odbc,
@@ -589,6 +597,7 @@
.opendir = se_opendir_odbc,
.readdir = se_readdir_odbc,
.closedir = se_closedir_odbc,
+ .status = se_status_odbc,
};
static int load_module(void)
More information about the asterisk-commits
mailing list