From 72a5cbadc1498b58bc7873a450de4b50e322a676 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 3 May 2006 09:07:38 +0000 Subject: r15406: Move 'smbreadline' out of libreplace as it doesn't replace functionality not available on some platforms but is a Samba-specific library. (This used to be commit e9d3660fa6678424e5159708a1aa572824926c8e) --- source4/client/client.c | 2 +- source4/lib/registry/tools/regshell.c | 2 +- source4/lib/replace/README | 1 + source4/lib/replace/config.m4 | 1 - source4/lib/replace/readline.c | 164 ---------------------------------- source4/lib/replace/readline.m4 | 81 ----------------- source4/lib/replace/smbreadline.h | 9 -- source4/lib/smbreadline/readline.m4 | 81 +++++++++++++++++ source4/lib/smbreadline/smbreadline.c | 164 ++++++++++++++++++++++++++++++++++ source4/lib/smbreadline/smbreadline.h | 9 ++ 10 files changed, 257 insertions(+), 257 deletions(-) delete mode 100644 source4/lib/replace/readline.c delete mode 100644 source4/lib/replace/readline.m4 delete mode 100644 source4/lib/replace/smbreadline.h create mode 100644 source4/lib/smbreadline/readline.m4 create mode 100644 source4/lib/smbreadline/smbreadline.c create mode 100644 source4/lib/smbreadline/smbreadline.h (limited to 'source4') diff --git a/source4/client/client.c b/source4/client/client.c index a90e597b0b..2646332d03 100644 --- a/source4/client/client.c +++ b/source4/client/client.c @@ -38,7 +38,7 @@ #include "system/time.h" /* needed by some systems for asctime() */ #include "libcli/resolve/resolve.h" #include "libcli/security/security.h" -#include "lib/replace/smbreadline.h" +#include "lib/smbreadline/smbreadline.h" #include "librpc/gen_ndr/ndr_nbt.h" static int io_bufsize = 64512; diff --git a/source4/lib/registry/tools/regshell.c b/source4/lib/registry/tools/regshell.c index 6da64d14a8..a1a88378c9 100644 --- a/source4/lib/registry/tools/regshell.c +++ b/source4/lib/registry/tools/regshell.c @@ -25,7 +25,7 @@ #include "lib/events/events.h" #include "lib/registry/reg_backend_rpc.h" #include "system/time.h" -#include "lib/replace/smbreadline.h" +#include "lib/smbreadline/smbreadline.h" #include "librpc/gen_ndr/ndr_security.h" /* diff --git a/source4/lib/replace/README b/source4/lib/replace/README index a3e9d87072..9760c75b80 100644 --- a/source4/lib/replace/README +++ b/source4/lib/replace/README @@ -50,6 +50,7 @@ pread pwrite getpass readline (the library) +inet_ntoa Types: bool diff --git a/source4/lib/replace/config.m4 b/source4/lib/replace/config.m4 index 12e3607bb4..aec9f5805c 100644 --- a/source4/lib/replace/config.m4 +++ b/source4/lib/replace/config.m4 @@ -140,7 +140,6 @@ AC_INCLUDES_DEFAULT #endif] ) -sinclude(lib/replace/readline.m4) sinclude(lib/replace/getpass.m4) dnl VA_COPY diff --git a/source4/lib/replace/readline.c b/source4/lib/replace/readline.c deleted file mode 100644 index 78febf5000..0000000000 --- a/source4/lib/replace/readline.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - Unix SMB/CIFS implementation. - Samba readline wrapper implementation - Copyright (C) Simo Sorce 2001 - 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 02139, USA. -*/ - -#include "includes.h" -#include "pstring.h" - -#include -#include "system/readline.h" - -/******************************************************************* - Similar to sys_select() but catch EINTR and continue. - This is what sys_select() used to do in Samba. -********************************************************************/ - -int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval) -{ - int ret; - fd_set *readfds2, readfds_buf, *writefds2, writefds_buf, *errorfds2, errorfds_buf; - struct timeval tval2, *ptval; - - readfds2 = (readfds ? &readfds_buf : NULL); - writefds2 = (writefds ? &writefds_buf : NULL); - errorfds2 = (errorfds ? &errorfds_buf : NULL); - ptval = (tval ? &tval2 : NULL); - - do { - if (readfds) - readfds_buf = *readfds; - if (writefds) - writefds_buf = *writefds; - if (errorfds) - errorfds_buf = *errorfds; - if (tval) - tval2 = *tval; - - /* We must use select and not sys_select here. If we use - sys_select we'd lose the fact a signal occurred when sys_select - read a byte from the pipe. Fix from Mark Weaver - - */ - - ret = select(maxfd, readfds2, writefds2, errorfds2, ptval); - } while (ret == -1 && errno == EINTR); - - if (readfds) - *readfds = readfds_buf; - if (writefds) - *writefds = writefds_buf; - if (errorfds) - *errorfds = errorfds_buf; - - return ret; -} - -/**************************************************************************** - Display the prompt and wait for input. Call callback() regularly -****************************************************************************/ - -static char *smb_readline_replacement(const char *prompt, void (*callback)(void), - char **(completion_fn)(const char *text, int start, int end)) -{ - fd_set fds; - static pstring line; - struct timeval timeout; - int fd = STDIN_FILENO; - char *ret; - - do_debug("%s", prompt); - - while (1) { - timeout.tv_sec = 5; - timeout.tv_usec = 0; - - FD_ZERO(&fds); - FD_SET(fd,&fds); - - if (sys_select_intr(fd+1,&fds,NULL,NULL,&timeout) == 1) { - ret = x_fgets(line, sizeof(line), x_stdin); - return ret; - } - if (callback) - callback(); - } -} - -/**************************************************************************** - Display the prompt and wait for input. Call callback() regularly. -****************************************************************************/ - -char *smb_readline(const char *prompt, void (*callback)(void), - char **(completion_fn)(const char *text, int start, int end)) -{ -#if HAVE_LIBREADLINE - if (isatty(STDIN_FILENO)) { - char *ret; - - /* 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; - } - - if (callback) - rl_event_hook = (Function *)callback; - ret = readline(prompt); - if (ret && *ret) - add_history(ret); - return ret; - } else -#endif - return smb_readline_replacement(prompt, callback, completion_fn); -} - -/**************************************************************************** - * 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 -} - - - diff --git a/source4/lib/replace/readline.m4 b/source4/lib/replace/readline.m4 deleted file mode 100644 index 34b538f10a..0000000000 --- a/source4/lib/replace/readline.m4 +++ /dev/null @@ -1,81 +0,0 @@ -############################################### -# Readline included by default unless explicitly asked not to -test "${with_readline+set}" != "set" && with_readline=yes - -EXTERNAL_READLINE=no -# test for where we get readline() from -AC_MSG_CHECKING(whether to use readline) -AC_ARG_WITH(readline, -[ --with-readline[=DIR] Look for readline include/libs in DIR (default=auto) ], -[ case "$with_readline" in - yes) - AC_MSG_RESULT(yes) - - AC_CHECK_HEADERS(readline.h history.h readline/readline.h) - AC_CHECK_HEADERS(readline/history.h) - - AC_CHECK_HEADERS(readline.h readline/readline.h,[ - for termlib in ncurses curses termcap terminfo termlib tinfo; do - AC_CHECK_LIB(${termlib}, tgetent, [TERMLIBS="-l${termlib}"; break]) - done - AC_CHECK_LIB(readline, rl_callback_handler_install, - [TERMLIBS="-lreadline $TERMLIBS" - EXTERNAL_READLINE=yes - break], [TERMLIBS=], $TERMLIBS)]) - ;; - no) - AC_MSG_RESULT(no) - ;; - *) - AC_MSG_RESULT(yes) - - # Needed for AC_CHECK_HEADERS and AC_CHECK_LIB to look at - # alternate readline path - _ldflags=${LDFLAGS} - _cppflags=${CPPFLAGS} - - # Add additional search path - LDFLAGS="-L$with_readline/lib $LDFLAGS" - CPPFLAGS="-I$with_readline/include $CPPFLAGS" - - AC_CHECK_HEADERS(readline.h history.h readline/readline.h) - AC_CHECK_HEADERS(readline/history.h) - - AC_CHECK_HEADERS(readline.h readline/readline.h,[ - for termlib in ncurses curses termcap terminfo termlib; do - AC_CHECK_LIB(${termlib}, tgetent, [TERMLIBS="-l${termlib}"; break]) - done - AC_CHECK_LIB(readline, rl_callback_handler_install, - [TERMLDFLAGS="-L$with_readline/lib" - TERMCPPFLAGS="-I$with_readline/include" - LDFLAGS="-L$with_readline/lib $LDFLAGS" - CPPFLAGS="-I$with_readline/include $CPPFLAGS" - TERMLIBS="-lreadline $TERMLIBS" - EXTERNAL_READLINE=yes - break], [TERMLIBS= CPPFLAGS=$_cppflags], $TERMLIBS)]) - - ;; - esac], - AC_MSG_RESULT(no) -) - -# The readline API changed slightly from readline3 to readline4, so -# code will generate warnings on one of them unless we have a few -# special cases. -AC_CHECK_LIB(readline, rl_completion_matches, - [AC_DEFINE(HAVE_NEW_LIBREADLINE, 1, - [Do we have rl_completion_matches?])], - [], - [$TERMLIBS]) - -AC_MSG_CHECKING(whether to use extern readline) -if test x"$EXTERNAL_READLINE" = x"yes"; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_LIBREADLINE,1,[Whether the system has readline]) - SMB_SUBSYSTEM(SMBREADLINE, [lib/replace/readline.o], [READLINE]) - SMB_EXT_LIB(READLINE, [${TERMLIBS}]) - SMB_ENABLE(READLINE,YES) -else - SMB_SUBSYSTEM(SMBREADLINE, [lib/replace/readline.o], []) - AC_MSG_RESULT(no) -fi diff --git a/source4/lib/replace/smbreadline.h b/source4/lib/replace/smbreadline.h deleted file mode 100644 index cde2b47a24..0000000000 --- a/source4/lib/replace/smbreadline.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __SMBREADLINE_H__ -#define __SMBREADLINE_H__ - -char *smb_readline(const char *prompt, void (*callback)(void), - char **(completion_fn)(const char *text, int start, int end)); -const char *smb_readline_get_line_buffer(void); -void smb_readline_ca_char(char c); - -#endif /* __SMBREADLINE_H__ */ diff --git a/source4/lib/smbreadline/readline.m4 b/source4/lib/smbreadline/readline.m4 new file mode 100644 index 0000000000..cff7ece126 --- /dev/null +++ b/source4/lib/smbreadline/readline.m4 @@ -0,0 +1,81 @@ +############################################### +# Readline included by default unless explicitly asked not to +test "${with_readline+set}" != "set" && with_readline=yes + +EXTERNAL_READLINE=no +# test for where we get readline() from +AC_MSG_CHECKING(whether to use readline) +AC_ARG_WITH(readline, +[ --with-readline[=DIR] Look for readline include/libs in DIR (default=auto) ], +[ case "$with_readline" in + yes) + AC_MSG_RESULT(yes) + + AC_CHECK_HEADERS(readline.h history.h readline/readline.h) + AC_CHECK_HEADERS(readline/history.h) + + AC_CHECK_HEADERS(readline.h readline/readline.h,[ + for termlib in ncurses curses termcap terminfo termlib tinfo; do + AC_CHECK_LIB(${termlib}, tgetent, [TERMLIBS="-l${termlib}"; break]) + done + AC_CHECK_LIB(readline, rl_callback_handler_install, + [TERMLIBS="-lreadline $TERMLIBS" + EXTERNAL_READLINE=yes + break], [TERMLIBS=], $TERMLIBS)]) + ;; + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + + # Needed for AC_CHECK_HEADERS and AC_CHECK_LIB to look at + # alternate readline path + _ldflags=${LDFLAGS} + _cppflags=${CPPFLAGS} + + # Add additional search path + LDFLAGS="-L$with_readline/lib $LDFLAGS" + CPPFLAGS="-I$with_readline/include $CPPFLAGS" + + AC_CHECK_HEADERS(readline.h history.h readline/readline.h) + AC_CHECK_HEADERS(readline/history.h) + + AC_CHECK_HEADERS(readline.h readline/readline.h,[ + for termlib in ncurses curses termcap terminfo termlib; do + AC_CHECK_LIB(${termlib}, tgetent, [TERMLIBS="-l${termlib}"; break]) + done + AC_CHECK_LIB(readline, rl_callback_handler_install, + [TERMLDFLAGS="-L$with_readline/lib" + TERMCPPFLAGS="-I$with_readline/include" + LDFLAGS="-L$with_readline/lib $LDFLAGS" + CPPFLAGS="-I$with_readline/include $CPPFLAGS" + TERMLIBS="-lreadline $TERMLIBS" + EXTERNAL_READLINE=yes + break], [TERMLIBS= CPPFLAGS=$_cppflags], $TERMLIBS)]) + + ;; + esac], + AC_MSG_RESULT(no) +) + +# The readline API changed slightly from readline3 to readline4, so +# code will generate warnings on one of them unless we have a few +# special cases. +AC_CHECK_LIB(readline, rl_completion_matches, + [AC_DEFINE(HAVE_NEW_LIBREADLINE, 1, + [Do we have rl_completion_matches?])], + [], + [$TERMLIBS]) + +AC_MSG_CHECKING(whether to use extern readline) +if test x"$EXTERNAL_READLINE" = x"yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LIBREADLINE,1,[Whether the system has readline]) + SMB_SUBSYSTEM(SMBREADLINE, [lib/smbreadline/smbreadline.o], [READLINE]) + SMB_EXT_LIB(READLINE, [${TERMLIBS}]) + SMB_ENABLE(READLINE,YES) +else + SMB_SUBSYSTEM(SMBREADLINE, [lib/smbreadline/smbreadline.o], []) + AC_MSG_RESULT(no) +fi diff --git a/source4/lib/smbreadline/smbreadline.c b/source4/lib/smbreadline/smbreadline.c new file mode 100644 index 0000000000..78febf5000 --- /dev/null +++ b/source4/lib/smbreadline/smbreadline.c @@ -0,0 +1,164 @@ +/* + Unix SMB/CIFS implementation. + Samba readline wrapper implementation + Copyright (C) Simo Sorce 2001 + 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 02139, USA. +*/ + +#include "includes.h" +#include "pstring.h" + +#include +#include "system/readline.h" + +/******************************************************************* + Similar to sys_select() but catch EINTR and continue. + This is what sys_select() used to do in Samba. +********************************************************************/ + +int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval) +{ + int ret; + fd_set *readfds2, readfds_buf, *writefds2, writefds_buf, *errorfds2, errorfds_buf; + struct timeval tval2, *ptval; + + readfds2 = (readfds ? &readfds_buf : NULL); + writefds2 = (writefds ? &writefds_buf : NULL); + errorfds2 = (errorfds ? &errorfds_buf : NULL); + ptval = (tval ? &tval2 : NULL); + + do { + if (readfds) + readfds_buf = *readfds; + if (writefds) + writefds_buf = *writefds; + if (errorfds) + errorfds_buf = *errorfds; + if (tval) + tval2 = *tval; + + /* We must use select and not sys_select here. If we use + sys_select we'd lose the fact a signal occurred when sys_select + read a byte from the pipe. Fix from Mark Weaver + + */ + + ret = select(maxfd, readfds2, writefds2, errorfds2, ptval); + } while (ret == -1 && errno == EINTR); + + if (readfds) + *readfds = readfds_buf; + if (writefds) + *writefds = writefds_buf; + if (errorfds) + *errorfds = errorfds_buf; + + return ret; +} + +/**************************************************************************** + Display the prompt and wait for input. Call callback() regularly +****************************************************************************/ + +static char *smb_readline_replacement(const char *prompt, void (*callback)(void), + char **(completion_fn)(const char *text, int start, int end)) +{ + fd_set fds; + static pstring line; + struct timeval timeout; + int fd = STDIN_FILENO; + char *ret; + + do_debug("%s", prompt); + + while (1) { + timeout.tv_sec = 5; + timeout.tv_usec = 0; + + FD_ZERO(&fds); + FD_SET(fd,&fds); + + if (sys_select_intr(fd+1,&fds,NULL,NULL,&timeout) == 1) { + ret = x_fgets(line, sizeof(line), x_stdin); + return ret; + } + if (callback) + callback(); + } +} + +/**************************************************************************** + Display the prompt and wait for input. Call callback() regularly. +****************************************************************************/ + +char *smb_readline(const char *prompt, void (*callback)(void), + char **(completion_fn)(const char *text, int start, int end)) +{ +#if HAVE_LIBREADLINE + if (isatty(STDIN_FILENO)) { + char *ret; + + /* 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; + } + + if (callback) + rl_event_hook = (Function *)callback; + ret = readline(prompt); + if (ret && *ret) + add_history(ret); + return ret; + } else +#endif + return smb_readline_replacement(prompt, callback, completion_fn); +} + +/**************************************************************************** + * 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 +} + + + diff --git a/source4/lib/smbreadline/smbreadline.h b/source4/lib/smbreadline/smbreadline.h new file mode 100644 index 0000000000..cde2b47a24 --- /dev/null +++ b/source4/lib/smbreadline/smbreadline.h @@ -0,0 +1,9 @@ +#ifndef __SMBREADLINE_H__ +#define __SMBREADLINE_H__ + +char *smb_readline(const char *prompt, void (*callback)(void), + char **(completion_fn)(const char *text, int start, int end)); +const char *smb_readline_get_line_buffer(void); +void smb_readline_ca_char(char c); + +#endif /* __SMBREADLINE_H__ */ -- cgit