@ -142,6 +142,7 @@ static struct vmstate *vmstates = NULL;
/* Don't modify these here; set your umask at runtime instead */
/* Don't modify these here; set your umask at runtime instead */
# define VOICEMAIL_DIR_MODE 0777
# define VOICEMAIL_DIR_MODE 0777
# define VOICEMAIL_FILE_MODE 0666
# define VOICEMAIL_FILE_MODE 0666
# define CHUNKSIZE 65536
# define VOICEMAIL_CONFIG "voicemail.conf"
# define VOICEMAIL_CONFIG "voicemail.conf"
# define ASTERISK_USERNAME "asterisk"
# define ASTERISK_USERNAME "asterisk"
@ -1088,6 +1089,7 @@ static int retrieve_file(char *dir, int msgnum)
goto yuck ;
goto yuck ;
}
}
if ( ! strcasecmp ( coltitle , " recording " ) ) {
if ( ! strcasecmp ( coltitle , " recording " ) ) {
off_t offset ;
res = SQLGetData ( stmt , x + 1 , SQL_BINARY , NULL , 0 , & colsize2 ) ;
res = SQLGetData ( stmt , x + 1 , SQL_BINARY , NULL , 0 , & colsize2 ) ;
fdlen = colsize2 ;
fdlen = colsize2 ;
if ( fd > - 1 ) {
if ( fd > - 1 ) {
@ -1098,24 +1100,26 @@ static int retrieve_file(char *dir, int msgnum)
fd = - 1 ;
fd = - 1 ;
continue ;
continue ;
}
}
if ( fd > - 1 ) {
/* Read out in small chunks */
if ( ( fdm = mmap ( NULL , fdlen , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 ) ) = = - 1 ) {
for ( offset = 0 ; offset < colsize2 ; offset + = CHUNKSIZE ) {
/* +1 because SQLGetData likes null-terminating binary data */
if ( ( fdm = mmap ( NULL , CHUNKSIZE + 1 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , offset ) ) = = ( void * ) - 1 ) {
ast_log ( LOG_WARNING , " Could not mmap the output file: %s (%d) \n " , strerror ( errno ) , errno ) ;
ast_log ( LOG_WARNING , " Could not mmap the output file: %s (%d) \n " , strerror ( errno ) , errno ) ;
SQLFreeHandle ( SQL_HANDLE_STMT , stmt ) ;
SQLFreeHandle ( SQL_HANDLE_STMT , stmt ) ;
ast_odbc_release_obj ( obj ) ;
ast_odbc_release_obj ( obj ) ;
goto yuck ;
goto yuck ;
} else {
res = SQLGetData ( stmt , x + 1 , SQL_BINARY , fdm , CHUNKSIZE + 1 , NULL ) ;
munmap ( fdm , 0 ) ;
if ( ( res ! = SQL_SUCCESS ) & & ( res ! = SQL_SUCCESS_WITH_INFO ) ) {
ast_log ( LOG_WARNING , " SQL Get Data error! \n [%s] \n \n " , sql ) ;
unlink ( full_fn ) ;
SQLFreeHandle ( SQL_HANDLE_STMT , stmt ) ;
goto yuck ;
}
}
}
}
}
}
truncate ( full_fn , fdlen ) ;
if ( fdm ) {
memset ( fdm , 0 , fdlen ) ;
res = SQLGetData ( stmt , x + 1 , SQL_BINARY , fdm , fdlen , & colsize2 ) ;
if ( ( res ! = SQL_SUCCESS ) & & ( res ! = SQL_SUCCESS_WITH_INFO ) ) {
ast_log ( LOG_WARNING , " SQL Get Data error! \n [%s] \n \n " , sql ) ;
SQLFreeHandle ( SQL_HANDLE_STMT , stmt ) ;
ast_odbc_release_obj ( obj ) ;
goto yuck ;
}
}
}
} else {
} else {
res = SQLGetData ( stmt , x + 1 , SQL_CHAR , rowdata , sizeof ( rowdata ) , NULL ) ;
res = SQLGetData ( stmt , x + 1 , SQL_CHAR , rowdata , sizeof ( rowdata ) , NULL ) ;
@ -1136,8 +1140,6 @@ static int retrieve_file(char *dir, int msgnum)
yuck :
yuck :
if ( f )
if ( f )
fclose ( f ) ;
fclose ( f ) ;
if ( fdm )
munmap ( fdm , fdlen ) ;
if ( fd > - 1 )
if ( fd > - 1 )
close ( fd ) ;
close ( fd ) ;
return x - 1 ;
return x - 1 ;