commit d53e604cc24f5b17985cf3bc5937d16c4a4ed2fc
parent 7273c9d6819c50ab546885f7d6d0e81d03b7ca16
Author: sin <sin@2f30.org>
Date:   Tue, 21 Oct 2014 14:21:00 +0100
Add '!' command to spawn a shell in cwd
Diffstat:
| M | noice.c | | | 44 | ++++++++++++++++++++++++++++---------------- | 
1 file changed, 28 insertions(+), 16 deletions(-)
diff --git a/noice.c b/noice.c
@@ -76,6 +76,24 @@ void printmsg(char *msg);
 void printwarn(void);
 void printerr(int ret, char *prefix);
 
+void
+spawn(const char *file, const char *arg)
+{
+	pid_t pid;
+	int status;
+
+	pid = fork();
+	if (pid == 0) {
+		execlp(file, file, arg, NULL);
+		_exit(1);
+	} else {
+		/* Ignore interruptions */
+		while (waitpid(pid, &status, 0) == -1)
+			DPRINTF_D(status);
+		DPRINTF_D(pid);
+	}
+}
+
 char *
 openwith(char *file)
 {
@@ -234,6 +252,11 @@ nextsel(int *cur, int max)
 		if (*cur > 0)
 			(*cur) -= MIN((LINES - 4) / 2, *cur);
 		break;
+	case '!':
+		exitcurses();
+		spawn("/bin/sh", NULL);
+		initcurses();
+		break;
 	}
 
 	return 0;
@@ -405,13 +428,11 @@ begin:
 		char *pathnew;
 		char *name;
 		char *bin;
-		pid_t pid;
 		int fd;
 		char *dir;
 		char *tmp;
 		regex_t re;
 		struct history *hist;
-		int status;
 
 redraw:
 		nlines = MIN(LINES - 4, n);
@@ -451,7 +472,11 @@ redraw:
 		}
 
 nochange:
+		if (chdir(path) == -1)
+			printwarn();
 		ret = nextsel(&cur, n);
+		if (chdir(ipath) == -1)
+			printwarn();
 		switch (ret) {
 		case SEL_QUIT:
 			free(path);
@@ -542,20 +567,7 @@ nochange:
 				}
 
 				exitcurses();
-
-				/* Run program */
-				pid = fork();
-				if (pid == 0) {
-					execlp(bin, bin, pathnew, NULL);
-					_exit(0);
-				} else {
-					/* Ignore interruptions */
-					while (waitpid(pid, &status,
-					    0) == -1)
-						DPRINTF_D(status);
-					DPRINTF_D(pid);
-				}
-
+				spawn(bin, pathnew);
 				initcurses();
 
 				free(pathnew);