* lisp/net/tramp-sh.el (tramp-awk-encode, tramp-awk-decode)

(tramp-awk-coding-test): New defconsts.
(tramp-remote-coding-commands): Use them.
(tramp-find-inline-encoding): Check for Perl only if necessary.
This commit is contained in:
Michael Albinus 2015-08-25 16:05:21 +02:00
parent 6dfbe9ffc2
commit 46709093be

View file

@ -873,6 +873,72 @@ Escape sequence %s is replaced with name of Perl binary.")
"Perl program to use for decoding a file.
Escape sequence %s is replaced with name of Perl binary.")
(defconst tramp-awk-encode
"od -v -t x1 -A n | busybox awk '\\
BEGIN {
b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"
b16 = \"0123456789abcdef\"
}
{
for (c=1; c<=length($0); c++) {
d=index(b16, substr($0,c,1))
if (d--) {
for (b=1; b<=4; b++) {
o=o*2+int(d/8); d=(d*2)%%16
if (++obc==6) {
printf substr(b64,o+1,1)
if (++rc>75) { printf \"\\n\"; rc=0 }
obc=0; o=0
}
}
}
}
}
END {
if (obc) {
tail=(obc==2) ? \"==\\n\" : \"=\\n\"
while (obc++<6) { o=o*2 }
printf \"%%c\", substr(b64,o+1,1)
} else {
tail=\"\\n\"
}
printf tail
}'"
"Awk program to use for encoding a file.
This string is passed to `format', so percent characters need to be doubled.")
(defconst tramp-awk-decode
"busybox awk '\\
BEGIN {
b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"
}
{
for (i=1; i<=length($0); i++) {
c=index(b64, substr($0,i,1))
if(c--) {
for(b=0; b<6; b++) {
o=o*2+int(c/32); c=(c*2)%%64
if(++obc==8) {
if (o) {
printf \"%%c\", o
} else {
system(\"dd if=/dev/zero bs=1 count=1 2>/dev/null\")
}
obc=0; o=0
}
}
}
}
}'"
"Awk program to use for decoding a file.
This string is passed to `format', so percent characters need to be doubled.")
(defconst tramp-awk-coding-test
"test -c /dev/zero && \
od -v -t x1 -A n </dev/null && \
busybox awk '{}' </dev/null"
"Test command for checking `tramp-awk-encode' and `tramp-awk-decode'.")
(defconst tramp-stat-marker "/////"
"Marker in stat commands for file attributes.")
@ -4245,7 +4311,7 @@ and end of region, and are expected to replace the region contents
with the encoded or decoded results, respectively.")
(defconst tramp-remote-coding-commands
'((b64 "base64" "base64 -d -i")
`((b64 "base64" "base64 -d -i")
;; "-i" is more robust with older base64 from GNU coreutils.
;; However, I don't know whether all base64 versions do supports
;; this option.
@ -4255,6 +4321,8 @@ with the encoded or decoded results, respectively.")
(b64 "recode data..base64" "recode base64..data")
(b64 tramp-perl-encode-with-module tramp-perl-decode-with-module)
(b64 tramp-perl-encode tramp-perl-decode)
;; This is painful slow, so we put it on the end.
(b64 tramp-awk-encode tramp-awk-decode ,tramp-awk-coding-test)
(uu "uuencode xxx" "uudecode -o /dev/stdout" "test -c /dev/stdout")
(uu "uuencode xxx" "uudecode -o -")
(uu "uuencode xxx" "uudecode -p")
@ -4333,7 +4401,8 @@ Goes through the list `tramp-local-coding-commands' and
(unless (tramp-send-command-and-check vec rem-test t)
(throw 'wont-work-remote nil)))
;; Check if remote perl exists when necessary.
(when (and (not (stringp rem-enc))
(when (and (symbolp rem-enc)
(string-match "perl" (symbol-name rem-enc))
(not (tramp-get-remote-perl vec)))
(throw 'wont-work-remote nil))
;; Check if remote encoding and decoding commands can be