#include <sys/sockio.h>
#endif
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/acl.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
* the GNU General Public License
*/
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/alaw.h"
#define AMI_MASK 0x55
#include <sys/stat.h>
#include <regex.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/file.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "asterisk/indications.h"
-#include "asterisk.h"
#define MAX_OTHER_FORMATS 10
#include <grp.h>
#include <pwd.h>
#include <sys/stat.h>
+#include <regex.h>
#if defined(__FreeBSD__) || defined( __NetBSD__ ) || defined(SOLARIS)
#include <netdb.h>
#endif
#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include "asterisk/cli.h"
#include "asterisk/config.h"
#include "asterisk/version.h"
#include "asterisk/build.h"
+#include "asterisk/linkedlists.h"
#include "defaults.h"
static int restartnow = 0;
static pthread_t consolethread = AST_PTHREADT_NULL;
+struct file_version {
+ const char *file;
+ const char *version;
+ AST_LIST_ENTRY(file_version) list;
+};
+
+static AST_LIST_HEAD_STATIC(file_versions, file_version);
+
+void ast_register_file_version(const char *file, const char *version)
+{
+ struct file_version *new;
+
+ new = calloc(1, sizeof(*new));
+ if (!new)
+ return;
+
+ new->file = file;
+ new->version = version;
+ AST_LIST_LOCK(&file_versions);
+ AST_LIST_INSERT_HEAD(&file_versions, new, list);
+ AST_LIST_UNLOCK(&file_versions);
+}
+
+void ast_unregister_file_version(const char *file)
+{
+ struct file_version *find;
+
+ AST_LIST_LOCK(&file_versions);
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&file_versions, find, list) {
+ if (!strcasecmp(find->file, file)) {
+ AST_LIST_REMOVE_CURRENT(&file_versions, list);
+ break;
+ }
+ }
+ AST_LIST_TRAVERSE_SAFE_END;
+ AST_LIST_UNLOCK(&file_versions);
+}
+
+static char show_version_files_help[] =
+"Usage: show version files [like <pattern>]\n"
+" Shows the revision numbers of the files used to build this copy of Asterisk.\n"
+" Optional regular expression pattern is used to filter the file list.\n";
+
+static int handle_show_version_files(int fd, int argc, char *argv[])
+{
+ struct file_version *iterator;
+
+ AST_LIST_LOCK(&file_versions);
+ AST_LIST_TRAVERSE(&file_versions, iterator, list) {
+ ast_cli(fd, "%-25.25s %-20.20s\n", iterator->file, iterator->version);
+ }
+ AST_LIST_UNLOCK(&file_versions);
+ return RESULT_SUCCESS;
+}
+
+static char *complete_show_version_files(char *line, char *word, int pos, int state)
+{
+ struct file_version *find;
+ int which = 0;
+ char *ret = NULL;
+ int matchlen = strlen(word);
+
+ if (pos != 3)
+ return NULL;
+
+ AST_LIST_LOCK(&file_versions);
+ AST_LIST_TRAVERSE(&file_versions, find, list) {
+ if (!strncasecmp(word, find->file, matchlen)) {
+ if (++which > state) {
+ ret = strdup(find->file);
+ break;
+ }
+ }
+ }
+ AST_LIST_UNLOCK(&file_versions);
+
+ return ret;
+}
+
int ast_register_atexit(void (*func)(void))
{
int res = -1;
"Restart Asterisk at empty call volume", restart_when_convenient_help },
{ { "!", NULL }, handle_bang,
"Execute a shell command", bang_help },
+ { { "show", "version", "files", NULL }, handle_show_version_files,
+ "Show versions of files used to build Asterisk", show_version_files_help, complete_show_version_files },
};
static int ast_el_read_char(EditLine *el, char *cp)
#include <string.h>
#include <time.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/cli.h"
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include <unistd.h>
#include <math.h> /* For PI */
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/pbx.h"
#include "asterisk/frame.h"
#include "asterisk/sched.h"
#include <math.h>
#include <ctype.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/ulaw.h"
#include "asterisk/alaw.h"
#include "asterisk/frame.h"
#include <stdio.h>
#include <signal.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/cdr.h"
#endif
#endif
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/pbx.h"
#include "asterisk/frame.h"
#include "asterisk/sched.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
#include "asterisk/transcap.h"
-#include "asterisk.h"
/* uncomment if you have problems with 'monitoring' synchronized files */
#if 0
#include <stdlib.h>
#include <string.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/chanvars.h"
#include "asterisk/logger.h"
#include <string.h>
#include <ctype.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include "asterisk/cli.h"
/* For rl_filename_completion */
#include "editline/readline/readline.h"
/* For module directory */
-#include "asterisk.h"
#include "asterisk/version.h"
#include "asterisk/build.h"
return RESULT_SUCCESS;
}
-#define MODLIST_FORMAT "%-30s %-40.40s %-20.20s %-10d\n"
-#define MODLIST_FORMAT2 "%-30s %-40.40s %-20.20s %-10s\n"
+#define MODLIST_FORMAT "%-30s %-40.40s %-10d\n"
+#define MODLIST_FORMAT2 "%-30s %-40.40s %-10s\n"
AST_MUTEX_DEFINE_STATIC(climodentrylock);
static int climodentryfd = -1;
-static int modlist_modentry(const char *module, const char *description, int usecnt, const char *version, const char *like)
+static int modlist_modentry(const char *module, const char *description, int usecnt, const char *like)
{
/* Comparing the like with the module */
if (strstr(module, like) != NULL) {
- ast_cli(climodentryfd, MODLIST_FORMAT, module, description, version, usecnt);
+ ast_cli(climodentryfd, MODLIST_FORMAT, module, description, usecnt);
return 1;
}
return 0;
ast_mutex_lock(&climodentrylock);
climodentryfd = fd;
- ast_cli(fd, MODLIST_FORMAT2, "Module", "Description", "Version", "Use Count");
+ ast_cli(fd, MODLIST_FORMAT2, "Module", "Description", "Use Count");
ast_cli(fd,"%d modules loaded\n", ast_update_module_list(modlist_modentry, like));
climodentryfd = -1;
ast_mutex_unlock(&climodentrylock);
int y;
int match;
struct ast_cli_entry *e=NULL;
+
+ for (e=helpers;e;e=e->next) {
+ match = 1;
+ for (y=0;match && cmds[y]; y++) {
+ if (!e->cmda[y] && !exact)
+ break;
+ if (!e->cmda[y] || strcasecmp(e->cmda[y], cmds[y]))
+ match = 0;
+ }
+ if ((exact > -1) && e->cmda[y])
+ match = 0;
+ if (match)
+ break;
+ }
+ if (e)
+ return e;
for (x=0;builtins[x].cmda[0];x++) {
/* start optimistic */
match = 1;
if (match)
return &builtins[x];
}
- for (e=helpers;e;e=e->next) {
- match = 1;
- for (y=0;match && cmds[y]; y++) {
- if (!e->cmda[y] && !exact)
- break;
- if (!e->cmda[y] || strcasecmp(e->cmda[y], cmds[y]))
- match = 0;
- }
- if ((exact > -1) && e->cmda[y])
- match = 0;
- if (match)
- break;
- }
- return e;
+ return NULL;
}
static void join(char *dest, size_t destsize, char *w[])
# include <glob.h>
#endif
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/config.h"
#include "asterisk/cli.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/channel.h"
#include "asterisk/app.h"
-#include "asterisk.h"
#define MAX_NESTED_COMMENTS 128
#define COMMENT_START ";--"
#include <string.h>
#include <errno.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/config.h"
#include "asterisk/logger.h"
#include <unistd.h>
#include <dirent.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/app.h"
#include "asterisk/lock.h"
#include "asterisk/manager.h"
#include "db1-ast/include/db.h"
-#include "asterisk.h"
static DB *astdb;
AST_MUTEX_DEFINE_STATIC(dblock);
#include <resolv.h>
#include <unistd.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/dns.h"
#include <regex.h>
#include <signal.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/dnsmgr.h"
#include "asterisk/linkedlists.h"
#include "asterisk/utils.h"
#include "asterisk/sched.h"
#include "asterisk/options.h"
#include "asterisk/cli.h"
-#include "asterisk.h"
static struct sched_context *sched;
static int refresh_sched = -1;
#include <errno.h>
#include <stdio.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/frame.h"
#include "asterisk/channel.h"
#include "asterisk/logger.h"
#include <unistd.h>
#include <errno.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include "asterisk/enum.h"
#include <sys/types.h>
#include <sys/stat.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/frame.h"
#include "asterisk/file.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
-#include "asterisk.h"
struct ast_format {
/* Name of format */
#include <errno.h>
#include <stdio.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/lock.h"
#include "asterisk/frame.h"
#include "asterisk/logger.h"
#include "asterisk/cli.h"
#include "asterisk/term.h"
#include "asterisk/utils.h"
-#include "asterisk.h"
#ifdef TRACE_FRAMES
static int headers = 0;
#include <stdio.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/fskmodem.h"
#define NBW 2
#include <sys/types.h>
#include <stdlib.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "pbx_functions.h"
{
return ASTERISK_GPL_KEY;
}
-
-const char *version()
-{
- return "$Revision$";
-}
#include <errno.h>
#include <unistd.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/sched.h"
#include "asterisk/options.h"
#include "asterisk/channel.h"
#include "asterisk/translate.h"
#include "asterisk/cli.h"
#include "asterisk/lock.h"
-#include "asterisk.h"
static struct ast_imager *list;
AST_MUTEX_DEFINE_STATIC(listlock);
*
* General Definitions for Asterisk top level program
*
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999-2005, Mark Spencer
*
- * Mark Spencer <markster@linux-support.net>
+ * Mark Spencer <markster@digium.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
extern int dnsmgr_init(void);
extern void dnsmgr_reload(void);
-#endif
+void ast_register_file_version(const char *file, const char *version);
+void ast_unregister_file_version(const char *file);
+
+#ifdef __GNUC__
+#define ASTERISK_FILE_VERSION(x) \
+ static void __attribute__((constructor)) __register_file_version(void) \
+ { \
+ ast_register_file_version(__FILE__, x); \
+ } \
+ static void __attribute__((destructor)) __unregister_file_version(void) \
+ { \
+ ast_unregister_file_version(__FILE__); \
+ }
+#else /* ! __GNUC__ */
+#define ASTERISK_FILE_VERSION(x) static const char __file_version[] = x;
+#endif /* __GNUC__ */
+
+#endif /* _ASTERISK_H */
Example usage:
\code
- static AST_LIST_HEAD_STATIC(entry_list, entry) entries;
+ static AST_LIST_HEAD_STATIC(entry_list, entry);
\endcode
- This would define \c struct \c entry_list, and declare an instance of it named
- \a entries, all intended to hold a list of type \c struct \c entry.
+ This would define \c struct \c entry_list, intended to hold a list of
+ type \c struct \c entry.
*/
#define AST_LIST_HEAD_STATIC(name, type) \
-struct name { \
+struct name { \
struct type *first; \
ast_mutex_t lock; \
} name = { \
*/
int reload(void); /*! reload configs */
-const char *version(void);
-
#define ASTERISK_GPL_KEY \
"This paragraph is Copyright (C) 2000, Linux Support Services, Inc. \
In order for your module to load, it must return this key via a function \
* For each of the modules loaded, modentry will be executed with the resource, description,
* version, and usecount values of each particular module.
*/
-int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *version, const char *like),
+int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *like),
const char *like);
/*! Ask this procedure to be run with modules have been updated */
#include <string.h>
#include <math.h> /* For PI */
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/indications.h"
#include "asterisk/frame.h"
#include "asterisk/options.h"
#include <string.h> /* for memset */
#include <sys/ioctl.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/io.h"
#include "asterisk/logger.h"
#include <stdlib.h>
#include <string.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "jitterbuf.h"
/* define these here, just for ancient compiler systems */
#include <stdlib.h>
#include <string.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/module.h"
#include "asterisk/options.h"
#include "asterisk/config.h"
#include <dlfcn.h>
#endif
#include "asterisk/md5.h"
-#include "asterisk.h"
#ifndef RTLD_NOW
#define RTLD_NOW 0
char *(*description)(void);
char *(*key)(void);
int (*reload)(void);
- const char *(*version)(void);
void *lib;
char resource[256];
struct module *next;
return reloaded;
}
-static const char *unknown_version(void)
-{
- return "--unknown--";
-}
-
static int __load_resource(const char *resource_name, const struct ast_config *cfg)
{
static char fn[256];
if (m->reload == NULL)
m->reload = dlsym(m->lib, "_reload");
- m->version = dlsym(m->lib, "version");
- if (m->version == NULL)
- m->version = dlsym(m->lib, "_version");
- if (m->version == NULL)
- m->version = unknown_version;
-
if (!m->key || !(key = m->key())) {
ast_log(LOG_WARNING, "Key routine returned NULL in module %s\n", fn);
key = NULL;
}
-int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *version, const char *like),
+int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *like),
const char *like)
{
struct module *m;
unlock = 0;
m = module_list;
while (m) {
- char ver_string[80];
-
- ast_copy_string(ver_string, m->version(), sizeof(ver_string));
- total_mod_loaded += modentry(m->resource, m->description(), m->usecount(), ast_strip(ast_strip_quoted(ver_string, "$", "$")), like);
+ total_mod_loaded += modentry(m->resource, m->description(), m->usecount(), like);
m = m->next;
}
if (unlock)
from <syslog.h> which is included by logger.h */
#include <syslog.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/lock.h"
#include "asterisk/options.h"
#include "asterisk/channel.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
-#include "asterisk.h"
static int syslog_level_map[] = {
LOG_DEBUG,
#include <errno.h>
#include <unistd.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/manager.h"
*/
#include <string.h> /* for memcpy() */
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/endian.h"
#include "asterisk/md5.h"
#include <time.h>
#include <sys/time.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/lock.h"
#include "asterisk/cli.h"
#include "asterisk/pbx.h"
#include "asterisk/causes.h"
#include "asterisk/musiconhold.h"
#include "asterisk/app.h"
-#include "asterisk.h"
/*
* I M P O R T A N T :
#include <math.h>
#include <limits.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/plc.h"
#if !defined(FALSE)
#include <unistd.h>
#include <dirent.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/app.h"
#include "asterisk/privacy.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
-#include "asterisk.h"
int ast_privacy_check(char *dest, char *cid)
{
#include <arpa/inet.h>
#include <fcntl.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/rtp.h"
#include "asterisk/frame.h"
#include "asterisk/logger.h"
#include <time.h>
#include <ctype.h>
#include <math.h>
+#include <stdio.h>
#ifdef SOLARIS
#include <iso/limits_iso.h>
#endif
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/logger.h"
#include "asterisk/lock.h"
#include "asterisk/localtime.h"
#include "asterisk/utils.h"
-#include "asterisk.h"
-#include <stdio.h>
/* Forward declaration */
static int wait_file(struct ast_channel *chan, const char *ints, const char *file, const char *lang);
#include <unistd.h>
#include <string.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/sched.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include <string.h>
#include <unistd.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/channel.h"
#include "asterisk/logger.h"
#include "asterisk/srv.h"
#include <math.h>
#include <ctype.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/ulaw.h"
#include "asterisk/tdd.h"
#include "asterisk/logger.h"
#include <fcntl.h>
#include <unistd.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/term.h"
#include "asterisk/options.h"
#include "asterisk/lock.h"
#include <string.h>
#include <stdio.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/logger.h"
* the GNU General Public License
*/
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/ulaw.h"
#define ZEROTRAP /* turn on the trap as per the MIL-STD */
#include <netinet/in.h>
#include <arpa/inet.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION("$Revision$")
+
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/io.h"