2001-03-18 16:24:57 +03:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-03-18 16:24:57 +03:00
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"
2002-09-25 19:19:00 +04:00
# ifdef HAVE_LIBREADLINE
# ifdef HAVE_READLINE_READLINE_H
# include <readline / readline.h>
# ifdef HAVE_READLINE_HISTORY_H
# include <readline / history.h>
# endif
# else
# ifdef HAVE_READLINE_H
# include <readline.h>
# ifdef HAVE_HISTORY_H
# include <history.h>
# endif
# else
# undef HAVE_LIBREADLINE
# endif
# endif
# endif
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
2006-02-04 01:19:41 +03:00
static char * smb_readline_replacement ( const char * prompt , void ( * callback ) ( void ) ,
2003-08-11 23:11:43 +04:00
char * * ( completion_fn ) ( const 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 ;
2003-02-08 03:08:23 +03:00
int fd = x_fileno ( x_stdin ) ;
2002-01-20 01:54:13 +03:00
char * ret ;
2001-03-19 02:41:53 +03:00
2006-06-16 03:51:20 +04:00
/* Prompt might be NULL in non-interactive mode. */
if ( prompt ) {
x_fprintf ( x_stdout , " %s " , prompt ) ;
x_fflush ( x_stdout ) ;
}
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 ) ;
2002-02-01 02:26:12 +03:00
if ( sys_select_intr ( fd + 1 , & fds , NULL , NULL , & timeout ) = = 1 ) {
2003-02-08 03:08:23 +03:00
ret = x_fgets ( line , sizeof ( line ) , x_stdin ) ;
2001-03-19 02:41:53 +03:00
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
2006-02-04 01:19:41 +03:00
char * smb_readline ( const char * prompt , void ( * callback ) ( void ) ,
2003-08-11 23:11:43 +04:00
char * * ( completion_fn ) ( const char * text , int start , int end ) )
2001-07-20 11:46:39 +04:00
{
2006-06-16 03:51:20 +04:00
char * ret ;
BOOL interactive ;
interactive = isatty ( x_fileno ( x_stdin ) ) | | getenv ( " CLI_FORCE_INTERACTIVE " ) ;
if ( ! interactive ) {
return smb_readline_replacement ( NULL , callback , completion_fn ) ;
}
2001-07-20 11:46:39 +04:00
# if HAVE_LIBREADLINE
2002-01-20 01:54:13 +03:00
2006-06-16 03:51:20 +04: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 . */
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 ;
}
2006-10-11 17:59:03 +04:00
# if HAVE_DECL_RL_EVENT_HOOK
2006-06-16 03:51:20 +04:00
if ( callback )
rl_event_hook = ( Function * ) callback ;
2006-10-11 17:59:03 +04:00
# endif
2006-06-16 03:51:20 +04:00
ret = readline ( prompt ) ;
if ( ret & & * ret )
add_history ( ret ) ;
# else
ret = smb_readline_replacement ( prompt , callback , completion_fn ) ;
2001-03-18 16:24:57 +03:00
# endif
2006-06-16 03:51:20 +04:00
return ret ;
2001-03-18 16:24:57 +03:00
}
2003-05-12 22:12:31 +04:00
/****************************************************************************
* return line buffer text
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
const char * smb_readline_get_line_buffer ( void )
{
# if defined(HAVE_LIBREADLINE)
return rl_line_buffer ;
# else
return NULL ;
# endif
}
/****************************************************************************
* set completion append character
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void smb_readline_ca_char ( char c )
{
# if defined(HAVE_LIBREADLINE)
rl_completion_append_character = c ;
# endif
}
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
{
2006-10-11 17:59:03 +04:00
# if defined(HAVE_LIBREADLINE) && defined(HAVE_HISTORY_LIST)
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
}
2003-05-12 22:12:31 +04:00