2001-03-18 16:24:57 +03:00
/*
Unix SMB / Netbios implementation .
Version 3.0
Samba readline wrapper implementation
2001-03-19 02:41:53 +03:00
Copyright ( C ) Simo Sorce 2001
2001-03-18 16:24:57 +03:00
Copyright ( C ) Andrew Tridgell 2001
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2001-11-19 07:18:45 +03:00
# ifdef HAVE_NEW_LIBREADLINE
# define RL_COMPLETION_CAST (rl_completion_func_t *)
# else
/* This type is missing from libreadline<4.0 (approximately) */
2001-11-19 10:39:35 +03:00
# define RL_COMPLETION_CAST
2001-11-19 07:18:45 +03:00
# endif /* HAVE_NEW_LIBREADLINE */
2001-03-18 16:24:57 +03:00
/****************************************************************************
2002-01-20 01:54:13 +03:00
Display the prompt and wait for input . Call callback ( ) regularly
2001-03-18 16:24:57 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-01-20 01:54:13 +03:00
2001-07-20 11:46:39 +04:00
static char * smb_readline_replacement ( char * prompt , void ( * callback ) ( void ) ,
2002-01-20 01:54:13 +03:00
char * * ( completion_fn ) ( char * text , int start , int end ) )
2001-03-18 16:24:57 +03:00
{
2001-03-19 02:41:53 +03:00
fd_set fds ;
static pstring line ;
struct timeval timeout ;
int fd = fileno ( stdin ) ;
2002-01-20 01:54:13 +03:00
char * ret ;
2001-03-19 02:41:53 +03:00
2001-09-10 15:08:57 +04:00
x_fprintf ( dbf , " %s " , prompt ) ;
x_fflush ( dbf ) ;
2001-03-18 16:24:57 +03:00
2001-03-19 02:41:53 +03:00
while ( 1 ) {
timeout . tv_sec = 5 ;
timeout . tv_usec = 0 ;
2001-03-18 16:24:57 +03:00
2001-03-19 02:41:53 +03:00
FD_ZERO ( & fds ) ;
FD_SET ( fd , & fds ) ;
if ( sys_select_intr ( fd + 1 , & fds , & timeout ) = = 1 ) {
ret = fgets ( line , sizeof ( line ) , stdin ) ;
return ret ;
}
2002-01-20 01:54:13 +03:00
if ( callback )
callback ( ) ;
2001-03-19 02:41:53 +03:00
}
2001-07-20 11:46:39 +04:00
}
/****************************************************************************
2002-01-20 01:54:13 +03:00
Display the prompt and wait for input . Call callback ( ) regularly .
2001-07-20 11:46:39 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-01-20 01:54:13 +03:00
2001-07-20 11:46:39 +04:00
char * smb_readline ( char * prompt , void ( * callback ) ( void ) ,
char * * ( completion_fn ) ( char * text , int start , int end ) )
{
# if HAVE_LIBREADLINE
2002-01-20 01:54:13 +03:00
if ( isatty ( fileno ( stdin ) ) ) {
char * ret ;
2001-07-20 11:46:39 +04:00
2002-01-20 01:54:13 +03:00
/* Aargh! Readline does bizzare things with the terminal width
that mucks up expect ( 1 ) . Set CLI_NO_READLINE in the environment
to force readline not to be used . */
2001-07-20 11:46:39 +04:00
2002-01-20 01:54:13 +03:00
if ( getenv ( " CLI_NO_READLINE " ) )
return smb_readline_replacement ( prompt , callback , completion_fn ) ;
if ( completion_fn ) {
/* The callback prototype has changed slightly between
different versions of Readline , so the same function
works in all of them to date , but we get compiler
warnings in some . */
rl_attempted_completion_function = RL_COMPLETION_CAST completion_fn ;
}
if ( callback )
rl_event_hook = ( Function * ) callback ;
ret = readline ( prompt ) ;
if ( ret & & * ret )
add_history ( ret ) ;
return ret ;
} else
2001-03-18 16:24:57 +03:00
# endif
2002-01-20 01:54:13 +03:00
return smb_readline_replacement ( prompt , callback , completion_fn ) ;
2001-03-18 16:24:57 +03:00
}
/****************************************************************************
history
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-10-09 23:12:18 +04:00
int cmd_history ( void )
2001-03-18 16:24:57 +03:00
{
2001-03-19 02:41:53 +03:00
# if defined(HAVE_LIBREADLINE)
2001-03-18 16:24:57 +03:00
HIST_ENTRY * * hlist ;
int i ;
2001-03-19 02:41:53 +03:00
hlist = history_list ( ) ;
2001-03-18 16:24:57 +03:00
for ( i = 0 ; hlist & & hlist [ i ] ; i + + ) {
DEBUG ( 0 , ( " %d: %s \n " , i , hlist [ i ] - > line ) ) ;
}
# else
DEBUG ( 0 , ( " no history without readline support \n " ) ) ;
# endif
2001-10-09 23:12:18 +04:00
return 0 ;
2001-03-18 16:24:57 +03:00
}