Add ability to spawn shell
Key 'b' in the browse window spawns a shell in the current directoy. We first check the $SHELL environment variable of the user for the preferred shell interpreter. If it's not set, we fall back to the compile time configured default shell (usually /bin/bash). Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com>
Этот коммит содержится в:
родитель
ce18bc392e
Коммит
a25e5f80a5
@ -12,6 +12,7 @@ ncdu_SOURCES=\
|
|||||||
src/dir_scan.c\
|
src/dir_scan.c\
|
||||||
src/exclude.c\
|
src/exclude.c\
|
||||||
src/help.c\
|
src/help.c\
|
||||||
|
src/shell.c\
|
||||||
src/main.c\
|
src/main.c\
|
||||||
src/path.c\
|
src/path.c\
|
||||||
src/util.c
|
src/util.c
|
||||||
@ -26,6 +27,7 @@ noinst_HEADERS=\
|
|||||||
src/exclude.h\
|
src/exclude.h\
|
||||||
src/global.h\
|
src/global.h\
|
||||||
src/help.h\
|
src/help.h\
|
||||||
|
src/shell.h\
|
||||||
src/path.h\
|
src/path.h\
|
||||||
src/util.h
|
src/util.h
|
||||||
|
|
||||||
|
15
configure.ac
15
configure.ac
@ -25,7 +25,7 @@ AC_STRUCT_ST_BLOCKS
|
|||||||
|
|
||||||
# Check for library functions.
|
# Check for library functions.
|
||||||
AC_CHECK_FUNCS(
|
AC_CHECK_FUNCS(
|
||||||
[getcwd gettimeofday fnmatch chdir rmdir unlink lstat],[],
|
[getcwd gettimeofday fnmatch chdir rmdir unlink lstat system getenv],[],
|
||||||
AC_MSG_ERROR([required function missing]))
|
AC_MSG_ERROR([required function missing]))
|
||||||
|
|
||||||
|
|
||||||
@ -55,7 +55,18 @@ if test "$ncurses" = "ncurses"; then
|
|||||||
])
|
])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Configure default shell for spawning shell when $SHELL is not set
|
||||||
|
AC_ARG_WITH([shell],
|
||||||
|
[AS_HELP_STRING([--with-shell],
|
||||||
|
[used interpreter as default shell (default is /bin/bash)])],
|
||||||
|
[DEFAULT_SHELL=$withval],
|
||||||
|
[DEFAULT_SHELL=/bin/bash])
|
||||||
|
AC_MSG_NOTICE([Using $DEFAULT_SHELL as the default shell if \$SHELL is not set])
|
||||||
|
AC_CHECK_PROG(TEST_SHELL, $DEFAULT_SHELL, yes, no, [/])
|
||||||
|
if test "x$TEST_SHELL" != "xyes"; then
|
||||||
|
AC_MSG_ERROR([Default shell interpreter $DEFAULT_SHELL not found])
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED(DEFAULT_SHELL, "$DEFAULT_SHELL", [Used default shell interpreter])
|
||||||
|
|
||||||
|
|
||||||
AC_OUTPUT([Makefile])
|
AC_OUTPUT([Makefile])
|
||||||
|
|
||||||
|
@ -210,6 +210,14 @@ Show information about the current selected item.
|
|||||||
|
|
||||||
Refresh/recalculate the current directory.
|
Refresh/recalculate the current directory.
|
||||||
|
|
||||||
|
=item b
|
||||||
|
|
||||||
|
Spawn shell in current directory.
|
||||||
|
|
||||||
|
We first check the $SHELL environment variable of the user for the preferred
|
||||||
|
shell interpreter. If it's not set, we fall back to the compile time
|
||||||
|
configured default shell (usually /bin/bash).
|
||||||
|
|
||||||
=item q
|
=item q
|
||||||
|
|
||||||
Quit
|
Quit
|
||||||
|
@ -428,6 +428,9 @@ int browse_key(int ch) {
|
|||||||
t = NULL;
|
t = NULL;
|
||||||
delete_init(sel, t);
|
delete_init(sel, t);
|
||||||
break;
|
break;
|
||||||
|
case 'b':
|
||||||
|
shell_init();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make sure the info_* options are correct */
|
/* make sure the info_* options are correct */
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#define ST_BROWSE 1
|
#define ST_BROWSE 1
|
||||||
#define ST_DEL 2
|
#define ST_DEL 2
|
||||||
#define ST_HELP 3
|
#define ST_HELP 3
|
||||||
|
#define ST_SHELL 4
|
||||||
|
|
||||||
|
|
||||||
/* structure representing a file or directory */
|
/* structure representing a file or directory */
|
||||||
|
@ -50,6 +50,7 @@ char *keys[KEYS*2] = {
|
|||||||
"e", "Show/hide hidden or excluded files",
|
"e", "Show/hide hidden or excluded files",
|
||||||
"i", "Show information about selected item",
|
"i", "Show information about selected item",
|
||||||
"r", "Recalculate the current directory",
|
"r", "Recalculate the current directory",
|
||||||
|
"b", "Spawn shell in current directory",
|
||||||
"q", "Quit ncdu"
|
"q", "Quit ncdu"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ static void screen_draw() {
|
|||||||
case ST_CALC: dir_draw(); break;
|
case ST_CALC: dir_draw(); break;
|
||||||
case ST_BROWSE: browse_draw(); break;
|
case ST_BROWSE: browse_draw(); break;
|
||||||
case ST_HELP: help_draw(); break;
|
case ST_HELP: help_draw(); break;
|
||||||
|
case ST_SHELL: shell_draw(); break;
|
||||||
case ST_DEL: delete_draw(); break;
|
case ST_DEL: delete_draw(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
78
src/shell.c
Обычный файл
78
src/shell.c
Обычный файл
@ -0,0 +1,78 @@
|
|||||||
|
/* ncdu - NCurses Disk Usage
|
||||||
|
|
||||||
|
Copyright (c) 2007-2014 Yoran Heling
|
||||||
|
Shell support: Copyright (c) 2014 Thomas Jarosch
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "global.h"
|
||||||
|
#include "dirlist.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#include <ncurses.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
void shell_draw() {
|
||||||
|
char *full_path, *shell;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
/* suspend ncurses mode */
|
||||||
|
def_prog_mode();
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
full_path = getpath(dirlist_par);
|
||||||
|
res = chdir(full_path);
|
||||||
|
if (res != 0) {
|
||||||
|
reset_prog_mode();
|
||||||
|
clear();
|
||||||
|
printw("ERROR: Can't change directory: %s (errcode: %d)\n"
|
||||||
|
"\n"
|
||||||
|
"Press any key to continue.",
|
||||||
|
full_path, res);
|
||||||
|
} else {
|
||||||
|
char *shell = getenv("SHELL");
|
||||||
|
if (shell == NULL)
|
||||||
|
shell = DEFAULT_SHELL;
|
||||||
|
|
||||||
|
res = system(shell);
|
||||||
|
|
||||||
|
/* resume ncurses mode */
|
||||||
|
reset_prog_mode();
|
||||||
|
|
||||||
|
if (res == -1 || WEXITSTATUS(res) != 0) {
|
||||||
|
clear();
|
||||||
|
printw("ERROR: Can't execute shell interpreter: %s\n"
|
||||||
|
"\n"
|
||||||
|
"Press any key to continue.",
|
||||||
|
shell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
pstate = ST_BROWSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shell_init() {
|
||||||
|
pstate = ST_SHELL;
|
||||||
|
}
|
35
src/shell.h
Обычный файл
35
src/shell.h
Обычный файл
@ -0,0 +1,35 @@
|
|||||||
|
/* ncdu - NCurses Disk Usage
|
||||||
|
|
||||||
|
Copyright (c) 2007-2014 Yoran Heling
|
||||||
|
Shell support: Copyright (c) 2014 Thomas Jarosch
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _shell_h
|
||||||
|
#define _shell_h
|
||||||
|
|
||||||
|
#include "global.h"
|
||||||
|
|
||||||
|
void shell_draw(void);
|
||||||
|
void shell_init();
|
||||||
|
|
||||||
|
#endif
|
Загрузка…
x
Ссылка в новой задаче
Block a user