[sage] BSD printf

Wolfgang Zenker wolfgang at lyxys.ka.sub.org
Wed Sep 26 09:36:29 CEST 2018


Hi,

* Dirk Wetter <dirk.wetter at guug.de> [180926 08:57]:
> ich habe da ein kleines Problem. Wie einige vielleicht
> wissen, habe ich da ein FOSS-Projekt namens testssl.sh.

> Eine Kernfunktion sind Sockets. Das Projekt ist abseits
> ein paar weniger Unix-Tools drumherum in bash -- der kleinste
> gemeinsamste Nenner für BSDs (inkl. OS X), WSL, Cygwin etc.

ich vermute, Du meinst /bin/sh, denn bash ist zumindest bei FreeBSD eine
optionale Erweiterung. Die /bin/sh ist eine Bourne Shell (ohne "again")
und kann nur POSIX.1 plus wenige BSD Erweiterungen.

> Auch die Sockets sind in bash programiert über /dev/tcp/*.
> Das klappt sogar recht gut.

> Leider nur hat das bash interne printf, womit die
> Bytes in die Sockets gesendet werden, das Problem,
> dass es bei jedem "\x0a" ein write flush macht wird, und
> das ein neues Netzpaket wird -- mit dem Resultat, dass
> TCP-Fragmentierung auftritt.

> Eine elegante Lösung wäre ein externes printf zu benutzen.
> Das klappt für Linux, da es genauso funktioniert wie das
> bash-Interne, also:

> /usr/bin/printf --  "\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03" | xxd
> --> 0000000: 1603 0102 0001 0001 fc03                 ..........

> aber leider nicht für BSD, hier FreeBSD:

> -->
> 00000000: 7831 3678 3033 7830 3178 3032 7830 3078  x16x03x01x02x00x
> 00000010: 3031 7830 3078 3031 7866 6378 3033       01x00x01xfcx03

> Frage: geht das mit dem FreeBSD printf überhaupt? Solaris sollte
> ein ähnliches, externes printf haben IIRC.

Sollte gehen, laut Manual (gibts auch im Web unter
https://www.freebsd.org/cgi/man.cgi?query=printf&apropos=0&sektion=1&manpath=FreeBSD+11.2-RELEASE+and+Ports&arch=default&format=html )
kann das Teil im Format-String keine Hex-Konstanten mit \x sondern nur
Octal

Gruß,
Wolfgang



More information about the SAGE mailing list