make the argument parser for commands accept quoted strings, while i'm
there make u_spawn use exec_wm (renamed to u_exec) for it's execution to remove duplicated code. This means constructs like this work in .cwmrc: bind CM-t "ssh -Y 192.168.1.2 \"xterm -e top\"" or alternatively: bind CM-t "ssh -Y 192.168.1.2 'xterm -e top'" "in it goes" okan@.
This commit is contained in:
parent
5559ba08b3
commit
8b3d596db5
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $Id: calmwm.h,v 1.31 2008/04/15 20:26:50 oga Exp $
|
||||
* $Id: calmwm.h,v 1.32 2008/04/15 21:20:56 oga Exp $
|
||||
*/
|
||||
|
||||
#ifndef _CALMWM_H_
|
||||
@ -401,7 +401,7 @@ int xu_getstate(struct client_ctx *, int *);
|
||||
void xu_key_grab_keycode(Window, int, int);
|
||||
|
||||
int u_spawn(char *);
|
||||
void exec_wm(char *);
|
||||
void u_exec(char *);
|
||||
|
||||
void grab_sweep(struct client_ctx *);
|
||||
void grab_drag(struct client_ctx *);
|
||||
|
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $Id: kbfunc.c,v 1.20 2008/04/15 20:24:41 oga Exp $
|
||||
* $Id: kbfunc.c,v 1.21 2008/04/15 21:20:56 oga Exp $
|
||||
*/
|
||||
|
||||
#include <paths.h>
|
||||
@ -359,7 +359,8 @@ kbfunc_exec(struct client_ctx *scratch, void *arg)
|
||||
u_spawn(mi->text);
|
||||
break;
|
||||
case CWM_EXEC_WM:
|
||||
exec_wm(mi->text);
|
||||
u_exec(mi->text);
|
||||
warn("%s", mi->text);
|
||||
break;
|
||||
default:
|
||||
err(1, "kb_func: egad, cmd changed value!");
|
||||
|
@ -15,7 +15,7 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* $Id: util.c,v 1.7 2008/04/15 20:26:50 oga Exp $
|
||||
* $Id: util.c,v 1.8 2008/04/15 21:20:56 oga Exp $
|
||||
*/
|
||||
|
||||
#include "headers.h"
|
||||
@ -26,19 +26,10 @@
|
||||
int
|
||||
u_spawn(char *argstr)
|
||||
{
|
||||
char *args[MAXARGLEN], **ap;
|
||||
char **end = &args[MAXARGLEN - 1];
|
||||
|
||||
switch (fork()) {
|
||||
case 0:
|
||||
ap = args;
|
||||
while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL)
|
||||
ap++;
|
||||
|
||||
*ap = NULL;
|
||||
setsid();
|
||||
execvp(args[0], args);
|
||||
err(1, args[0]);
|
||||
u_exec(argstr);
|
||||
err(1, "%s", argstr);
|
||||
break;
|
||||
case -1:
|
||||
warn("fork");
|
||||
@ -51,16 +42,35 @@ u_spawn(char *argstr)
|
||||
}
|
||||
|
||||
void
|
||||
exec_wm(char *argstr)
|
||||
u_exec(char *argstr)
|
||||
{
|
||||
char *args[MAXARGLEN], **ap = args;
|
||||
char **end = &args[MAXARGLEN - 1];
|
||||
char *tmp;
|
||||
|
||||
while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL)
|
||||
ap++;
|
||||
while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) {
|
||||
if(**ap == '\0')
|
||||
continue;
|
||||
ap++;
|
||||
if (argstr != NULL) {
|
||||
/* deal with quoted strings */
|
||||
switch(argstr[0]) {
|
||||
case '"':
|
||||
case '\'':
|
||||
if ((tmp = strchr(argstr + 1, argstr[0]))
|
||||
!= NULL) {
|
||||
*(tmp++) = '\0';
|
||||
*(ap++) = ++argstr;
|
||||
argstr = tmp;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*ap = NULL;
|
||||
setsid();
|
||||
execvp(args[0], args);
|
||||
warn(args[0]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user