#include "asterisk.h"
#include <sys/stat.h> /* stat(2) */
+#include <libgen.h> /* dirname and basename */
#include "asterisk/module.h"
#include "asterisk/channel.h"
<ref type="function">FILE_COUNT_LINE</ref>
</see-also>
</function>
+ <function name="BASENAME" language="en_US">
+ <synopsis>
+ Return the name of a file.
+ </synopsis>
+ <syntax>
+ <parameter name="filename" required="true" />
+ </syntax>
+ <description>
+ <para>Return the base file name, given a full file path.</para>
+ <example title="Directory name">
+ same => n,Set(basename=${BASENAME(/etc/asterisk/extensions.conf)})
+ same => n,NoOp(${basename}) ; outputs extensions.conf
+ </example>
+ </description>
+ <see-also>
+ <ref type="function">DIRNAME</ref>
+ </see-also>
+ </function>
+ <function name="DIRNAME" language="en_US">
+ <synopsis>
+ Return the directory of a file.
+ </synopsis>
+ <syntax>
+ <parameter name="filename" required="true" />
+ </syntax>
+ <description>
+ <para>Return the directory of a file, given a full file path.</para>
+ <example title="Directory name">
+ same => n,Set(dirname=${DIRNAME(/etc/asterisk/extensions.conf)})
+ same => n,NoOp(${dirname}) ; outputs /etc/asterisk
+ </example>
+ </description>
+ <see-also>
+ <ref type="function">BASENAME</ref>
+ </see-also>
+ </function>
***/
static int env_read(struct ast_channel *chan, const char *cmd, char *data,
return 0;
}
+static int file_dirname(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
+{
+ char *ret = NULL;
+
+ *buf = '\0';
+
+ if (data) {
+ ret = dirname(data);
+ }
+
+ if (ret) {
+ ast_copy_string(buf, ret, len);
+ }
+
+ return 0;
+}
+
+static int file_basename(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
+{
+ char *ret = NULL;
+
+ *buf = '\0';
+
+ if (data) {
+ ret = basename(data);
+ }
+
+ if (ret) {
+ ast_copy_string(buf, ret, len);
+ }
+
+ return 0;
+}
+
static int file_read(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
{
FILE *ff;
.read_max = 2,
};
+static struct ast_custom_function file_dirname_function = {
+ .name = "DIRNAME",
+ .read = file_dirname,
+ .read_max = 12,
+};
+
+static struct ast_custom_function file_basename_function = {
+ .name = "BASENAME",
+ .read = file_basename,
+ .read_max = 12,
+};
+
static int unload_module(void)
{
int res = 0;
res |= ast_custom_function_unregister(&file_function);
res |= ast_custom_function_unregister(&file_count_line_function);
res |= ast_custom_function_unregister(&file_format_function);
+ res |= ast_custom_function_unregister(&file_dirname_function);
+ res |= ast_custom_function_unregister(&file_basename_function);
return res;
}
res |= ast_custom_function_register_escalating(&file_function, AST_CFE_BOTH);
res |= ast_custom_function_register_escalating(&file_count_line_function, AST_CFE_READ);
res |= ast_custom_function_register_escalating(&file_format_function, AST_CFE_READ);
+ res |= ast_custom_function_register(&file_dirname_function);
+ res |= ast_custom_function_register(&file_basename_function);
return res;
}