r2070: Let's try to overload srnlen and strndup for AIX where they are natly broken.
[tprouty/samba.git] / source / lib / readline.c
index b03d37695e58635be4fa0765ee6136959f29498e..78b99fd7fb03168fe78c71d1e4d8feea61e6d1cb 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 3.0
+   Unix SMB/CIFS implementation.
    Samba readline wrapper implementation
    Copyright (C) Simo Sorce 2001
    Copyright (C) Andrew Tridgell 2001
 #  endif
 #endif
 
+#ifdef HAVE_NEW_LIBREADLINE
+#  define RL_COMPLETION_CAST (rl_completion_func_t *)
+#else
+/* This type is missing from libreadline<4.0  (approximately) */
+#  define RL_COMPLETION_CAST
+#endif /* HAVE_NEW_LIBREADLINE */
+
 /****************************************************************************
-display the prompt and wait for input. Call callback() regularly
+ Display the prompt and wait for input. Call callback() regularly
 ****************************************************************************/
+
 static char *smb_readline_replacement(char *prompt, void (*callback)(void), 
-                                      char **(completion_fn)(char *text, 
-                                                             int start, 
-                                                             int end))
+                               char **(completion_fn)(const char *text, int start, int end))
 {
        fd_set fds;
-       extern XFILE *dbf;
        static pstring line;
        struct timeval timeout;
-       int fd = fileno(stdin);
-        char *ret;
+       int fd = x_fileno(x_stdin);
+       char *ret;
 
        x_fprintf(dbf, "%s", prompt);
        x_fflush(dbf);
@@ -65,48 +69,79 @@ static char *smb_readline_replacement(char *prompt, void (*callback)(void),
                FD_ZERO(&fds);
                FD_SET(fd,&fds);
        
-               if (sys_select_intr(fd+1,&fds,&timeout) == 1) {
-                       ret = fgets(line, sizeof(line), stdin);
+               if (sys_select_intr(fd+1,&fds,NULL,NULL,&timeout) == 1) {
+                       ret = x_fgets(line, sizeof(line), x_stdin);
                        return ret;
                }
-               if (callback) callback();
+               if (callback)
+                       callback();
        }
 }
 
 /****************************************************************************
-display the prompt and wait for input. Call callback() regularly
+ Display the prompt and wait for input. Call callback() regularly.
 ****************************************************************************/
+
 char *smb_readline(char *prompt, void (*callback)(void), 
-                  char **(completion_fn)(char *text, int start, int end))
+                  char **(completion_fn)(const char *text, int start, int end))
 {
 #if HAVE_LIBREADLINE
-       char *ret;
+       if (isatty(x_fileno(x_stdin))) {
+               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. */
+               /* 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 (getenv("CLI_NO_READLINE"))
+                       return smb_readline_replacement(prompt, callback, completion_fn);
 
-       if (completion_fn) {
-               rl_attempted_completion_function = 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);
+}
 
-       if (callback) rl_event_hook = (Function *)callback;
-       ret = readline(prompt);
-       if (ret && *ret) add_history(ret);
-       return ret;
+/****************************************************************************
+ * return line buffer text
+ ****************************************************************************/
+const char *smb_readline_get_line_buffer(void)
+{
+#if defined(HAVE_LIBREADLINE)
+       return rl_line_buffer;
 #else
-        return smb_readline_replacement(prompt, callback, completion_fn);
+       return NULL;
+#endif
+}
+
+
+/****************************************************************************
+ * set completion append character
+ ***************************************************************************/
+void smb_readline_ca_char(char c)
+{
+#if defined(HAVE_LIBREADLINE)
+       rl_completion_append_character = c;
 #endif
 }
 
 /****************************************************************************
 history
 ****************************************************************************/
-void cmd_history(void)
+int cmd_history(void)
 {
 #if defined(HAVE_LIBREADLINE)
        HIST_ENTRY **hlist;
@@ -120,4 +155,7 @@ void cmd_history(void)
 #else
        DEBUG(0,("no history without readline support\n"));
 #endif
+
+       return 0;
 }
+