Dummy commit. Get CVS off the branch.
This commit is contained in:
parent
0becb2ae21
commit
2ba146cd6f
5 changed files with 128 additions and 498 deletions
|
@ -64,8 +64,6 @@
|
|||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h>
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#ifdef READLINE_LIBRARY
|
||||
# include "readline.h"
|
||||
|
@ -83,7 +81,6 @@
|
|||
#endif
|
||||
|
||||
#ifndef HAVE_MEMMOVE
|
||||
#ifndef memmove
|
||||
# if __GNUC__ > 1
|
||||
# define memmove(d, s, n) __builtin_memcpy(d, s, n)
|
||||
# else
|
||||
|
@ -92,19 +89,8 @@
|
|||
#else
|
||||
# define memmove(d, s, n) memcpy(d, s, n)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define APPLICATION_NAME "Rlfe"
|
||||
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
|
||||
static char *progname;
|
||||
static char *progversion;
|
||||
#define APPLICATION_NAME "Fep"
|
||||
|
||||
static int in_from_inferior_fd;
|
||||
static int out_to_inferior_fd;
|
||||
|
@ -124,15 +110,13 @@ char echo_suppress_buffer[ECHO_SUPPRESS_MAX];
|
|||
int echo_suppress_start = 0;
|
||||
int echo_suppress_limit = 0;
|
||||
|
||||
/* #define DEBUG */
|
||||
|
||||
static FILE *logfile = NULL;
|
||||
#define DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
FILE *debugfile = NULL;
|
||||
#define DPRINT0(FMT) (fprintf(debugfile, FMT), fflush(debugfile))
|
||||
#define DPRINT1(FMT, V1) (fprintf(debugfile, FMT, V1), fflush(debugfile))
|
||||
#define DPRINT2(FMT, V1, V2) (fprintf(debugfile, FMT, V1, V2), fflush(debugfile))
|
||||
FILE *logfile = NULL;
|
||||
#define DPRINT0(FMT) (fprintf(logfile, FMT), fflush(logfile))
|
||||
#define DPRINT1(FMT, V1) (fprintf(logfile, FMT, V1), fflush(logfile))
|
||||
#define DPRINT2(FMT, V1, V2) (fprintf(logfile, FMT, V1, V2), fflush(logfile))
|
||||
#else
|
||||
#define DPRINT0(FMT) /* Do nothing */
|
||||
#define DPRINT1(FMT, V1) /* Do nothing */
|
||||
|
@ -141,10 +125,6 @@ FILE *debugfile = NULL;
|
|||
|
||||
struct termios orig_term;
|
||||
|
||||
static int rlfe_directory_completion_hook __P((char **));
|
||||
static int rlfe_directory_rewrite_hook __P((char **));
|
||||
static char *rlfe_filename_completion_function __P((const char *, int));
|
||||
|
||||
/* Pid of child process. */
|
||||
static pid_t child = -1;
|
||||
|
||||
|
@ -390,20 +370,13 @@ my_rl_getc (FILE *dummy)
|
|||
return ch;
|
||||
}
|
||||
|
||||
static void
|
||||
usage()
|
||||
{
|
||||
fprintf (stderr, "%s: usage: %s [-l filename] [-a] [-n appname] [-hv] [command [arguments...]]\n",
|
||||
progname, progname);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
char *path;
|
||||
int i, append;
|
||||
int i;
|
||||
int master;
|
||||
char *name, *logfname, *appname;
|
||||
char *name;
|
||||
int in_from_tty_fd;
|
||||
struct sigaction act;
|
||||
struct winsize ws;
|
||||
|
@ -414,58 +387,12 @@ main(int argc, char** argv)
|
|||
char *prompt = empty_string;
|
||||
int ioctl_err = 0;
|
||||
|
||||
if ((progname = strrchr (argv[0], '/')) == 0)
|
||||
progname = argv[0];
|
||||
else
|
||||
progname++;
|
||||
progversion = RL_LIBRARY_VERSION;
|
||||
|
||||
append = 0;
|
||||
appname = APPLICATION_NAME;
|
||||
logfname = (char *)NULL;
|
||||
|
||||
while ((i = getopt (argc, argv, "ahl:n:v")) != EOF)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 'l':
|
||||
logfname = optarg;
|
||||
break;
|
||||
case 'n':
|
||||
appname = optarg;
|
||||
break;
|
||||
case 'a':
|
||||
append = 1;
|
||||
break;
|
||||
case 'h':
|
||||
usage ();
|
||||
exit (0);
|
||||
case 'v':
|
||||
fprintf (stderr, "%s version %s\n", progname, progversion);
|
||||
exit (0);
|
||||
default:
|
||||
usage ();
|
||||
exit (2);
|
||||
}
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (logfname)
|
||||
{
|
||||
logfile = fopen (logfname, append ? "a" : "w");
|
||||
if (logfile == 0)
|
||||
fprintf (stderr, "%s: warning: could not open log file %s: %s\n",
|
||||
progname, logfname, strerror (errno));
|
||||
}
|
||||
|
||||
rl_readline_name = appname;
|
||||
|
||||
#ifdef DEBUG
|
||||
debugfile = fopen("LOG", "w");
|
||||
logfile = fopen("LOG", "w");
|
||||
#endif
|
||||
|
||||
rl_readline_name = APPLICATION_NAME;
|
||||
|
||||
if ((master = get_master_pty(&name)) < 0)
|
||||
{
|
||||
perror("ptypair: could not open master pty");
|
||||
|
@ -559,10 +486,10 @@ main(int argc, char** argv)
|
|||
/* now start the shell */
|
||||
{
|
||||
static char* command_args[] = { COMMAND_ARGS, NULL };
|
||||
if (argc < 1)
|
||||
if (argc <= 1)
|
||||
execvp(COMMAND, command_args);
|
||||
else
|
||||
execvp(argv[0], &argv[0]);
|
||||
execvp(argv[1], &argv[1]);
|
||||
}
|
||||
|
||||
/* should never be reached */
|
||||
|
@ -608,13 +535,6 @@ main(int argc, char** argv)
|
|||
rl_deprep_term_function = null_deprep_terminal;
|
||||
rl_callback_handler_install (prompt, line_handler);
|
||||
|
||||
#if 1
|
||||
rl_directory_completion_hook = rlfe_directory_completion_hook;
|
||||
rl_completion_entry_function = rlfe_filename_completion_function;
|
||||
#else
|
||||
rl_directory_rewrite_hook = rlfe_directory_rewrite_hook;
|
||||
#endif
|
||||
|
||||
in_from_tty_fd = STDIN_FILENO;
|
||||
FD_ZERO (&in_set);
|
||||
maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd
|
||||
|
@ -724,47 +644,6 @@ main(int argc, char** argv)
|
|||
}
|
||||
old_count = buf_count;
|
||||
|
||||
/* Do some minimal carriage return translation and backspace
|
||||
processing before logging the input line. */
|
||||
if (logfile)
|
||||
{
|
||||
#ifndef __GNUC__
|
||||
char *b;
|
||||
#else
|
||||
char b[count + 1];
|
||||
#endif
|
||||
int i, j;
|
||||
|
||||
#ifndef __GNUC__
|
||||
b = malloc (count + 1);
|
||||
if (b) {
|
||||
#endif
|
||||
for (i = 0; i < count; i++)
|
||||
b[i] = buf[buf_count + i];
|
||||
b[i] = '\0';
|
||||
for (i = j = 0; i <= count; i++)
|
||||
{
|
||||
if (b[i] == '\r')
|
||||
{
|
||||
if (b[i+1] != '\n')
|
||||
b[j++] = '\n';
|
||||
}
|
||||
else if (b[i] == '\b')
|
||||
{
|
||||
if (i)
|
||||
j--;
|
||||
}
|
||||
else
|
||||
b[j++] = b[i];
|
||||
}
|
||||
fprintf (logfile, "%s", b);
|
||||
|
||||
#ifndef __GNUC__
|
||||
free (b);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Look for any pending echo that we need to suppress. */
|
||||
while (echo_suppress_start < echo_suppress_limit
|
||||
&& count > 0
|
||||
|
@ -804,239 +683,3 @@ main(int argc, char** argv)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* FILENAME COMPLETION FOR RLFE
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PATH_MAX
|
||||
# define PATH_MAX 1024
|
||||
#endif
|
||||
|
||||
#define DIRSEP '/'
|
||||
#define ISDIRSEP(x) ((x) == '/')
|
||||
#define PATHSEP(x) (ISDIRSEP(x) || (x) == 0)
|
||||
|
||||
#define DOT_OR_DOTDOT(x) \
|
||||
((x)[0] == '.' && (PATHSEP((x)[1]) || \
|
||||
((x)[1] == '.' && PATHSEP((x)[2]))))
|
||||
|
||||
#define FREE(x) if (x) free(x)
|
||||
|
||||
#define STRDUP(s, x) do { \
|
||||
s = strdup (x);\
|
||||
if (s == 0) \
|
||||
return ((char *)NULL); \
|
||||
} while (0)
|
||||
|
||||
static int
|
||||
get_inferior_cwd (path, psize)
|
||||
char *path;
|
||||
size_t psize;
|
||||
{
|
||||
int n;
|
||||
static char procfsbuf[PATH_MAX] = { '\0' };
|
||||
|
||||
if (procfsbuf[0] == '\0')
|
||||
sprintf (procfsbuf, "/proc/%d/cwd", (int)child);
|
||||
n = readlink (procfsbuf, path, psize);
|
||||
if (n < 0)
|
||||
return n;
|
||||
if (n > psize)
|
||||
return -1;
|
||||
path[n] = '\0';
|
||||
return n;
|
||||
}
|
||||
|
||||
static int
|
||||
rlfe_directory_rewrite_hook (dirnamep)
|
||||
char **dirnamep;
|
||||
{
|
||||
char *ldirname, cwd[PATH_MAX], *retdir, *ld;
|
||||
int n, ldlen;
|
||||
|
||||
ldirname = *dirnamep;
|
||||
|
||||
if (*ldirname == '/')
|
||||
return 0;
|
||||
|
||||
n = get_inferior_cwd (cwd, sizeof(cwd) - 1);
|
||||
if (n < 0)
|
||||
return 0;
|
||||
if (n == 0) /* current directory */
|
||||
{
|
||||
cwd[0] = '.';
|
||||
cwd[1] = '\0';
|
||||
n = 1;
|
||||
}
|
||||
|
||||
/* Minimally canonicalize ldirname by removing leading `./' */
|
||||
for (ld = ldirname; *ld; )
|
||||
{
|
||||
if (ISDIRSEP (ld[0]))
|
||||
ld++;
|
||||
else if (ld[0] == '.' && PATHSEP(ld[1]))
|
||||
ld++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
ldlen = (ld && *ld) ? strlen (ld) : 0;
|
||||
|
||||
retdir = (char *)malloc (n + ldlen + 3);
|
||||
if (retdir == 0)
|
||||
return 0;
|
||||
if (ldlen)
|
||||
sprintf (retdir, "%s/%s", cwd, ld);
|
||||
else
|
||||
strcpy (retdir, cwd);
|
||||
free (ldirname);
|
||||
|
||||
*dirnamep = retdir;
|
||||
|
||||
DPRINT1("rl_directory_rewrite_hook returns %s\n", retdir);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Translate *DIRNAMEP to be relative to the inferior's CWD. Leave a trailing
|
||||
slash on the result. */
|
||||
static int
|
||||
rlfe_directory_completion_hook (dirnamep)
|
||||
char **dirnamep;
|
||||
{
|
||||
char *ldirname, *retdir;
|
||||
int n, ldlen;
|
||||
|
||||
ldirname = *dirnamep;
|
||||
|
||||
if (*ldirname == '/')
|
||||
return 0;
|
||||
|
||||
n = rlfe_directory_rewrite_hook (dirnamep);
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
ldirname = *dirnamep;
|
||||
ldlen = (ldirname && *ldirname) ? strlen (ldirname) : 0;
|
||||
|
||||
if (ldlen == 0 || ldirname[ldlen - 1] != '/')
|
||||
{
|
||||
retdir = (char *)malloc (ldlen + 3);
|
||||
if (retdir == 0)
|
||||
return 0;
|
||||
if (ldlen)
|
||||
strcpy (retdir, ldirname);
|
||||
else
|
||||
retdir[ldlen++] = '.';
|
||||
retdir[ldlen] = '/';
|
||||
retdir[ldlen+1] = '\0';
|
||||
free (ldirname);
|
||||
|
||||
*dirnamep = retdir;
|
||||
}
|
||||
|
||||
DPRINT1("rl_directory_completion_hook returns %s\n", retdir);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static char *
|
||||
rlfe_filename_completion_function (text, state)
|
||||
const char *text;
|
||||
int state;
|
||||
{
|
||||
static DIR *directory;
|
||||
static char *filename = (char *)NULL;
|
||||
static char *dirname = (char *)NULL, *ud = (char *)NULL;
|
||||
static int flen, udlen;
|
||||
char *temp;
|
||||
struct dirent *dentry;
|
||||
|
||||
if (state == 0)
|
||||
{
|
||||
if (directory)
|
||||
{
|
||||
closedir (directory);
|
||||
directory = 0;
|
||||
}
|
||||
FREE (dirname);
|
||||
FREE (filename);
|
||||
FREE (ud);
|
||||
|
||||
if (text && *text)
|
||||
STRDUP (filename, text);
|
||||
else
|
||||
{
|
||||
filename = malloc(1);
|
||||
if (filename == 0)
|
||||
return ((char *)NULL);
|
||||
filename[0] = '\0';
|
||||
}
|
||||
dirname = (text && *text) ? strdup (text) : strdup (".");
|
||||
if (dirname == 0)
|
||||
return ((char *)NULL);
|
||||
|
||||
temp = strrchr (dirname, '/');
|
||||
if (temp)
|
||||
{
|
||||
strcpy (filename, ++temp);
|
||||
*temp = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
dirname[0] = '.';
|
||||
dirname[1] = '\0';
|
||||
}
|
||||
|
||||
STRDUP (ud, dirname);
|
||||
udlen = strlen (ud);
|
||||
|
||||
rlfe_directory_completion_hook (&dirname);
|
||||
|
||||
directory = opendir (dirname);
|
||||
flen = strlen (filename);
|
||||
|
||||
rl_filename_completion_desired = 1;
|
||||
}
|
||||
|
||||
dentry = 0;
|
||||
while (directory && (dentry = readdir (directory)))
|
||||
{
|
||||
if (flen == 0)
|
||||
{
|
||||
if (DOT_OR_DOTDOT(dentry->d_name) == 0)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((dentry->d_name[0] == filename[0]) &&
|
||||
(strlen (dentry->d_name) >= flen) &&
|
||||
(strncmp (filename, dentry->d_name, flen) == 0))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dentry == 0)
|
||||
{
|
||||
if (directory)
|
||||
{
|
||||
closedir (directory);
|
||||
directory = 0;
|
||||
}
|
||||
FREE (dirname);
|
||||
FREE (filename);
|
||||
FREE (ud);
|
||||
dirname = filename = ud = 0;
|
||||
return ((char *)NULL);
|
||||
}
|
||||
|
||||
if (ud == 0 || (ud[0] == '.' && ud[1] == '\0'))
|
||||
temp = strdup (dentry->d_name);
|
||||
else
|
||||
{
|
||||
temp = malloc (1 + udlen + strlen (dentry->d_name));
|
||||
strcpy (temp, ud);
|
||||
strcpy (temp + udlen, dentry->d_name);
|
||||
}
|
||||
return (temp);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue