|
Packit Service |
a2489d |
/*
|
|
Packit Service |
a2489d |
* lftp - file transfer program
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* Copyright (c) 1996-2016 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
a2489d |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
a2489d |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit Service |
a2489d |
* (at your option) any later version.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
a2489d |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
a2489d |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
a2489d |
* GNU General Public License for more details.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
a2489d |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
a2489d |
*/
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include <config.h>
|
|
Packit Service |
a2489d |
#include <stdio.h>
|
|
Packit Service |
a2489d |
#include <stdlib.h>
|
|
Packit Service |
a2489d |
#include <string.h>
|
|
Packit Service |
a2489d |
#include <readline/readline.h>
|
|
Packit Service |
a2489d |
#include <readline/history.h>
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include "lftp_rl.h"
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* complete.cc */
|
|
Packit Service |
a2489d |
void lftp_line_complete();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_add_history_nodups(const char *cmd_buf)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
HIST_ENTRY *temp;
|
|
Packit Service |
a2489d |
char ts[24];
|
|
Packit Service |
a2489d |
if(cmd_buf[0]==' ')
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
using_history();
|
|
Packit Service |
a2489d |
temp=previous_history();
|
|
Packit Service |
a2489d |
if(temp==0 || strcmp(temp->line,cmd_buf))
|
|
Packit Service |
a2489d |
add_history(cmd_buf);
|
|
Packit Service |
a2489d |
sprintf(ts," %lld",(long long)time(0));
|
|
Packit Service |
a2489d |
add_history_time(ts);
|
|
Packit Service |
a2489d |
using_history();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
char *lftp_readline(const char *prompt)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
char *ret = readline(prompt);
|
|
Packit Service |
a2489d |
/* Tell completion that we don't need completion data anymore;
|
|
Packit Service |
a2489d |
* it might be taking a good chunk of memory. */
|
|
Packit Service |
a2489d |
lftp_line_complete();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
return ret;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int lftp_history_expand(const char *what, char **where)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
return history_expand((char*)what,where);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int lftp_history_read(const char *fn)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
using_history();
|
|
Packit Service |
a2489d |
return read_history(fn);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int lftp_history_write(const char *fn)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
using_history();
|
|
Packit Service |
a2489d |
return write_history(fn);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_history_list(int cnt)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
HISTORY_STATE *st = history_get_history_state();
|
|
Packit Service |
a2489d |
HIST_ENTRY *hist;
|
|
Packit Service |
a2489d |
int i;
|
|
Packit Service |
a2489d |
using_history();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
i = history_base + st->length - cnt;
|
|
Packit Service |
a2489d |
if(cnt == -1 || i < history_base) i = history_base;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
char ts_str[24];
|
|
Packit Service |
a2489d |
while((hist = history_get(i))) {
|
|
Packit Service |
a2489d |
ts_str[0]=0;
|
|
Packit Service |
a2489d |
if(hist->timestamp[0]) {
|
|
Packit Service |
a2489d |
time_t ts=atol(hist->timestamp+1);
|
|
Packit Service |
a2489d |
strftime(ts_str,sizeof(ts_str),"%Y-%m-%d %H:%M:%S",localtime(&ts);;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
printf("%5d%c %s %s\n", i++, hist->data?'*':' ', ts_str, hist->line);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_history_clear()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
clear_history();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
static int is_clear=0;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_clear()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
extern char *rl_display_prompt;
|
|
Packit Service |
a2489d |
extern int _rl_mark_modified_lines;
|
|
Packit Service |
a2489d |
int old_end=rl_end;
|
|
Packit Service |
a2489d |
char *old_prompt=rl_display_prompt;
|
|
Packit Service |
a2489d |
int old_mark=_rl_mark_modified_lines;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
rl_end=0;
|
|
Packit Service |
a2489d |
rl_display_prompt="";
|
|
Packit Service |
a2489d |
rl_expand_prompt(0);
|
|
Packit Service |
a2489d |
_rl_mark_modified_lines=0;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
rl_redisplay();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
rl_end=old_end;
|
|
Packit Service |
a2489d |
rl_display_prompt=old_prompt;
|
|
Packit Service |
a2489d |
_rl_mark_modified_lines=old_mark;
|
|
Packit Service |
a2489d |
if(rl_display_prompt==rl_prompt)
|
|
Packit Service |
a2489d |
rl_expand_prompt(rl_prompt);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
is_clear=1;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_redisplay_maybe()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(is_clear)
|
|
Packit Service |
a2489d |
rl_redisplay();
|
|
Packit Service |
a2489d |
is_clear=0;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* prototype hell differences in various readline versions make it impossible
|
|
Packit Service |
a2489d |
* to use certain functions/variables in C++ */
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_set_ignore_some_completions_function(int (*func)(char**))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
rl_ignore_some_completions_function=func;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
char **lftp_rl_completion_matches(const char *text,char *(*compentry)(const char *,int))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
return rl_completion_matches(text,compentry);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void completion_display_list (char **matches, int len);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_display_match_list (char **matches, int len, int max)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
printf("\n"); /* get off the input line */
|
|
Packit Service |
a2489d |
completion_display_list(matches, len);
|
|
Packit Service |
a2489d |
rl_forced_update_display(); /* redraw input line */
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_init(
|
|
Packit Service |
a2489d |
const char *readline_name,
|
|
Packit Service |
a2489d |
char **(*attempted_completion_function)(const char *,int,int),
|
|
Packit Service |
a2489d |
int (*getc_function)(FILE*),
|
|
Packit Service |
a2489d |
const char *completer_quote_characters,
|
|
Packit Service |
a2489d |
const char *completer_word_break_characters,
|
|
Packit Service |
a2489d |
const char *filename_quote_characters,
|
|
Packit Service |
a2489d |
char *(*filename_quoting_function)(char *,int,char *),
|
|
Packit Service |
a2489d |
char *(*filename_dequoting_function)(const char *,int),
|
|
Packit Service |
a2489d |
int (*char_is_quoted_p)(const char *,int))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
rl_readline_name =readline_name;
|
|
Packit Service |
a2489d |
rl_attempted_completion_function =attempted_completion_function;
|
|
Packit Service |
a2489d |
rl_getc_function =getc_function;
|
|
Packit Service |
a2489d |
rl_completer_quote_characters =completer_quote_characters;
|
|
Packit Service |
a2489d |
rl_completer_word_break_characters=(char*)completer_word_break_characters;
|
|
Packit Service |
a2489d |
rl_filename_quote_characters =filename_quote_characters;
|
|
Packit Service |
a2489d |
rl_filename_quoting_function =filename_quoting_function;
|
|
Packit Service |
a2489d |
rl_filename_dequoting_function =(rl_dequote_func_t*)filename_dequoting_function;
|
|
Packit Service |
a2489d |
rl_char_is_quoted_p =(rl_linebuf_func_t*)char_is_quoted_p;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
rl_completion_display_matches_hook = lftp_rl_display_match_list;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
history_write_timestamps=1;
|
|
Packit Service |
a2489d |
history_comment_char=' ';
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_add_defun(const char *name,int (*func)(int,int),int key)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
rl_add_defun(name,func,key);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void lftp_rl_bind(const char *key,const char *func)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
char *line=alloca(strlen(key)+2+strlen(func)+1);
|
|
Packit Service |
a2489d |
sprintf(line,"%s: %s",key,func);
|
|
Packit Service |
a2489d |
rl_parse_and_bind(line);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_set_prompt(const char *p)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
rl_set_prompt(p);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
extern char *get_lftp_data_dir();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
static char *lftp_history_file;
|
|
Packit Service |
a2489d |
void lftp_rl_read_history()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(!lftp_history_file)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
const char *add="/rl_history";
|
|
Packit Service |
a2489d |
const char *home=get_lftp_data_dir();
|
|
Packit Service |
a2489d |
if(!home)
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
lftp_history_file=(char*)malloc(strlen(home)+strlen(add)+1);
|
|
Packit Service |
a2489d |
strcat(strcpy(lftp_history_file,home),add);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
read_history(lftp_history_file);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void lftp_rl_write_history()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(!lftp_history_file)
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
write_history(lftp_history_file);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void lftp_rl_history_stifle(int s)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(s==0)
|
|
Packit Service |
a2489d |
unstifle_history();
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
stifle_history(s);
|
|
Packit Service |
a2489d |
}
|