mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-08 20:41:59 +03:00
Support of disable of shell variables substitution in the command line.
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
e2c5363eb9
commit
1233059de6
@ -83,6 +83,9 @@ WInput *cmdline;
|
|||||||
static gboolean
|
static gboolean
|
||||||
examine_cd (const char *_path)
|
examine_cd (const char *_path)
|
||||||
{
|
{
|
||||||
|
typedef enum { copy_sym, subst_var } state_t;
|
||||||
|
|
||||||
|
state_t state = copy_sym;
|
||||||
gboolean result;
|
gboolean result;
|
||||||
size_t qlen;
|
size_t qlen;
|
||||||
char *path_tilde, *path;
|
char *path_tilde, *path;
|
||||||
@ -100,44 +103,68 @@ examine_cd (const char *_path)
|
|||||||
/* Variable expansion */
|
/* Variable expansion */
|
||||||
for (p = path_tilde, r = q; *p != '\0' && r < q + MC_MAXPATHLEN;)
|
for (p = path_tilde, r = q; *p != '\0' && r < q + MC_MAXPATHLEN;)
|
||||||
{
|
{
|
||||||
if (*p != '$' || (p[1] == '[' || p[1] == '('))
|
switch (state)
|
||||||
*(r++) = *(p++);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
const char *t;
|
case copy_sym:
|
||||||
|
if (p[0] == '\\' && p[1] == '$')
|
||||||
p++;
|
|
||||||
if (*p == '{')
|
|
||||||
{
|
{
|
||||||
|
/* skip backslash */
|
||||||
p++;
|
p++;
|
||||||
s = strchr (p, '}');
|
/* copy dollar */
|
||||||
|
*(r++) = *(p++);
|
||||||
}
|
}
|
||||||
|
else if (p[0] != '$' || p[1] == '[' || p[1] == '(')
|
||||||
|
*(r++) = *(p++);
|
||||||
else
|
else
|
||||||
s = NULL;
|
state = subst_var;
|
||||||
if (s == NULL)
|
break;
|
||||||
s = strchr (p, PATH_SEP);
|
|
||||||
if (s == NULL)
|
case subst_var:
|
||||||
s = strchr (p, '\0');
|
|
||||||
c = *s;
|
|
||||||
*s = '\0';
|
|
||||||
t = getenv (p);
|
|
||||||
*s = c;
|
|
||||||
if (t == NULL)
|
|
||||||
{
|
{
|
||||||
*(r++) = '$';
|
const char *t;
|
||||||
if (*(p - 1) != '$')
|
|
||||||
*(r++) = '{';
|
/* skip dollar */
|
||||||
}
|
p++;
|
||||||
else
|
|
||||||
{
|
if (p[0] != '{')
|
||||||
if (r + strlen (t) < q + MC_MAXPATHLEN)
|
s = NULL;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
strcpy (r, t);
|
|
||||||
r = strchr (r, '\0');
|
|
||||||
}
|
|
||||||
p = s;
|
|
||||||
if (*s == '}')
|
|
||||||
p++;
|
p++;
|
||||||
|
s = strchr (p, '}');
|
||||||
|
}
|
||||||
|
if (s == NULL)
|
||||||
|
s = strchr (p, PATH_SEP);
|
||||||
|
if (s == NULL)
|
||||||
|
s = strchr (p, '\0');
|
||||||
|
c = *s;
|
||||||
|
*s = '\0';
|
||||||
|
t = getenv (p);
|
||||||
|
*s = c;
|
||||||
|
if (t == NULL)
|
||||||
|
{
|
||||||
|
*(r++) = '$';
|
||||||
|
if (p[-1] != '$')
|
||||||
|
*(r++) = '{';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t tlen;
|
||||||
|
|
||||||
|
tlen = strlen (t);
|
||||||
|
|
||||||
|
if (r + tlen < q + MC_MAXPATHLEN)
|
||||||
|
{
|
||||||
|
strncpy (r, t, tlen + 1);
|
||||||
|
r += tlen;
|
||||||
|
}
|
||||||
|
p = s;
|
||||||
|
if (*s == '}')
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = copy_sym;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user