Fix remembering command when it contains shell special or blank chars.

SVN revision: 13710
This commit is contained in:
Kim Woelders 2005-03-12 11:09:33 +00:00
parent 96ea83ccb6
commit 9c78703d97
11 changed files with 216 additions and 53 deletions

View File

@ -1162,7 +1162,7 @@ int ActionsEnd(EWin * ewin);
void About(void);
int execApplication(const char *params);
int doDragButtonEnd(const char *params);
void Espawn(int argc, char **argv);
/* alert.c */
void AlertInit(void);
@ -1677,7 +1677,6 @@ int isfile(const char *s);
int isdir(const char *s);
int isabspath(const char *s);
char **E_ls(const char *dir, int *num);
void freestrlist(char **l, int num);
void E_rm(const char *s);
void E_mv(const char *s, const char *ss);
void E_cp(const char *s, const char *ss);
@ -1922,6 +1921,12 @@ const char *EGetSavePrefixCommon(void);
/* memory.c */
void EDisplayMemUse(void);
char **EstrlistDup(char **lst, int num);
void EstrlistFree(char **lst, int num);
char *EstrlistJoin(char **lst, int num);
char *EstrlistEncodeEscaped(char *buf, int len, char **lst,
int num);
char **EstrlistDecodeEscaped(const char *str, int *pnum);
/* menus.c */
int MenuStyleConfigLoad(FILE * fs);

View File

@ -154,6 +154,28 @@ execApplication(const char *params)
return 0;
}
void
Espawn(int argc __UNUSED__, char **argv)
{
int fd;
if (!argv || !argv[0])
return;
if (fork())
return;
setsid();
/* Close all file descriptors except the std 3 */
for (fd = 3; fd < 1024; fd++)
close(fd);
execvp(argv[0], argv);
DialogAlertOK(_("There was an error running the program:\n%s\n"), argv[0]);
exit(100);
}
void
ActionsHandleMotion(void)
{

View File

@ -366,5 +366,5 @@ CommsBroadcast(const char *s)
if (c)
CommsSend(c, s);
}
freestrlist(l, num);
EstrlistFree(l, num);
}

View File

@ -212,7 +212,7 @@ EwinDestroy(EWin * ewin)
if (ewin->icccm.wm_command)
Efree(ewin->icccm.wm_command);
if (ewin->icccm.wm_command_argv)
freestrlist(ewin->icccm.wm_command_argv, ewin->icccm.wm_command_argc);
EstrlistFree(ewin->icccm.wm_command_argv, ewin->icccm.wm_command_argc);
if (ewin->icccm.wm_machine)
Efree(ewin->icccm.wm_machine);
#if ENABLE_EWMH

View File

@ -195,17 +195,6 @@ E_ls(const char *dir, int *num)
return names;
}
void
freestrlist(char **l, int num)
{
if (!l)
return;
while (num--)
if (l[num])
Efree(l[num]);
Efree(l);
}
void
E_rm(const char *s)
{

View File

@ -523,31 +523,6 @@ ICCCM_GetGeoms(EWin * ewin, Atom atom_change)
ewin->client.w, ewin->client.h, EwinGetName(ewin));
}
static char *
Estrlistjoin(char **pstr, int nstr)
{
int i, size;
char *s;
if (!pstr || nstr <= 0)
return NULL;
s = NULL;
size = strlen(pstr[0]) + 1;
s = Emalloc(size);
strcpy(s, pstr[0]);
for (i = 1; i < nstr; i++)
{
size += strlen(pstr[i]) + 1;
s = Erealloc(s, size);
strcat(s, " ");
strcat(s, pstr[i]);
}
return s;
}
#define TryGroup(e) (((e)->client.group != None) && ((e)->client.group != (e)->client.win))
void
@ -573,6 +548,9 @@ ICCCM_GetInfo(EWin * ewin, Atom atom_change)
if (atom_change == 0 || atom_change == ECORE_X_ATOM_WM_COMMAND)
{
_EFREE(ewin->icccm.wm_command);
if (ewin->icccm.wm_command_argv)
EstrlistFree(ewin->icccm.wm_command_argv,
ewin->icccm.wm_command_argc);
ewin->icccm.wm_command_argv =
ecore_x_window_prop_string_list_get(ewin->client.win,
@ -584,8 +562,9 @@ ICCCM_GetInfo(EWin * ewin, Atom atom_change)
ECORE_X_ATOM_WM_COMMAND,
&(ewin->icccm.
wm_command_argc));
ewin->icccm.wm_command =
Estrlistjoin(ewin->icccm.wm_command_argv,
EstrlistJoin(ewin->icccm.wm_command_argv,
ewin->icccm.wm_command_argc);
}

View File

@ -460,6 +460,161 @@ Estrdupcat2(char *ss, const char *s1, const char *s2)
return s;
}
char **
EstrlistDup(char **lst, int num)
{
char **ss;
int i;
if (!lst || num <= 0)
return NULL;
ss = (char **)Emalloc((num + 1) * sizeof(char *));
for (i = 0; i < num; i++)
ss[i] = Estrdup(lst[i]);
ss[i] = NULL;
return ss;
}
void
EstrlistFree(char **lst, int num)
{
if (!lst)
return;
while (num--)
if (lst[num])
Efree(lst[num]);
Efree(lst);
}
char *
EstrlistJoin(char **lst, int num)
{
int i, size;
char *s;
if (!lst || num <= 0)
return NULL;
s = NULL;
size = strlen(lst[0]) + 1;
s = Emalloc(size);
strcpy(s, lst[0]);
for (i = 1; i < num; i++)
{
size += strlen(lst[i]) + 1;
s = Erealloc(s, size);
strcat(s, " ");
strcat(s, lst[i]);
}
return s;
}
char *
EstrlistEncodeEscaped(char *buf, int len, char **lst, int num)
{
int i, j, ch;
char *s, *p;
if (!lst || num <= 0)
return NULL;
j = 0;
s = buf;
p = lst[0];
for (i = 0; i < len - 2; i++)
{
ch = *p++;
switch (ch)
{
default:
*s++ = ch;
break;
case '\0':
if (++j >= num)
goto done;
p = lst[j];
*s++ = ' ';
break;
case ' ':
*s++ = '\\';
*s++ = ' ';
i++;
break;
}
}
done:
*s = '\0';
return buf;
}
char **
EstrlistDecodeEscaped(const char *str, int *pnum)
{
int num, len;
const char *s, *p;
char **lst;
if (!str)
return NULL;
lst = NULL;
num = 0;
s = str;
for (;;)
{
while (*s == ' ')
s++;
if (*s == '\0')
break;
lst = Erealloc(lst, (num + 1) * sizeof(char *));
lst[num] = NULL;
len = 0;
for (;;)
{
p = strchr(s, ' ');
if (!p)
p = s + strlen(s);
lst[num] = Erealloc(lst[num], len + p - s + 1);
memcpy(lst[num] + len, s, p - s);
len += p - s;
lst[num][len] = '\0';
s = p;
if (p[-1] == '\\')
{
if (*p)
lst[num][len - 1] = ' ';
else
break;
}
else
{
break;
}
while (*s == ' ')
s++;
if (*s == '\0')
break;
}
num++;
}
/* Append NULL item */
lst = Erealloc(lst, (num + 1) * sizeof(char *));
lst[num] = NULL;
*pnum = num;
return lst;
}
#if !USE_LIBC_SETENV
int
Esetenv(const char *name, const char *value, int overwrite __UNUSED__)

View File

@ -222,7 +222,7 @@ MenuCreateFromDirectory(const char *name, Menu * parent, MenuStyle * ms,
if (p)
ProgressbarDestroy(p);
if (list)
freestrlist(list, num);
EstrlistFree(list, num);
return m;
}
@ -511,7 +511,7 @@ MenuCreateFromGnome(const char *name, Menu * parent, MenuStyle * ms,
}
}
if (list)
freestrlist(list, num);
EstrlistFree(list, num);
return m;
}
@ -538,7 +538,7 @@ MenuCreateFromThemes(const char *name, MenuStyle * ms)
MenuAddItem(m, mi);
}
if (lst)
freestrlist(lst, i);
EstrlistFree(lst, i);
return m;
}

View File

@ -42,6 +42,8 @@ struct _snapshot
char sticky;
char shaded;
char *cmd;
int cmd_argc;
char **cmd_argv;
int *groups;
int num_groups;
char skiptask;
@ -89,6 +91,8 @@ SnapshotDestroy(Snapshot * sn)
Efree(sn->border_name);
if (sn->cmd)
Efree(sn->cmd);
if (sn->cmd_argv)
EstrlistFree(sn->cmd_argv, sn->cmd_argc);
if (sn->groups)
Efree(sn->groups);
Efree(sn);
@ -281,7 +285,12 @@ SnapEwinCmd(Snapshot * sn, EWin * ewin)
if (sn->cmd)
Efree(sn->cmd);
if (sn->cmd_argv)
EstrlistFree(sn->cmd_argv, sn->cmd_argc);
sn->cmd = Estrdup(ewin->icccm.wm_command);
sn->cmd_argv =
EstrlistDup(ewin->icccm.wm_command_argv, ewin->icccm.wm_command_argc);
sn->cmd_argc = ewin->icccm.wm_command_argc;
}
static void
@ -1081,7 +1090,7 @@ Real_SaveSnapInfo(int dumval __UNUSED__, void *dumdat __UNUSED__)
{
Snapshot **lst, *sn;
int i, j, num;
char buf[4096], s[4096];
char buf[4096], s[4096], ss[4096];
FILE *f;
if (!Mode.wm.save_ok)
@ -1110,7 +1119,9 @@ Real_SaveSnapInfo(int dumval __UNUSED__, void *dumdat __UNUSED__)
if (sn->use_flags & SNAP_USE_BORDER)
fprintf(f, "BORDER: %s\n", sn->border_name);
if (sn->use_flags & SNAP_USE_COMMAND)
fprintf(f, "CMD: %s\n", sn->cmd);
fprintf(f, "CMD: %s\n",
EstrlistEncodeEscaped(ss, sizeof(ss),
sn->cmd_argv, sn->cmd_argc));
if (sn->use_flags & SNAP_USE_DESK)
fprintf(f, "DESKTOP: %i\n", sn->desktop);
if (sn->use_flags & SNAP_USE_POS)
@ -1176,7 +1187,7 @@ SpawnSnappedCmds(void)
{
sn = lst[i];
if ((sn->use_flags & SNAP_USE_COMMAND) && (sn->cmd) && !sn->used)
execApplication(sn->cmd);
Espawn(sn->cmd_argc, sn->cmd_argv);
}
Efree(lst);
}
@ -1227,7 +1238,9 @@ LoadSnapInfo(void)
else if (!strcmp(s, "CMD:"))
{
sn->use_flags |= SNAP_USE_COMMAND;
sn->cmd = Estrdup(atword(buf, 2));
sn->cmd_argv =
EstrlistDecodeEscaped(atword(buf, 2), &(sn->cmd_argc));
sn->cmd = EstrlistJoin(sn->cmd_argv, sn->cmd_argc);
}
else if (!strcmp(s, "DESKTOP:"))
{

View File

@ -300,7 +300,7 @@ TextSize(TextClass * tclass, int active, int sticky, int state,
*width = wid;
}
}
freestrlist(lines, num_lines);
EstrlistFree(lines, num_lines);
}
void
@ -765,7 +765,7 @@ TextstateDrawText(TextState * ts, Window win, const char *text, int x, int y,
yy += ts->xfont->ascent + ts->xfont->descent;
}
}
freestrlist(lines, num_lines);
EstrlistFree(lines, num_lines);
}
void

View File

@ -147,7 +147,7 @@ append_merge_dir(char *dir, char ***list, int *count)
(*list)[(*count) - 1] = Estrdup(ss);
}
}
freestrlist(str, num);
EstrlistFree(str, num);
return def;
}
@ -249,7 +249,7 @@ ThemeGetDefault(void)
break;
}
if (lst)
freestrlist(lst, num);
EstrlistFree(lst, num);
if (path)
return ThemeGetPath(path);
@ -469,7 +469,7 @@ ThemesIpc(const char *params, Client * c __UNUSED__)
for (i = 0; i < num; i++)
IpcPrintf("%s\n", lst[i]);
if (lst)
freestrlist(lst, num);
EstrlistFree(lst, num);
}
else if (!strcmp(cmd, "use"))
{