@ -47,6 +47,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
# include "asterisk/app.h"
# include "asterisk/utils.h"
# include "asterisk/config.h"
# include "asterisk/options.h"
AST_MUTEX_DEFINE_STATIC ( monitorlock ) ;
@ -156,6 +157,7 @@ int ast_monitor_start( struct ast_channel *chan, const char *format_spec,
/* Determine file names */
if ( ! ast_strlen_zero ( fname_base ) ) {
int directory = strchr ( fname_base , ' / ' ) ? 1 : 0 ;
const char * absolute = * fname_base = = ' / ' ? " " : " / " ;
/* try creating the directory just in case it doesn't exist */
if ( directory ) {
char * name = strdup ( fname_base ) ;
@ -163,10 +165,10 @@ int ast_monitor_start( struct ast_channel *chan, const char *format_spec,
free ( name ) ;
ast_safe_system ( tmp ) ;
}
snprintf ( monitor - > read_filename , FILENAME_MAX , " %s / %s-in" ,
directory ? " " : ast_config_AST_MONITOR_DIR , fname_base) ;
snprintf ( monitor - > write_filename , FILENAME_MAX , " %s / %s-out" ,
directory ? " " : ast_config_AST_MONITOR_DIR , fname_base) ;
snprintf ( monitor - > read_filename , FILENAME_MAX , " %s %s %s-in" ,
directory ? " " : ast_config_AST_MONITOR_DIR , absolute, fname_base) ;
snprintf ( monitor - > write_filename , FILENAME_MAX , " %s %s %s-out" ,
directory ? " " : ast_config_AST_MONITOR_DIR , absolute, fname_base) ;
ast_copy_string ( monitor - > filename_base , fname_base , sizeof ( monitor - > filename_base ) ) ;
} else {
ast_mutex_lock ( & monitorlock ) ;
@ -300,6 +302,7 @@ int ast_monitor_stop(struct ast_channel *chan, int need_lock)
int directory = strchr ( name , ' / ' ) ? 1 : 0 ;
char * dir = directory ? " " : ast_config_AST_MONITOR_DIR ;
const char * execute , * execute_args ;
const char * absolute = * name = = ' / ' ? " " : " / " ;
/* Set the execute application */
execute = pbx_builtin_getvar_helper ( chan , " MONITOR_EXEC " ) ;
@ -317,9 +320,9 @@ int ast_monitor_stop(struct ast_channel *chan, int need_lock)
execute_args = " " ;
}
snprintf ( tmp , sizeof ( tmp ) , " %s \" %s /%s-in.%s\" \" %s/%s-out.%s \" \" %s/ %s.%s\" %s & " , execute , dir , name, format , dir , name, format , dir , name , format , execute_args ) ;
snprintf ( tmp , sizeof ( tmp ) , " %s \" %s %s%s-in.%s\" \" %s%s%s-out.%s \" \" %s%s %s.%s\" %s & " , execute , dir , absolute, name, format , dir , absolute, name, format , dir , absolute , name , format , execute_args ) ;
if ( delfiles ) {
snprintf ( tmp2 , sizeof ( tmp2 ) , " ( %s& rm -f \" %s / %s-\" * ) & " , tmp , dir , name ) ; /* remove legs when done mixing */
snprintf ( tmp2 , sizeof ( tmp2 ) , " ( %s& rm -f \" %s %s %s-\" * ) & " , tmp , dir , absolute , name ) ; /* remove legs when done mixing */
ast_copy_string ( tmp , tmp2 , sizeof ( tmp ) ) ;
}
ast_log ( LOG_DEBUG , " monitor executing %s \n " , tmp ) ;
@ -373,6 +376,18 @@ int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, i
if ( chan - > monitor ) {
int directory = strchr ( fname_base , ' / ' ) ? 1 : 0 ;
const char * absolute = * fname_base = = ' / ' ? " " : " / " ;
char tmpstring [ sizeof ( chan - > monitor - > filename_base ) ] = " " ;
/* before continuing, see if we're trying to rename the file to itself... */
snprintf ( tmpstring , sizeof ( tmpstring ) , " %s%s%s " , directory ? " " : ast_config_AST_MONITOR_DIR , absolute , fname_base ) ;
if ( ! strcmp ( tmpstring , chan - > monitor - > filename_base ) ) {
if ( option_debug > 2 )
ast_log ( LOG_DEBUG , " No need to rename monitor filename to itself \n " ) ;
UNLOCK_IF_NEEDED ( chan , need_lock ) ;
return 0 ;
}
/* try creating the directory just in case it doesn't exist */
if ( directory ) {
char * name = strdup ( fname_base ) ;
@ -381,7 +396,7 @@ int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, i
ast_safe_system ( tmp ) ;
}
snprintf ( chan - > monitor - > filename_base , FILENAME_MAX, " %s/%s " , directory ? " " : ast_config_AST_MONITOR_DIR , fname_base ) ;
ast_copy_string ( chan - > monitor - > filename_base , tmpstring, sizeof ( chan - > monitor - > filename_base ) ) ;
chan - > monitor - > filename_changed = 1 ;
} else {
ast_log ( LOG_WARNING , " Cannot change monitor filename of channel %s to %s, monitoring not started \n " , chan - > name , fname_base ) ;