version 1.145, 2013/05/17 00:13:14 |
version 1.146, 2013/06/04 20:42:36 |
|
|
#include <histedit.h> |
#include <histedit.h> |
#include <paths.h> |
#include <paths.h> |
#include <libgen.h> |
#include <libgen.h> |
|
#include <locale.h> |
#include <signal.h> |
#include <signal.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <stdio.h> |
|
|
char *file, int remote, int lastarg, char quote, int terminated) |
char *file, int remote, int lastarg, char quote, int terminated) |
{ |
{ |
glob_t g; |
glob_t g; |
char *tmp, *tmp2, ins[3]; |
char *tmp, *tmp2, ins[8]; |
u_int i, hadglob, pwdlen, len, tmplen, filelen, cesc, isesc, isabs; |
u_int i, hadglob, pwdlen, len, tmplen, filelen, cesc, isesc, isabs; |
|
int clen; |
const LineInfo *lf; |
const LineInfo *lf; |
|
|
/* Glob from "file" location */ |
/* Glob from "file" location */ |
|
|
tmp2 = tmp + filelen - cesc; |
tmp2 = tmp + filelen - cesc; |
len = strlen(tmp2); |
len = strlen(tmp2); |
/* quote argument on way out */ |
/* quote argument on way out */ |
for (i = 0; i < len; i++) { |
for (i = 0; i < len; i += clen) { |
|
if ((clen = mblen(tmp2 + i, len - i)) < 0 || |
|
(size_t)clen > sizeof(ins) - 2) |
|
fatal("invalid multibyte character"); |
ins[0] = '\\'; |
ins[0] = '\\'; |
ins[1] = tmp2[i]; |
memcpy(ins + 1, tmp2 + i, clen); |
ins[2] = '\0'; |
ins[clen + 1] = '\0'; |
switch (tmp2[i]) { |
switch (tmp2[i]) { |
case '\'': |
case '\'': |
case '"': |
case '"': |
|
|
|
|
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
sanitise_stdfd(); |
sanitise_stdfd(); |
|
setlocale(LC_CTYPE, ""); |
|
|
memset(&args, '\0', sizeof(args)); |
memset(&args, '\0', sizeof(args)); |
args.list = NULL; |
args.list = NULL; |