<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>stbuehler.de</title><description>stbuehler.de</description><link>https://stbuehler.de/</link><atom:link href="https://stbuehler.de/feed_rss_updated.xml" rel="self" type="application/rss+xml" /> <managingEditor>Stefan Bühler</managingEditor><language>en</language> <pubDate>Thu, 14 May 2026 18:49:20 -0000</pubDate> <lastBuildDate>Thu, 14 May 2026 18:49:20 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.19.0</generator> <image> <url>None</url> <title>stbuehler.de</title> <link>https://stbuehler.de/</link> </image> <item> <title>Creating a blog with nanoc3</title> <description>&lt;p&gt;Welcome to the first post on my blog!&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;&lt;a href=&#34;http://nanoc.stoneship.org/&#34;&gt;nanoc3&lt;/a&gt; is a framework to compile static websites; as only i am modifying the content, there is no need for any dynamic part in it - i can just update the static files when i want to change something.&lt;/p&gt; &lt;p&gt;A static website has some interesting features:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;No need for any database setup&lt;/li&gt; &lt;li&gt;No need to run php/python/ruby/perl (or whatever you would use to generate pages) on your webserver, resulting in lower load and faster responses&lt;/li&gt; &lt;li&gt;Less software to maintain on the server which means less security problems.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;You can compile dynamic parts too of course, for example i could compile the menu and the design for a page statically and still create the content with php.&lt;/p&gt; &lt;p&gt;This is all nice for a simple web page, you can easily maintain pages about you and your projects, but sometimes you like external input like comments on your page. This is where &lt;a href=&#34;http://disqus.com/&#34;&gt;DISQUS&lt;/a&gt; comes in, and i hope it saves me a lot of problems with spam and keeping a &amp;ldquo;comment software&amp;rdquo; uptodate :)&lt;/p&gt; &lt;p&gt;nanoc3 generates content items from static files by default, but you can add your own sources too; so i wrote a &amp;ldquo;blog&amp;rdquo; source, which creates virtual items like monthly overviews. Perhaps i will publish my nanoc3 helpers sometime in the future :)&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2011/05/13/creating_a_blog_with_nanoc3.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/05/13/creating_a_blog_with_nanoc3.html</guid> </item> <item> <title>DKIM fails at Content-Transfer-Encoding</title> <description>&lt;p&gt;DomainKeys Identified Mail (DKIM) is used to prevent people from sending spam mails with &amp;ldquo;from&amp;rdquo; mail addresses from your domain; you announce with DNS records that you sign all your mails with a RSA key, and everyone can check whether mails have been really sent by you.&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;For this it hashes (parts of) the body and some headers, and signs these hashes with the private RSA key; the public RSA key is published with DNS. You can for example see my DKIM public key with the following command:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;dig&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;TXT&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler1._domainkey.stbuehler.de. &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; TXT stbuehler1._domainkey.stbuehler.de.&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;; global options: +cmd&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;; Got answer:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 38117&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;; QUESTION SECTION:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;stbuehler1._domainkey.stbuehler.de. IN TXT&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-11&#34;&gt;&lt;a id=&#34;__codelineno-0-11&#34; name=&#34;__codelineno-0-11&#34; href=&#34;#__codelineno-0-11&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-12&#34;&gt;&lt;a id=&#34;__codelineno-0-12&#34; name=&#34;__codelineno-0-12&#34; href=&#34;#__codelineno-0-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;;; ANSWER SECTION:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-13&#34;&gt;&lt;a id=&#34;__codelineno-0-13&#34; name=&#34;__codelineno-0-13&#34; href=&#34;#__codelineno-0-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;stbuehler1._domainkey.stbuehler.de. 86400 IN TXT &amp;quot;v=DKIM1\; g=*\; k=rsa\; p=MIG&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-14&#34;&gt;&lt;a id=&#34;__codelineno-0-14&#34; name=&#34;__codelineno-0-14&#34; href=&#34;#__codelineno-0-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;fMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDiuq2TzvQJZU3QRkAwrOxGid4aamyykI8y/+LrIhE0j4&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-15&#34;&gt;&lt;a id=&#34;__codelineno-0-15&#34; name=&#34;__codelineno-0-15&#34; href=&#34;#__codelineno-0-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;yxHOBi2EQQ8UN/oYsrLHuzTe3bC83r/ir5nm3r1Zp+u+0hIBGYUSmektWA/YEJnEFWcqOl80F0arid9&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-16&#34;&gt;&lt;a id=&#34;__codelineno-0-16&#34; name=&#34;__codelineno-0-16&#34; href=&#34;#__codelineno-0-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;m+pcdvJ4u0rygZDggaNppI5X6g2ZE45gdxmTTF5Z3boqigFDwIDAQAB&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;There are some problems with mailing lists (they often modify body and headers, especially the subject), but you can solve these problems by not signing the subject and signing only the initial part of the body; as this system is about preventing spam, the cryptographic requirements are not that high (you should use GPG for everything else).&lt;/p&gt; &lt;p&gt;But recently i stumbled across another serious issue; a friend had some problems with his DKIM setup, where he was able to successfuly verify DKIM signatures from most people, but it failed for one. The log showed it failed verifying the body hash, and so it was clear that something was messing with the body.&lt;br /&gt; After some test mails i saw something suspicious: mails which i got with &amp;ldquo;Content-Transfer-Encoding: 8bit&amp;rdquo; would fail for him (but succeed for me), and he got them as &amp;ldquo;Content-Transfer-Encoding: quoted-printable&amp;rdquo;. So his mail server didn&amp;rsquo;t accept 8bit mails, and the origin mail server would change the encoding to quoted-printable, thus modifying the body, and not recalculate the DKIM signature; my mail server did accept the 8bit encoding, so it worked for me.&lt;br /&gt; The reason the setup works with most people is that nearly no one uses 8bit encoding&amp;hellip;&lt;/p&gt; &lt;p&gt;So, we found the problem, but whose fault is it?&lt;/p&gt; &lt;p&gt;It turns out the DKIM rfc says you SHOULD always convert your messages to 7bit / quoted-printable encodings&amp;hellip;&lt;/p&gt; &lt;p&gt;This basically makes 8bit, which was introduced to save bandwidth when you send (binary) attachments, completely unusable with DKIM.&lt;/p&gt; &lt;p&gt;Imho the body should have been hashed after reverting the content-transfer-encoding, so recoding with a different encoding doesn&amp;rsquo;t change the hash.&lt;/p&gt; &lt;p&gt;BTW: I don&amp;rsquo;t recall seeing any DKIM setup howto mentioning that you should disable 8bit encoding&amp;hellip;&lt;/p&gt; &lt;p&gt;References:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&#34;&gt;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc4871&#34;&gt;RFC 4871&lt;/a&gt; - &amp;ldquo;DomainKeys Identified Mail (DKIM) Signatures&amp;rdquo;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc4871#section-5.3&#34;&gt;RFC 4871 Section 5.3&lt;/a&gt; - the section about body encodings.&lt;/li&gt; &lt;/ul&gt;</description> <link>https://stbuehler.de/blog/article/2011/05/19/dkim_fails_at_content-transfer-encoding.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/05/19/dkim_fails_at_content-transfer-encoding.html</guid> </item> <item> <title>Debugging Ada exceptions</title> <description>&lt;p&gt;Each time i have to code in Ada i just hate the language&amp;hellip; it makes &amp;ldquo;clean&amp;rdquo; coding a pain in the ass (easy workarounds would include using pointers everywhere).&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;This time i need to use protected objects; protected objects have some associated code blocks (entries, procedures and functions), which can access the private data part; but only one thread can enter such block for one object at a time.&lt;br /&gt; But all these entry points are public to everyone who sees the protected type; you can&amp;rsquo;t have private entry points which would be only accessible from your internal package.&lt;br /&gt; So i ended up hiding the protected type in the private part of my package, and using a private record as wrapper around it&amp;hellip; (i need this to get a pointer to the protected object too; i can&amp;rsquo;t get a pointer to the protected object in the entry points - there is no &amp;ldquo;this&amp;rdquo; or &amp;ldquo;self&amp;rdquo; variable).&lt;/p&gt; &lt;p&gt;The real fun started when I ran my test program and it crashed; it would show me the exception cause, but not the location and no backtrace. Attaching with gdb didn&amp;rsquo;t help either; there is no automatic breakpoint on unhandled exceptions, and the program doesn&amp;rsquo;t call &lt;code&gt;abort()&lt;/code&gt; (which gdb would break on, and i think this is the way C++ handles it).&lt;br /&gt; Google came up with various different methods to break on unhandled exceptions in ada; only one was a recognized command:&lt;/p&gt; &lt;p&gt;```console linenums=1 $ gdb ./main [&amp;hellip;] (gdb) catch exception unhandled Unable to insert catchpoint. Try to start the program first. (gdb) start Temporary breakpoint 1 at 0x416d9e: file &amp;hellip;/main.adb, line 53. Starting program: &amp;hellip;/main [Thread debugging using libthread_db enabled]&lt;/p&gt; &lt;p&gt;Temporary breakpoint 1, main () at ..../main.adb:53 53 Test; (gdb) catch exception unhandled Cannot insert catchpoints in this configuration. &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;And it didn&amp;#39;t work. I searched for the gdb code, and found this &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;(&amp;lt;http://gcc.gnu.org/bugzilla/attachment.cgi?id=21797&amp;gt;): &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;```c &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;static const struct exception_support_info default_exception_support_info = &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;{ &lt;/span&gt;&lt;span id=&#34;_code_line-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt; &amp;quot;__gnat_debug_raise_exception&amp;quot;, &lt;/span&gt;&lt;span id=&#34;_code_line-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt; &amp;quot;__gnat_unhandled_exception&amp;quot;, &lt;/span&gt;&lt;span id=&#34;_code_line-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt; &amp;quot;__gnat_debug_raise_assert_failure&amp;quot;, &lt;/span&gt;&lt;span id=&#34;_code_line-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt; ada_unhandled_exception_name_addr &lt;/span&gt;&lt;span id=&#34;_code_line-0-11&#34;&gt;&lt;a id=&#34;__codelineno-0-11&#34; name=&#34;__codelineno-0-11&#34; href=&#34;#__codelineno-0-11&#34;&gt;&lt;/a&gt;}; &lt;/span&gt;&lt;span id=&#34;_code_line-0-12&#34;&gt;&lt;a id=&#34;__codelineno-0-12&#34; name=&#34;__codelineno-0-12&#34; href=&#34;#__codelineno-0-12&#34;&gt;&lt;/a&gt;static const struct exception_support_info exception_support_info_fallback = &lt;/span&gt;&lt;span id=&#34;_code_line-0-13&#34;&gt;&lt;a id=&#34;__codelineno-0-13&#34; name=&#34;__codelineno-0-13&#34; href=&#34;#__codelineno-0-13&#34;&gt;&lt;/a&gt;{ &lt;/span&gt;&lt;span id=&#34;_code_line-0-14&#34;&gt;&lt;a id=&#34;__codelineno-0-14&#34; name=&#34;__codelineno-0-14&#34; href=&#34;#__codelineno-0-14&#34;&gt;&lt;/a&gt; &amp;quot;__gnat_raise_nodefer_with_msg&amp;quot;, &lt;/span&gt;&lt;span id=&#34;_code_line-0-15&#34;&gt;&lt;a id=&#34;__codelineno-0-15&#34; name=&#34;__codelineno-0-15&#34; href=&#34;#__codelineno-0-15&#34;&gt;&lt;/a&gt; &amp;quot;__gnat_unhandled_exception&amp;quot;, &lt;/span&gt;&lt;span id=&#34;_code_line-0-16&#34;&gt;&lt;a id=&#34;__codelineno-0-16&#34; name=&#34;__codelineno-0-16&#34; href=&#34;#__codelineno-0-16&#34;&gt;&lt;/a&gt; &amp;quot;system__assertions__raise_assert_failure&amp;quot;, &lt;/span&gt;&lt;span id=&#34;_code_line-0-17&#34;&gt;&lt;a id=&#34;__codelineno-0-17&#34; name=&#34;__codelineno-0-17&#34; href=&#34;#__codelineno-0-17&#34;&gt;&lt;/a&gt; ada_unhandled_exception_name_addr_from_raise &lt;/span&gt;&lt;span id=&#34;_code_line-0-18&#34;&gt;&lt;a id=&#34;__codelineno-0-18&#34; name=&#34;__codelineno-0-18&#34; href=&#34;#__codelineno-0-18&#34;&gt;&lt;/a&gt;}; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt; &lt;p&gt;So i just tried:&lt;/p&gt; &lt;p&gt;&lt;code&gt;console linenums=14 (gdb) break __gnat_unhandled_exception Breakpoint 2 at 0x7ffff78bdb1e (gdb) continue [...]&lt;/code&gt;&lt;/p&gt; &lt;p&gt;It breaks on the next unhandled exception, showing a useful backtrace and so on. (On my system the second set of function names was the &amp;ldquo;good&amp;rdquo; one - break on &lt;code&gt;__gnat_raise_nodefer_with_msg&lt;/code&gt; to see all exceptions, break on &lt;code&gt;system__assertions__raise_assert_failure&lt;/code&gt; to see all failed asserts).&lt;/p&gt; &lt;p&gt;PS: To get useful backtraces (i.e. including formal parameters and local values) you have to disable optimisations; gdb can not track the value of variables if they are only stored in registers.&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2011/05/24/debugging_ada_exceptions.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/05/24/debugging_ada_exceptions.html</guid> </item> <item> <title>GNAT BUG on access procedure parameter in protected type entry</title> <description>&lt;p&gt;I already mentioned that i don&amp;rsquo;t like Ada, but I didn&amp;rsquo;t expect to hit something like this:&lt;/p&gt; &lt;!-- more --&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;gnatmake&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;gnatbug &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;gcc-4.4 -c gnatbug.adb&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;+===========================GNAT BUG DETECTED==============================+&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| 4.4.6 (x86_64-pc-linux-gnu) Assert_Failure sem_ch3.adb:1063 |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| Error detected at gnatbug.adb:3:17 |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| Please submit a bug report; see http://gcc.gnu.org/bugs.html. |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| Use a subject line meaningful to you and us to track the bug. |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| Include the entire contents of this bug box in the report. |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| Include the exact gcc-4.4 or gnatmake command that you entered. |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| Also include sources listed below in gnatchop format |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-11&#34;&gt;&lt;a id=&#34;__codelineno-0-11&#34; name=&#34;__codelineno-0-11&#34; href=&#34;#__codelineno-0-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;| (concatenated together with no headers between files). |&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-12&#34;&gt;&lt;a id=&#34;__codelineno-0-12&#34; name=&#34;__codelineno-0-12&#34; href=&#34;#__codelineno-0-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;+==========================================================================+&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-13&#34;&gt;&lt;a id=&#34;__codelineno-0-13&#34; name=&#34;__codelineno-0-13&#34; href=&#34;#__codelineno-0-13&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-14&#34;&gt;&lt;a id=&#34;__codelineno-0-14&#34; name=&#34;__codelineno-0-14&#34; href=&#34;#__codelineno-0-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Please include these source files with error report&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-15&#34;&gt;&lt;a id=&#34;__codelineno-0-15&#34; name=&#34;__codelineno-0-15&#34; href=&#34;#__codelineno-0-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Note that list may not be accurate in some cases,&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-16&#34;&gt;&lt;a id=&#34;__codelineno-0-16&#34; name=&#34;__codelineno-0-16&#34; href=&#34;#__codelineno-0-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;so please double check that the problem can still&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-17&#34;&gt;&lt;a id=&#34;__codelineno-0-17&#34; name=&#34;__codelineno-0-17&#34; href=&#34;#__codelineno-0-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;be reproduced with the set of files listed.&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-18&#34;&gt;&lt;a id=&#34;__codelineno-0-18&#34; name=&#34;__codelineno-0-18&#34; href=&#34;#__codelineno-0-18&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-19&#34;&gt;&lt;a id=&#34;__codelineno-0-19&#34; name=&#34;__codelineno-0-19&#34; href=&#34;#__codelineno-0-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;gnatbug.adb&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-20&#34;&gt;&lt;a id=&#34;__codelineno-0-20&#34; name=&#34;__codelineno-0-20&#34; href=&#34;#__codelineno-0-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;gnatbug.ads&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-21&#34;&gt;&lt;a id=&#34;__codelineno-0-21&#34; name=&#34;__codelineno-0-21&#34; href=&#34;#__codelineno-0-21&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-22&#34;&gt;&lt;a id=&#34;__codelineno-0-22&#34; name=&#34;__codelineno-0-22&#34; href=&#34;#__codelineno-0-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;compilation abandoned&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-23&#34;&gt;&lt;a id=&#34;__codelineno-0-23&#34; name=&#34;__codelineno-0-23&#34; href=&#34;#__codelineno-0-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;gnatmake: &amp;quot;gnatbug.adb&amp;quot; compilation error&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;So GNAT doesn&amp;rsquo;t like &amp;ldquo;access procedure&amp;rdquo; parameters in entries for protected types. As I&amp;rsquo;m hiding the protected types anyway and there is no need to protect the object while running the callback I was able to workaround it: calling the entry, then the callback, and then a cleanup procedure&amp;hellip;&lt;/p&gt; &lt;p&gt;Here the simplified testcase sources, which I also provided to the upstream bug: &lt;a href=&#34;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49164&#34;&gt;Bug 49164 - GNAT BUG on access procedure parameter in protected type entry&lt;/a&gt;&lt;/p&gt; &lt;p&gt;```ada linenums=1 title=&amp;rdquo;gnatbug.ads&amp;rdquo; package Gnatbug is protected type X is entry Foo (Bar : access procedure); private Member : Integer := 0; end X; end Gnatbug; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;```ada linenums=1 title=&amp;quot;gnatbug.adb&amp;quot; &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;package body Gnatbug is &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt; protected body X is &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt; entry Foo (Bar : access procedure) &lt;/span&gt;&lt;span id=&#34;_code_line-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt; when Member = 0 is &lt;/span&gt;&lt;span id=&#34;_code_line-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt; begin &lt;/span&gt;&lt;span id=&#34;_code_line-1-7&#34;&gt;&lt;a id=&#34;__codelineno-1-7&#34; name=&#34;__codelineno-1-7&#34; href=&#34;#__codelineno-1-7&#34;&gt;&lt;/a&gt; Bar.all; &lt;/span&gt;&lt;span id=&#34;_code_line-1-8&#34;&gt;&lt;a id=&#34;__codelineno-1-8&#34; name=&#34;__codelineno-1-8&#34; href=&#34;#__codelineno-1-8&#34;&gt;&lt;/a&gt; end; &lt;/span&gt;&lt;span id=&#34;_code_line-1-9&#34;&gt;&lt;a id=&#34;__codelineno-1-9&#34; name=&#34;__codelineno-1-9&#34; href=&#34;#__codelineno-1-9&#34;&gt;&lt;/a&gt; end X; &lt;/span&gt;&lt;span id=&#34;_code_line-1-10&#34;&gt;&lt;a id=&#34;__codelineno-1-10&#34; name=&#34;__codelineno-1-10&#34; href=&#34;#__codelineno-1-10&#34;&gt;&lt;/a&gt;end Gnatbug; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2011/05/25/gnat_bug_on_access_procedure_parameter_in_protected_type_entry.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/05/25/gnat_bug_on_access_procedure_parameter_in_protected_type_entry.html</guid> </item> <item> <title>Exporting redmine wiki pages</title> <description>&lt;p&gt;I wanted to export all wiki pages of a redmine project as plain text (the original textile code) with a small yaml header:&lt;/p&gt; &lt;!-- more --&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;~/redmine $ RAILS_ENV=production ./script/console -s&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Loading production environment in sandbox (Rails 2.3.11)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Any modifications you make will be rolled back on exit&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;NOTE: SourceIndex.new(hash) is deprecated; From /usr/lib/ruby/gems/1.8/gems/rails-2.3.11/lib/rails/vendor_gem_source_index.rb:100:in `new&amp;#39;.&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; def export_text(p)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; c = p.content_for_version(nil)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; &amp;quot;---\ntitle: #{p.title}\nupdated_on: #{c.updated_on}\n---\n\n#{c.text}&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; end&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;=&amp;gt; nil&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; def export_wiki(dir, wiki)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-11&#34;&gt;&lt;a id=&#34;__codelineno-0-11&#34; name=&#34;__codelineno-0-11&#34; href=&#34;#__codelineno-0-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; dir = dir + &amp;quot;/&amp;quot; + wiki.project.identifier&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-12&#34;&gt;&lt;a id=&#34;__codelineno-0-12&#34; name=&#34;__codelineno-0-12&#34; href=&#34;#__codelineno-0-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; Dir.mkdir(dir)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-13&#34;&gt;&lt;a id=&#34;__codelineno-0-13&#34; name=&#34;__codelineno-0-13&#34; href=&#34;#__codelineno-0-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; wiki.pages.each { |p|File.open(dir + &amp;quot;/&amp;quot; + p.title + &amp;quot;.textile&amp;quot;, &amp;quot;w&amp;quot;) { |f| f.write(export_text(p)) } }&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-14&#34;&gt;&lt;a id=&#34;__codelineno-0-14&#34; name=&#34;__codelineno-0-14&#34; href=&#34;#__codelineno-0-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; true&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-15&#34;&gt;&lt;a id=&#34;__codelineno-0-15&#34; name=&#34;__codelineno-0-15&#34; href=&#34;#__codelineno-0-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; end&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-16&#34;&gt;&lt;a id=&#34;__codelineno-0-16&#34; name=&#34;__codelineno-0-16&#34; href=&#34;#__codelineno-0-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;=&amp;gt; nil&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-17&#34;&gt;&lt;a id=&#34;__codelineno-0-17&#34; name=&#34;__codelineno-0-17&#34; href=&#34;#__codelineno-0-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; Project.all&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-18&#34;&gt;&lt;a id=&#34;__codelineno-0-18&#34; name=&#34;__codelineno-0-18&#34; href=&#34;#__codelineno-0-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;=&amp;gt; [#&amp;lt;Project id: 2, name: &amp;quot;Debian Server&amp;quot;, ... , identifier: &amp;quot;debianserver&amp;quot;, ...&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-19&#34;&gt;&lt;a id=&#34;__codelineno-0-19&#34; name=&#34;__codelineno-0-19&#34; href=&#34;#__codelineno-0-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;gt;&amp;gt; export_wiki(&amp;quot;/tmp&amp;quot;, Project.find(2).wiki)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-20&#34;&gt;&lt;a id=&#34;__codelineno-0-20&#34; name=&#34;__codelineno-0-20&#34; href=&#34;#__codelineno-0-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;=&amp;gt; true&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Now &lt;code&gt;/tmp/debianserver/&lt;/code&gt; contains all the wiki pages.&lt;/p&gt; &lt;p&gt;The ruby functions without irb shell:&lt;/p&gt; &lt;div class=&#34;language-ruby copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;export_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content_for_version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;---&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;title: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;updated_on: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;updated_on&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n\n&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;export_wiki&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wiki&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-7&#34;&gt;&lt;a id=&#34;__codelineno-1-7&#34; name=&#34;__codelineno-1-7&#34; href=&#34;#__codelineno-1-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wiki&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;identifier&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-8&#34;&gt;&lt;a id=&#34;__codelineno-1-8&#34; name=&#34;__codelineno-1-8&#34; href=&#34;#__codelineno-1-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mkdir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-9&#34;&gt;&lt;a id=&#34;__codelineno-1-9&#34; name=&#34;__codelineno-1-9&#34; href=&#34;#__codelineno-1-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wiki&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;.textile&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;export_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-10&#34;&gt;&lt;a id=&#34;__codelineno-1-10&#34; name=&#34;__codelineno-1-10&#34; href=&#34;#__codelineno-1-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;true&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-11&#34;&gt;&lt;a id=&#34;__codelineno-1-11&#34; name=&#34;__codelineno-1-11&#34; href=&#34;#__codelineno-1-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description> <link>https://stbuehler.de/blog/article/2011/06/04/exporting_redmine_wiki_pages.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/06/04/exporting_redmine_wiki_pages.html</guid> </item> <item> <title>Flash sound issues with 64-bit linux</title> <description>&lt;!-- more --&gt; &lt;p&gt;A glibc change committed one year ago (&lt;a href=&#34;http://sourceware.org/git/?p=glibc.git;a=commit;h=6fb8cbcb58a29fff73eb2101b34caa19a7f88eba&#34;&gt;Improve 64bit memcpy/memmove for Atom, Core 2 and Core i7&lt;/a&gt;), which already resulted in some &lt;del&gt;flamewars&lt;/del&gt; discussions (involving &lt;a href=&#34;http://sourceware.org/bugzilla/show_bug.cgi?id=12518&#34;&gt;Linus Torvalds vs. Ulrich Drepper&lt;/a&gt;), broke some applications which used &lt;a href=&#34;http://pubs.opengroup.org/onlinepubs/009695399/functions/memcpy.html&#34;&gt;memcpy&lt;/a&gt; when they should have used &lt;a href=&#34;http://pubs.opengroup.org/onlinepubs/009695399/functions/memmove.html&#34;&gt;memmove&lt;/a&gt; (only the latter handles overlapping memory areas).&lt;/p&gt; &lt;p&gt;Many applications have probably been fixed, but Adobe never took their 64-bit linux flash player very serious. So if your flash player has a very strange sound output, you can try to preload a wrapper libary which replaces memcpy with memmove.&lt;/p&gt; &lt;p&gt;Debian includes such wrapper in the 64-bit libc6 package (for details read &lt;code&gt;/usr/share/doc/libc6/NEWS.Debian.gz&lt;/code&gt;), just check whether you have the file &lt;code&gt;/usr/lib/x86_64-linux-gnu/libc/memcpy-preload.so&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;If you do, just run something like this:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;cat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/etc/ld.so.preload &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;/usr/lib/x86_64-linux-gnu/libc/memcpy-preload.so&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;&amp;lt;ctrl-d&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;And all (64 bit) applications on your system will use memmove - and this fixed the sound issues for me :)&lt;/p&gt; &lt;p&gt;Another way to fix it is to use &lt;code&gt;nspluginwrapper&lt;/code&gt; and the 32-bit flash player.&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2011/07/03/flash_sound_issues_with_64-bit_linux.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/07/03/flash_sound_issues_with_64-bit_linux.html</guid> </item> <item> <title>openSUSE Build Service</title> <description>&lt;!-- more --&gt; &lt;h2 id=&#34;why-you-want-packages-instead-of-building-software-yourself&#34;&gt;Why you want packages instead of building software yourself&lt;a class=&#34;headerlink&#34; href=&#34;#why-you-want-packages-instead-of-building-software-yourself&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Open source projects often have more or less simple instructions to build their software. Sometimes this can be the right thing to use, but often you want a better integration into your system; for example init scripts, logrotate configs, config files, &amp;hellip; Using packages also provides an easy way to get rid of the software again (some projects provide a &amp;ldquo;make uninstall&amp;rdquo;, but it often doesn&amp;rsquo;t work reliable).&lt;/p&gt; &lt;p&gt;Especially when your distribution already provides a package, and you just want a newer release than what your distribution provides, building it yourself leads to more problems:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;if you install it in the same place like the still installed package, you get an ugly mix of new and old files (the new install perhaps doesn&amp;rsquo;t provide all files the old package did); and if you decide to remove the package later (&amp;ldquo;I build it myself, don&amp;rsquo;t need the package anymore&amp;rdquo;), it obviously breaks.&lt;/li&gt; &lt;li&gt;if you install it in a different place (/usr/local instead of /usr for example), you get funny path conflicts - /usr/local/bin isn&amp;rsquo;t always in your PATH, but if it is, it is probably before /usr/bin; so depending on the context you will either use the old or the new binaries (&amp;ldquo;I installed the new release, but it still misses the feature&amp;rdquo;).&lt;/li&gt; &lt;li&gt;for (shared) libraries installing without a package is suicide, as you need the package manager to track dependencies (and conflicts).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;So you basically shouldn&amp;rsquo;t install software without a package manager.&lt;/p&gt; &lt;p&gt;If your distribution already provides a package, updating the package to a newer release might be easy, the package systems often try to keep the original source and their modifications to it separated in some way, so you only have to check whether those modifications still work with the new release, and perhaps update the dependencies.&lt;/p&gt; &lt;h2 id=&#34;why-providing-packages-isnt-wasnt-easy&#34;&gt;Why providing packages &lt;del&gt;isn&amp;rsquo;t&lt;/del&gt; wasn&amp;rsquo;t easy&lt;a class=&#34;headerlink&#34; href=&#34;#why-providing-packages-isnt-wasnt-easy&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Obviously building packages still isn&amp;rsquo;t easy for most users, so it is obvious that you want the upstream developers to provide packages for their latest releases (the maintainers of your distribution won&amp;rsquo;t have the time to track all the upstream projects, and perhaps your distribution doesn&amp;rsquo;t even provide a package at all).&lt;/p&gt; &lt;p&gt;But providing packages for many distributions is time-consuming; you need to build the package on every distribution, and therefore have to maintain a install of it somewhere (probably in a vm).&lt;br /&gt; Often different releases of a distribution need different handling in the details, perhaps have different names for dependencies or the build software providing more or less features.&lt;/p&gt; &lt;p&gt;In debian, the core build helpers are dpkg-dev and debhelper. Many packages require now debhelper &amp;gt;= 8, but older releases only have older versions. So now you need to install a new debhelper, which in turn requires perl 5.10 - which isn&amp;rsquo;t available in ubuntu hardy (still LTS for server).&lt;/p&gt; &lt;p&gt;You probable see now why most open source projects either provide no packages or only packages for a small number of dists (probably the ones they are using on their own systems).&lt;/p&gt; &lt;h2 id=&#34;the-solution&#34;&gt;The solution&lt;a class=&#34;headerlink&#34; href=&#34;#the-solution&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;a href=&#34;https://build.opensuse.org/&#34;&gt;https://build.opensuse.org/&lt;/a&gt; (OBS) - while the url might look like they only support openSUSE, they actually support building rpm and deb packages for many distributions.&lt;/p&gt; &lt;p&gt;From time to time we discussed the problem with the debhelper versions; I failed backporting it on launchpad some years ago. &lt;a href=&#34;https://nordisch.org./&#34;&gt;darix&lt;/a&gt; finally tried it and got debhelper 8.1.6~bpo60+1 packages for Ubuntu 9.10, 10.04, 10.10 and 11.04. They didn&amp;rsquo;t need any other dependencies, so it wasn&amp;rsquo;t that hard :)&lt;br /&gt; Now I finally got the Ubuntu 8.04 (hardy, LTS server) backport for debhelper and dpgk (and po4a) working, with some more or less ugly hacks in debhelper to get it working with perl 5.8.&lt;/p&gt; &lt;p&gt;Now I can use the same source package for all debian distributions, and still use the features from the current debhelper (as many packages in debian do, so it is easy to update a debian package to a newer version and build it in OBS).&lt;/p&gt; &lt;p&gt;Configure a project to build packages for Ubuntu hardy with backported debhelper:&lt;/p&gt; &lt;div class=&#34;language-xml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;xUbuntu_8.04&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;project=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Ubuntu:backport-overlay&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;repository=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;xUbuntu_8.04&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;project=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Ubuntu:8.04&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;repository=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;standard&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;arch&amp;gt;&lt;/span&gt;x86_64&lt;span class=&#34;nt&#34;&gt;&amp;lt;/arch&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;arch&amp;gt;&lt;/span&gt;i586&lt;span class=&#34;nt&#34;&gt;&amp;lt;/arch&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Similar for other Ubuntu versions (you can omit the second path line, as is included by the overlay too)&lt;/p&gt; &lt;p&gt;You can see some examples of this in the &lt;a href=&#34;https://build.opensuse.org/project/monitor?project=server%3Ahttp&#34;&gt;server:http&lt;/a&gt; project; as the Ubuntu projects in OBS don&amp;rsquo;t include universe and multiverse packages, there are still some dependencies missing. But you could always just copy the source packages from ubuntu to the project and build them again (see &lt;a href=&#34;https://build.opensuse.org/package/show?package=lighttpd&amp;amp;project=home%3Astbuehler&#34;&gt;home:stbuehler/lighttpd&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;PS: You might ask now why I&amp;rsquo;m not using launchpad. As a matter of fact I did (my ppas are still available, but not updated anymore). launchpad sucks, as I had to upload different packages for the different releases; the changelog has to specifiy the target release. So I wrote a shell script that would build different source packages with the needed changelog entries and so on&amp;hellip; this just sucks. And of course it only builds ubuntu packages - with OBS I have &amp;ldquo;all&amp;rdquo; packages in one place (&amp;ldquo;all&amp;rdquo; as in &amp;ldquo;all I care about&amp;rdquo;).&lt;/p&gt; &lt;p&gt;References:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://build.opensuse.org/&#34;&gt;https://build.opensuse.org/&lt;/a&gt; (OBS)&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://lists.opensuse.org/opensuse-buildservice/2011-07/msg00037.html&#34;&gt;https://lists.opensuse.org/opensuse-buildservice/2011-07/msg00037.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://build.opensuse.org/project/monitor?project=server%3Ahttp&#34;&gt;server:http&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://build.opensuse.org/package/show?package=lighttpd&amp;amp;project=home%3Astbuehler&#34;&gt;home:stbuehler/lighttpd&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description> <link>https://stbuehler.de/blog/article/2011/07/20/opensuse_build_service.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/07/20/opensuse_build_service.html</guid> </item> <item> <title>Greatest common divisor and Fibonacci numbers</title> <description>&lt;!-- more --&gt; &lt;p&gt;Many people know a very basic fact about &lt;a href=&#34;https://en.wikipedia.org/wiki/Fibonacci_number&#34;&gt;Fibonacci numbers&lt;/a&gt;:&lt;/p&gt; &lt;div class=&#34;arithmatex&#34;&gt;\[ gcd(F_n, F_{n+1}) = 1 \]&lt;/div&gt; &lt;p&gt;In other words: &lt;span class=&#34;arithmatex&#34;&gt;\(F_n\)&lt;/span&gt; and &lt;span class=&#34;arithmatex&#34;&gt;\(F_{n+1}\)&lt;/span&gt; are &lt;a href=&#34;https://en.wikipedia.org/wiki/Coprime&#34;&gt;coprime&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There is a more generic form:&lt;/p&gt; &lt;div class=&#34;arithmatex&#34;&gt;\[ gcd(F_n, F_m) = F_{gcd(n, m)} \]&lt;/div&gt; &lt;p&gt;The first proposition follows from this, as &lt;span class=&#34;arithmatex&#34;&gt;\(gcd(n, n+1) = 1\)&lt;/span&gt;.&lt;/p&gt; &lt;p&gt;Some time ago &lt;a href=&#34;https://pseudotron.ist-dein-freund.de/&#34;&gt;Johannes&lt;/a&gt; and I discovered another fact if n is coprime to 2 and 3:&lt;/p&gt; &lt;div class=&#34;arithmatex&#34;&gt;\[ n \bmod{6} \in \{ 1, 5 \} \Rightarrow gcd(F_n, F_{n-1} + 1) = gcd(F_n, F_{n-1} - 1) = 1 \]&lt;/div&gt; &lt;p&gt;Proofing it wasn&amp;rsquo;t very difficult; just use the identity &lt;span class=&#34;arithmatex&#34;&gt;\(gcd(a, b) = gcd(a, b - a)\)&lt;/span&gt; to show the following:&lt;/p&gt; &lt;div class=&#34;arithmatex&#34;&gt;\[ gcd(F_n, F_{n-1} + 1) = gcd(F_{n-2k} - F_{2k}, F_{n-(2k+1)} + F_{2k+1}) \]&lt;/div&gt; &lt;div class=&#34;arithmatex&#34;&gt;\[ gcd(F_n, F_{n-1} - 1) = gcd(F_{n-2k} + F_{2k}, F_{n-(2k+1)} - F_{2k+1}) \]&lt;/div&gt; &lt;p&gt;Depending on the value of &lt;span class=&#34;arithmatex&#34;&gt;\(n \bmod{4}\)&lt;/span&gt; (only 2 possibilites: 1 and 3) you can choose a value for k which helps to easily simplify at least one sum or difference with the basic identity of the Fibonacci numbers &lt;span class=&#34;arithmatex&#34;&gt;\(F_{n+2} = F_{n+1} + F_n\)&lt;/span&gt;.&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2011/07/21/greatest_common_divisor_and_fibonacci_numbers.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/07/21/greatest_common_divisor_and_fibonacci_numbers.html</guid> </item> <item> <title>Comparing the first element of an enum and a pointer</title> <description>&lt;!-- more --&gt; &lt;p&gt;I just had a very stupid bug in a lighttpd2 feature I was working on, it looked like this:&lt;/p&gt; &lt;p&gt;```c linenums=1 typedef enum { S_DEAD, S_START /&lt;em&gt; &amp;hellip; &lt;/em&gt;/ } con_state;&lt;/p&gt; &lt;p&gt;typedef struct { con_state state; /&lt;em&gt; &amp;hellip; &lt;/em&gt;/ } con;&lt;/p&gt; &lt;p&gt;void foo(con &lt;em&gt;c) { if (S_DEAD == c) { /&lt;/em&gt; &amp;hellip; */ } } &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;I obviously wanted to check `c-&amp;gt;state`, not `c` - and I didn&amp;#39;t even get &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;a warning from my compiler (neither gcc nor clang). Comparing with &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;`S_START` resulted in this compiler warning: &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;```console &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;[...] warning: comparison between pointer and integer [enabled by default] &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt; &lt;p&gt;My guess is that it doesn&amp;rsquo;t warn when you compare pointers with &lt;code&gt;0&lt;/code&gt;, and &lt;code&gt;S_DEAD&lt;/code&gt; as the first value in the enum corresponds to the number &lt;code&gt;0&lt;/code&gt;. Comparing with &lt;code&gt;S_START&lt;/code&gt; is similar to comparing with &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;It should still print a warning of course - an enum member is obviously not a pointer.&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2011/08/12/comparing_the_first_element_of_an_enum_and_a_pointer.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/08/12/comparing_the_first_element_of_an_enum_and_a_pointer.html</guid> </item> <item> <title>Hidden Finalizers in Ada</title> <description>&lt;!-- more --&gt; &lt;blockquote&gt; &lt;p&gt;It&amp;rsquo;s not a bug, it&amp;rsquo;s a feature!&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Often you want to execute specific code when a object is destroyed - for example free all pointers in it. In Ada you need the &lt;a href=&#34;https://www.adaic.org/resources/add_content/standards/05rm/html/RM-7-6.html&#34;&gt;Ada.Finalization&lt;/a&gt; package for this, which provides you with the &lt;code&gt;Controlled&lt;/code&gt; and the &lt;code&gt;Limited_Controlled&lt;/code&gt; tagged types; they allow custom action for &lt;code&gt;Initialize&lt;/code&gt;, &lt;code&gt;Adjust&lt;/code&gt; (not for limited) and &lt;code&gt;Finalize&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Example:&lt;/p&gt; &lt;p&gt;```ada linenums=1 title=&amp;rdquo;example.adb&amp;rdquo; with Ada.Finalization; with Ada.Unchecked_Deallocation;&lt;/p&gt; &lt;p&gt;procedure Example is package X is type Container is limited private; &amp;ndash; limited, so you don&amp;rsquo;t accidentally copy a container&lt;/p&gt; &lt;p&gt;private type Tree; type Tree_Access is access Tree; type Tree is null record; &amp;ndash; this obviously needs more details :)&lt;/p&gt; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; type Container is new Ada.Finalization.Limited_Controlled with record Root : Tree_Access; end record; overriding procedure Initialize (C : in out Container); overriding procedure Finalize (C : in out Container); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;end X;&lt;/p&gt; &lt;p&gt;package body X is procedure Initialize (C : in out Container) is begin C.Root := null; end Initialize;&lt;/p&gt; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; procedure Finalize (C : in out Container) is procedure Free is new Ada.Unchecked_Deallocation (Tree, Tree_Access); begin Free (C.Root); end Finalize; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;end X; begin null; end Example; &lt;code&gt;This solution has a drawback: `Container` becomes a [tagged type](https://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-9.html) (you could say tagged types are the object-orientation in Ada), but you only see the negative effects on the outside: you can&#39;t use methods that dispatch in one more than one tagged type like this:&lt;/code&gt;ada linenums=1 title=&amp;rdquo;example.adb&amp;rdquo; procedure Example is package X is type A is tagged null record; type B is tagged null record; procedure Foo (x : in out A; y : in out B); end X; package body X is procedure Foo (x : in out A; y : in out B) is begin null; end; end X; begin null; end Example; ```&lt;/p&gt; &lt;p&gt;results in:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;gnatmake&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;example.adb &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;gcc-4.4 -c example.adb&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;example.adb:6:17: operation can be dispatching in only one type&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;gnatmake: &amp;quot;example.adb&amp;quot; compilation error&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Now you could for example replace the parameter &amp;ldquo;B&amp;rdquo; with &amp;ldquo;B&amp;rsquo;Class&amp;rdquo; in Foo; it then would only dispatch in x, not in y. But as the taggedness is private in the &lt;code&gt;Container&lt;/code&gt; example above (and there is no reason to make it public), you cannot use &lt;code&gt;Container&#39;Class&lt;/code&gt; outside the private part of the package.&lt;/p&gt; &lt;p&gt;The solution is mix-in I found in a forum:&lt;/p&gt; &lt;p&gt;```ada linenums=1 title=&amp;rdquo;example.adb&amp;rdquo; with Ada.Finalization; with Ada.Unchecked_Deallocation;&lt;/p&gt; &lt;p&gt;procedure Example is package X is type Container is limited private;&lt;/p&gt; &lt;p&gt;private type Tree; type Tree_Access is access Tree; type Tree is null record; &amp;ndash; this obviously needs more details :)&lt;/p&gt; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; type Container_Control (Enclosing : access Container) is new Ada.Finalization.Limited_Controlled with null record; type Container is limited record Root : Tree_Access; Control : Container_Control (Container&amp;#39;Access); end record; overriding procedure Initialize (C : in out Container_Control); overriding procedure Finalize (C : in out Container_Control); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;end X;&lt;/p&gt; &lt;p&gt;package body X is procedure Initialize (C : in out Container_Control) is begin C.Enclosing.all.Root := null; end Initialize;&lt;/p&gt; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; procedure Finalize (C : in out Container_Control) is procedure Free is new Ada.Unchecked_Deallocation (Tree, Tree_Access); begin Free (C.Enclosing.all.Root); end Finalize; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;end X; begin null; end Example; ```&lt;/p&gt; &lt;p&gt;The access discriminant &lt;code&gt;Enclosing&lt;/code&gt; and &lt;code&gt;Container&#39;Access&lt;/code&gt; is a hack with a special syntax; I couldn&amp;rsquo;t find it in the Ada reference manual, but &lt;a href=&#34;https://en.wikibooks.org/wiki/Ada_Programming/Object_Orientation#Multiple_Inheritance_via_Mix-in&#34;&gt;wikibooks&lt;/a&gt; knows it too and explains why this only works for limited types too (and more).&lt;/p&gt; &lt;h3 id=&#34;references&#34;&gt;References&lt;a class=&#34;headerlink&#34; href=&#34;#references&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;http://www.adaic.org/resources/add_content/standards/05rm/html/RM-7-6.html&#34;&gt;Ada 2005 RM 7.6 User-Defined Assignment and Finalization&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-9.html&#34;&gt;Ada 2005 RM 3.9 Tagged Types and Type Extensions&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;http://www.adaic.org/resources/add_content/standards/05rm/html/RM-3-9-2.html&#34;&gt;Ada 2005 RM 3.9.2 Dispatching Operations of Tagged Types&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;http://objectmix.com/ada/152259-limited_controlled-orthogonality-related-issues.html&#34;&gt;Forum thread for the mix-in&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;http://en.wikibooks.org/wiki/Ada_Programming/Object_Orientation#Multiple_Inheritance_via_Mix-in&#34;&gt;Wikibooks: Multiple Inheritance via Mix-in&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description> <link>https://stbuehler.de/blog/article/2011/09/11/hidden_finalizers_in_ada.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2011/09/11/hidden_finalizers_in_ada.html</guid> </item> <item> <title>Cross compile Windows Applications</title> <description>&lt;p&gt;There is a nice repository on build.opensuse.org which provides some useful packages to cross compile from linux, and I&amp;rsquo;m going to describe a simple setup using cmake and Qt:&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;First install openSUSE 12.1 into a virtual machine (unless you want to do it on a real machine).&lt;/p&gt; &lt;p&gt;Then add the extra repositories and install the needed packages (as root):&lt;/p&gt; &lt;div class=&#34;language-console copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;zypper ar https://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_12.1/windows:mingw:win32.repo&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;zypper install mingw32-cross-gcc mingw32-cross-gcc-c++ mingw32-libjpeg-devel mingw32-libpng-devel mingw32-libqt4 mingw32-libqt4-devel mingw32-libtiff-devel mingw32-zlib-devel&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;zypper ar https://download.opensuse.org/repositories/devel:/tools:/building/openSUSE_12.1/devel:tools:building.repo&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;zypper install cmake-2.8.7 binutils git&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;ul&gt; &lt;li&gt;The second repository is needed for an updated cmake-2.8.7 which includes https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6ddb1e5b9a3eff941ad12d29609839871fe518ed&lt;/li&gt; &lt;li&gt;binutils includes &amp;ldquo;strings&amp;rdquo; which is needed in one of the scripts below.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Then login with your normal user, and prepare the cmake toolchain file:&lt;/p&gt; &lt;div class=&#34;language-cmake copy highlight&#34;&gt;&lt;table class=&#34;highlighttable&#34;&gt;&lt;tr&gt;&lt;th colspan=&#34;2&#34; class=&#34;filename&#34;&gt;&lt;span class=&#34;filename&#34;&gt;~/toolchain-windows.cmake&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-1&#34;&gt; 1&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-2&#34;&gt; 2&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-3&#34;&gt; 3&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-4&#34;&gt; 4&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-5&#34;&gt; 5&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-6&#34;&gt; 6&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-7&#34;&gt; 7&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-8&#34;&gt; 8&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-9&#34;&gt; 9&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-10&#34;&gt;10&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-11&#34;&gt;11&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-12&#34;&gt;12&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-13&#34;&gt;13&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-14&#34;&gt;14&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-15&#34;&gt;15&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-1-16&#34;&gt;16&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_SYSTEM_NAME&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Windows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_C_COMPILER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;i686-w64-mingw32-gcc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_CXX_COMPILER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;i686-w64-mingw32-g++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_RC_COMPILER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;i686-w64-mingw32-windres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-7&#34;&gt;&lt;a id=&#34;__codelineno-1-7&#34; name=&#34;__codelineno-1-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_FIND_ROOT_PATH&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/usr/i686-w64-mingw32/sys-root/mingw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-8&#34;&gt;&lt;a id=&#34;__codelineno-1-8&#34; name=&#34;__codelineno-1-8&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-9&#34;&gt;&lt;a id=&#34;__codelineno-1-9&#34; name=&#34;__codelineno-1-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_PROGRAM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;NEVER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-10&#34;&gt;&lt;a id=&#34;__codelineno-1-10&#34; name=&#34;__codelineno-1-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_LIBRARY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;ONLY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-11&#34;&gt;&lt;a id=&#34;__codelineno-1-11&#34; name=&#34;__codelineno-1-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CMAKE_FIND_ROOT_PATH_MODE_INCLUDE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;ONLY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-12&#34;&gt;&lt;a id=&#34;__codelineno-1-12&#34; name=&#34;__codelineno-1-12&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-13&#34;&gt;&lt;a id=&#34;__codelineno-1-13&#34; name=&#34;__codelineno-1-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;QT_QMAKE_EXECUTABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/usr/i686-w64-mingw32/bin/qmake&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CACHE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;INTERNAL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;FORCE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-14&#34;&gt;&lt;a id=&#34;__codelineno-1-14&#34; name=&#34;__codelineno-1-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;QT_MOC_EXECUTABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/usr/i686-w64-mingw32/bin/moc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CACHE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;INTERNAL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;FORCE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-15&#34;&gt;&lt;a id=&#34;__codelineno-1-15&#34; name=&#34;__codelineno-1-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;QT_RCC_EXECUTABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/usr/i686-w64-mingw32/bin/rcc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CACHE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;INTERNAL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;FORCE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-16&#34;&gt;&lt;a id=&#34;__codelineno-1-16&#34; name=&#34;__codelineno-1-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;QT_UIC_EXECUTABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/usr/i686-w64-mingw32/bin/uic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CACHE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;INTERNAL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;FORCE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;Now checkout your favorite project which uses cmake+qt and build it with cmake in a subdirectory:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;git clone -b stefan-wip https://git.stbuehler.de/stbuehler/qcross.git&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;cd qcross&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;mkdir winbuild&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;cd winbuild&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;cmake -DCMAKE_TOOLCHAIN_FILE=~/toolchain-windows.cmake ..&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;make&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;````&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34; href=&#34;#__codelineno-2-8&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34; href=&#34;#__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;The resulting binaries will need some DLLs; with the two scripts below&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-10&#34;&gt;&lt;a id=&#34;__codelineno-2-10&#34; name=&#34;__codelineno-2-10&#34; href=&#34;#__codelineno-2-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp gp-VirtualEnv&#34;&gt;(`chmod +x`)&lt;/span&gt; &lt;span class=&#34;go&#34;&gt;they should be easy to install into a directory:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-11&#34;&gt;&lt;a id=&#34;__codelineno-2-11&#34; name=&#34;__codelineno-2-11&#34; href=&#34;#__codelineno-2-11&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-12&#34;&gt;&lt;a id=&#34;__codelineno-2-12&#34; name=&#34;__codelineno-2-12&#34; href=&#34;#__codelineno-2-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;```console&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-13&#34;&gt;&lt;a id=&#34;__codelineno-2-13&#34; name=&#34;__codelineno-2-13&#34; href=&#34;#__codelineno-2-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;installapp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/qcross/winbuild&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/app/qcross &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Now all the needed files should be in &lt;code&gt;~/app/qcross&lt;/code&gt;.&lt;/p&gt; &lt;div class=&#34;language-bash copy highlight&#34;&gt;&lt;table class=&#34;highlighttable&#34;&gt;&lt;tr&gt;&lt;th colspan=&#34;2&#34; class=&#34;filename&#34;&gt;&lt;span class=&#34;filename&#34;&gt;bin/installexe&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-1&#34;&gt; 1&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-2&#34;&gt; 2&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-3&#34;&gt; 3&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-4&#34;&gt; 4&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-5&#34;&gt; 5&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-6&#34;&gt; 6&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-7&#34;&gt; 7&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-8&#34;&gt; 8&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-9&#34;&gt; 9&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-10&#34;&gt;10&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-11&#34;&gt;11&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-12&#34;&gt;12&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-13&#34;&gt;13&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-14&#34;&gt;14&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-15&#34;&gt;15&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-16&#34;&gt;16&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-17&#34;&gt;17&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-18&#34;&gt;18&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-19&#34;&gt;19&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-20&#34;&gt;20&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-21&#34;&gt;21&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-22&#34;&gt;22&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-23&#34;&gt;23&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-24&#34;&gt;24&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-25&#34;&gt;25&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-26&#34;&gt;26&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-27&#34;&gt;27&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-28&#34;&gt;28&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-29&#34;&gt;29&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-30&#34;&gt;30&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-31&#34;&gt;31&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-32&#34;&gt;32&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-33&#34;&gt;33&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-34&#34;&gt;34&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-35&#34;&gt;35&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-36&#34;&gt;36&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-37&#34;&gt;37&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-38&#34;&gt;38&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-39&#34;&gt;39&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-40&#34;&gt;40&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-41&#34;&gt;41&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-3-42&#34;&gt;42&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ch&#34;&gt;#!/bin/bash&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Syntax: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &amp;lt;source&amp;gt; &amp;lt;targetdir&amp;gt; [optionall dll dirs]&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-5&#34;&gt;&lt;a id=&#34;__codelineno-3-5&#34; name=&#34;__codelineno-3-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-6&#34;&gt;&lt;a id=&#34;__codelineno-3-6&#34; name=&#34;__codelineno-3-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-7&#34;&gt;&lt;a id=&#34;__codelineno-3-7&#34; name=&#34;__codelineno-3-7&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-8&#34;&gt;&lt;a id=&#34;__codelineno-3-8&#34; name=&#34;__codelineno-3-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;SOURCE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-9&#34;&gt;&lt;a id=&#34;__codelineno-3-9&#34; name=&#34;__codelineno-3-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-10&#34;&gt;&lt;a id=&#34;__codelineno-3-10&#34; name=&#34;__codelineno-3-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;TARGET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-11&#34;&gt;&lt;a id=&#34;__codelineno-3-11&#34; name=&#34;__codelineno-3-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-12&#34;&gt;&lt;a id=&#34;__codelineno-3-12&#34; name=&#34;__codelineno-3-12&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-13&#34;&gt;&lt;a id=&#34;__codelineno-3-13&#34; name=&#34;__codelineno-3-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;DLLSOURCE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/i686-w64-mingw32/sys-root/mingw/ &lt;/span&gt;&lt;span id=&#34;_code_line-3-14&#34;&gt;&lt;a id=&#34;__codelineno-3-14&#34; name=&#34;__codelineno-3-14&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-15&#34;&gt;&lt;a id=&#34;__codelineno-3-15&#34; name=&#34;__codelineno-3-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SOURCE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-16&#34;&gt;&lt;a id=&#34;__codelineno-3-16&#34; name=&#34;__codelineno-3-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;source &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SOURCE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39; doesn&amp;#39;t exist&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-17&#34;&gt;&lt;a id=&#34;__codelineno-3-17&#34; name=&#34;__codelineno-3-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-18&#34;&gt;&lt;a id=&#34;__codelineno-3-18&#34; name=&#34;__codelineno-3-18&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-19&#34;&gt;&lt;a id=&#34;__codelineno-3-19&#34; name=&#34;__codelineno-3-19&#34;&gt;&lt;/a&gt;mkdir&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-p&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-20&#34;&gt;&lt;a id=&#34;__codelineno-3-20&#34; name=&#34;__codelineno-3-20&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-21&#34;&gt;&lt;a id=&#34;__codelineno-3-21&#34; name=&#34;__codelineno-3-21&#34;&gt;&lt;/a&gt;walk&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-22&#34;&gt;&lt;a id=&#34;__codelineno-3-22&#34; name=&#34;__codelineno-3-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;basename&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-23&#34;&gt;&lt;a id=&#34;__codelineno-3-23&#34; name=&#34;__codelineno-3-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$b&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-24&#34;&gt;&lt;a id=&#34;__codelineno-3-24&#34; name=&#34;__codelineno-3-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-ot&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-25&#34;&gt;&lt;a id=&#34;__codelineno-3-25&#34; name=&#34;__codelineno-3-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Skipping &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$b&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39; [current version already present]&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-26&#34;&gt;&lt;a id=&#34;__codelineno-3-26&#34; name=&#34;__codelineno-3-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-27&#34;&gt;&lt;a id=&#34;__codelineno-3-27&#34; name=&#34;__codelineno-3-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Installing &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$b&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-28&#34;&gt;&lt;a id=&#34;__codelineno-3-28&#34; name=&#34;__codelineno-3-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-29&#34;&gt;&lt;a id=&#34;__codelineno-3-29&#34; name=&#34;__codelineno-3-29&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-30&#34;&gt;&lt;a id=&#34;__codelineno-3-30&#34; name=&#34;__codelineno-3-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# Hack to find dependencies&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-31&#34;&gt;&lt;a id=&#34;__codelineno-3-31&#34; name=&#34;__codelineno-3-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;strings&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;\.dll&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dll &lt;/span&gt;&lt;span id=&#34;_code_line-3-32&#34;&gt;&lt;a id=&#34;__codelineno-3-32&#34; name=&#34;__codelineno-3-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-33&#34;&gt;&lt;a id=&#34;__codelineno-3-33&#34; name=&#34;__codelineno-3-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DLL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;find&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DLLSOURCE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$dll&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-print&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-quit&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-34&#34;&gt;&lt;a id=&#34;__codelineno-3-34&#34; name=&#34;__codelineno-3-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DLL&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-a&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DLL&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-35&#34;&gt;&lt;a id=&#34;__codelineno-3-35&#34; name=&#34;__codelineno-3-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;walk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DLL&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-36&#34;&gt;&lt;a id=&#34;__codelineno-3-36&#34; name=&#34;__codelineno-3-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-37&#34;&gt;&lt;a id=&#34;__codelineno-3-37&#34; name=&#34;__codelineno-3-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-38&#34;&gt;&lt;a id=&#34;__codelineno-3-38&#34; name=&#34;__codelineno-3-38&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-39&#34;&gt;&lt;a id=&#34;__codelineno-3-39&#34; name=&#34;__codelineno-3-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-40&#34;&gt;&lt;a id=&#34;__codelineno-3-40&#34; name=&#34;__codelineno-3-40&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-41&#34;&gt;&lt;a id=&#34;__codelineno-3-41&#34; name=&#34;__codelineno-3-41&#34;&gt;&lt;/a&gt;walk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SOURCE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-42&#34;&gt;&lt;a id=&#34;__codelineno-3-42&#34; name=&#34;__codelineno-3-42&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; &lt;div class=&#34;language-bash copy highlight&#34;&gt;&lt;table class=&#34;highlighttable&#34;&gt;&lt;tr&gt;&lt;th colspan=&#34;2&#34; class=&#34;filename&#34;&gt;&lt;span class=&#34;filename&#34;&gt;bin/installapp&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-1&#34;&gt; 1&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-2&#34;&gt; 2&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-3&#34;&gt; 3&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-4&#34;&gt; 4&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-5&#34;&gt; 5&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-6&#34;&gt; 6&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-7&#34;&gt; 7&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-8&#34;&gt; 8&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-9&#34;&gt; 9&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-10&#34;&gt;10&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-11&#34;&gt;11&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-12&#34;&gt;12&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-13&#34;&gt;13&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-14&#34;&gt;14&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-15&#34;&gt;15&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-4-16&#34;&gt;16&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ch&#34;&gt;#!/bin/bash&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Syntax: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &amp;lt;sourcedir&amp;gt; &amp;lt;targetdir&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-5&#34;&gt;&lt;a id=&#34;__codelineno-4-5&#34; name=&#34;__codelineno-4-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-6&#34;&gt;&lt;a id=&#34;__codelineno-4-6&#34; name=&#34;__codelineno-4-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-7&#34;&gt;&lt;a id=&#34;__codelineno-4-7&#34; name=&#34;__codelineno-4-7&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-8&#34;&gt;&lt;a id=&#34;__codelineno-4-8&#34; name=&#34;__codelineno-4-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;SOURCE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-9&#34;&gt;&lt;a id=&#34;__codelineno-4-9&#34; name=&#34;__codelineno-4-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-10&#34;&gt;&lt;a id=&#34;__codelineno-4-10&#34; name=&#34;__codelineno-4-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;TARGET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-11&#34;&gt;&lt;a id=&#34;__codelineno-4-11&#34; name=&#34;__codelineno-4-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-12&#34;&gt;&lt;a id=&#34;__codelineno-4-12&#34; name=&#34;__codelineno-4-12&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-13&#34;&gt;&lt;a id=&#34;__codelineno-4-13&#34; name=&#34;__codelineno-4-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;exe&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;find&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SOURCE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-name&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;*.exe&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CMakeFiles&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-14&#34;&gt;&lt;a id=&#34;__codelineno-4-14&#34; name=&#34;__codelineno-4-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Installing executable &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$exe&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; -&amp;gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-15&#34;&gt;&lt;a id=&#34;__codelineno-4-15&#34; name=&#34;__codelineno-4-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;installexe&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$exe&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-16&#34;&gt;&lt;a id=&#34;__codelineno-4-16&#34; name=&#34;__codelineno-4-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description> <link>https://stbuehler.de/blog/article/2012/04/09/cross_compile_windows_applications.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2012/04/09/cross_compile_windows_applications.html</guid> </item> <item> <title>Checking SSL Certificates</title> <description>&lt;!-- more --&gt; &lt;h2 id=&#34;verify-whether-a-certificate-matches-a-private-key-and-has-valid-timestamp&#34;&gt;Verify whether a certificate matches a private key and has valid timestamp&lt;a class=&#34;headerlink&#34; href=&#34;#verify-whether-a-certificate-matches-a-private-key-and-has-valid-timestamp&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The certificate is the signed public key (and some meta data); to verify whether a certificate matches the private key, one has to extract the public key of both and compare them.&lt;/p&gt; &lt;p&gt;Both the rsa and the x509 subcommand of openssl have a -modulus option to extract the modulus; they can also extract the complete public key, but the option has a different name for each of the subcommands:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;openssl x509 -in &amp;quot;$CRT&amp;quot; -noout -pubkey&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;openssl rsa -in &amp;quot;$KEY&amp;quot; -pubout 2&amp;gt;/dev/null&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The timestamps are in the text output of the certificate in the fields &amp;ldquo;Not Before:&amp;rdquo; and &amp;ldquo;Not After :&amp;rdquo;:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;openssl x509 -in &amp;quot;$CRT&amp;quot; -text -noout | \&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;awk -- &amp;#39;BEGIN {FS=&amp;quot;: &amp;quot;;b=&amp;quot;&amp;quot;;e=&amp;quot;&amp;quot;} /^ *Not Before *: / { b = $2 } /^ *Not After *: / { e = $2 } END { print b; print e }&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;You can convert those timestamps to &amp;ldquo;seconds since 1970-01-01 00:00:00 UTC&amp;rdquo; width date +%s, making it easy to compare them to the current date (in the same format).&lt;/p&gt; &lt;p&gt;All in one script (you have to set KEY and CRT before; you probably may want to check whether the files exist too):&lt;/p&gt; &lt;div class=&#34;language-bash copy highlight&#34;&gt;&lt;table class=&#34;highlighttable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-1&#34;&gt; 1&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-2&#34;&gt; 2&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-3&#34;&gt; 3&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-4&#34;&gt; 4&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-5&#34;&gt; 5&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-6&#34;&gt; 6&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-7&#34;&gt; 7&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-8&#34;&gt; 8&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-9&#34;&gt; 9&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-10&#34;&gt;10&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-11&#34;&gt;11&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-12&#34;&gt;12&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-13&#34;&gt;13&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-14&#34;&gt;14&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-15&#34;&gt;15&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-16&#34;&gt;16&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-17&#34;&gt;17&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-18&#34;&gt;18&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-19&#34;&gt;19&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-20&#34;&gt;20&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-2-21&#34;&gt;21&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;openssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;x509&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-in&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CRT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-noout&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-pubkey&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;openssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rsa&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-in&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$KEY&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-pubout&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&amp;gt;/dev/null&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$A&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$B&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;cert doesn&amp;#39;t match private key&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CRT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; pubkey:\n%s\n&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$KEY&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; pubkey:\n%s\n&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$A&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$B&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DATES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;openssl&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;x509&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-in&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CRT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-text&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-noout&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;BEGIN {FS=&amp;quot;: &amp;quot;;b=&amp;quot;&amp;quot;;e=&amp;quot;&amp;quot;} /^ *Not Before *: / { b = $2 } /^ *Not After *: / { e = $2 } END { print b; print e }&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DATES&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;head&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-n1&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-10&#34;&gt;&lt;a id=&#34;__codelineno-2-10&#34; name=&#34;__codelineno-2-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DATES&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;tail&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-n1&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-11&#34;&gt;&lt;a id=&#34;__codelineno-2-11&#34; name=&#34;__codelineno-2-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;ubegin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;date&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$begin&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;+%s&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-12&#34;&gt;&lt;a id=&#34;__codelineno-2-12&#34; name=&#34;__codelineno-2-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;uend&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;date&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$end&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;+%s&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-13&#34;&gt;&lt;a id=&#34;__codelineno-2-13&#34; name=&#34;__codelineno-2-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;unow&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;date&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;+%s&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-14&#34;&gt;&lt;a id=&#34;__codelineno-2-14&#34; name=&#34;__codelineno-2-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$unow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ubegin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-o&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$uend&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-lt&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$unow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-15&#34;&gt;&lt;a id=&#34;__codelineno-2-15&#34; name=&#34;__codelineno-2-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Invalid timestamps for &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CRT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;, was valid for:&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-16&#34;&gt;&lt;a id=&#34;__codelineno-2-16&#34; name=&#34;__codelineno-2-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DATES&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-17&#34;&gt;&lt;a id=&#34;__codelineno-2-17&#34; name=&#34;__codelineno-2-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-18&#34;&gt;&lt;a id=&#34;__codelineno-2-18&#34; name=&#34;__codelineno-2-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Valid timestamps for &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CRT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; (which matches privkey):&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-19&#34;&gt;&lt;a id=&#34;__codelineno-2-19&#34; name=&#34;__codelineno-2-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DATES&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-20&#34;&gt;&lt;a id=&#34;__codelineno-2-20&#34; name=&#34;__codelineno-2-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-21&#34;&gt;&lt;a id=&#34;__codelineno-2-21&#34; name=&#34;__codelineno-2-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description> <link>https://stbuehler.de/blog/article/2012/05/08/checking_ssl_certificates.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2012/05/08/checking_ssl_certificates.html</guid> </item> <item> <title>Fix ssh command quoting</title> <description>&lt;p&gt;SSH only takes a simple string as command to send to the remote end &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. In other words, ssh has to concatenate all arguments with a space as separator.&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;Example:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Hello World&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;In this case, my local ssh program gets the command &lt;code&gt;[&#39;echo&#39;, &#39;Hello&#39;, &#39;World&#39;]&lt;/code&gt; from the system, build the command string &lt;code&gt;&#39;echo Hello World&#39;&lt;/code&gt; from, sends it to my server, and the ssh process there will give this command string to the shell, which will expand it into the 3 separate parts again.&lt;/p&gt; &lt;p&gt;You can see the command string if you give ssh the &lt;code&gt;-v&lt;/code&gt; option and have a look for the line with &lt;code&gt;debug1: Sending command:&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;If I run the &amp;ldquo;same&amp;rdquo; command on my local system, I get the same output:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Hello World&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Now lets try something else:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;echo Hello World&amp;#39;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Hello World&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;echo Hello World&amp;#39;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;bash: echo Hello World: command not found&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;What did happen now?&lt;br /&gt; With ssh, my local ssh program got &lt;code&gt;[&#39;echo Hello World&#39;]&lt;/code&gt; - but the command it sent was the same, so the server printed the same line as before.&lt;/p&gt; &lt;p&gt;But my local shell still sees the quotes around, and won&amp;rsquo;t split it - that is what quotes are for.&lt;/p&gt; &lt;p&gt;This behaviour allows tricks like this one:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;echo *&amp;#39;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;[list of the (visible) files in the home directory on the server]&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;On my local system &lt;code&gt;&#39;*&#39;&lt;/code&gt; won&amp;rsquo;t get expanded as it is quoted, but the remote end doesn&amp;rsquo;t have the quotes anymore, and the shell will expand it.&lt;/p&gt; &lt;p&gt;So what is the problem?&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%-10s %s\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World &lt;/span&gt;&lt;span id=&#34;_code_line-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Hello World&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;&lt;code&gt;printf&lt;/code&gt; is a nice tool to output stuff in a formatted way. Now lets try that with ssh:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%-10s %s\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;X &lt;/span&gt;&lt;span id=&#34;_code_line-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;%&lt;/span&gt;sn&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;X &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;I added the &lt;code&gt;echo X&lt;/code&gt; so you can see that my server didn&amp;rsquo;t even print a newline.&lt;/p&gt; &lt;p&gt;This is not what I wanted to see though - how did this happen?&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%-10s %s\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World &lt;/span&gt;&lt;span id=&#34;_code_line-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;[...]&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;debug1: Sending command: printf %-10s %s\\n Hello World&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-7-4&#34;&gt;&lt;a id=&#34;__codelineno-7-4&#34; name=&#34;__codelineno-7-4&#34; href=&#34;#__codelineno-7-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;[...]&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-7-5&#34;&gt;&lt;a id=&#34;__codelineno-7-5&#34; name=&#34;__codelineno-7-5&#34; href=&#34;#__codelineno-7-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;%-10s&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;%s&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt;n&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;X &lt;/span&gt;&lt;span id=&#34;_code_line-7-6&#34;&gt;&lt;a id=&#34;__codelineno-7-6&#34; name=&#34;__codelineno-7-6&#34; href=&#34;#__codelineno-7-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;%&lt;/span&gt;s&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;X &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;As it looses the quotes around my arguments (which contained spaces), it breaks the first argument up, which leads to a completely different result.&lt;/p&gt; &lt;p&gt;I think this is a bug - you would expect that a command with ssh works the same way as it does local. For this the command should have been designed as a list of strings in the SSH Protocol. Nobody will fix this now ofcourse, so we will have to work around that.&lt;/p&gt; &lt;p&gt;Someone else had the same problem over at &lt;a href=&#34;https://stackoverflow.com/questions/6592376/prevent-ssh-from-breaking-up-shell-script-parameters&#34;&gt;https://stackoverflow.com/questions/6592376/prevent-ssh-from-breaking-up-shell-script-parameters&lt;/a&gt;, and the answers show how to workaround it. But I wanted a new &amp;ldquo;ssh&amp;rdquo; program, that would fix this for me. I named it sshsystem, and it works:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;sshsystem&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%-10s %s\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Hello&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;World &lt;/span&gt;&lt;span id=&#34;_code_line-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Hello World&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Yes!&lt;/p&gt; &lt;p&gt;Other fun you can have:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Foo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Bar &lt;/span&gt;&lt;span id=&#34;_code_line-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Foo&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Bar&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-9-4&#34;&gt;&lt;a id=&#34;__codelineno-9-4&#34; name=&#34;__codelineno-9-4&#34; href=&#34;#__codelineno-9-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Foo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;$&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Bar &lt;/span&gt;&lt;span id=&#34;_code_line-9-5&#34;&gt;&lt;a id=&#34;__codelineno-9-5&#34; name=&#34;__codelineno-9-5&#34; href=&#34;#__codelineno-9-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Foo&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-9-6&#34;&gt;&lt;a id=&#34;__codelineno-9-6&#34; name=&#34;__codelineno-9-6&#34; href=&#34;#__codelineno-9-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Bar&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-9-7&#34;&gt;&lt;a id=&#34;__codelineno-9-7&#34; name=&#34;__codelineno-9-7&#34; href=&#34;#__codelineno-9-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gp&#34;&gt;$ &lt;/span&gt;sshsystem&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;stbuehler.de&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Foo&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;$&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Bar &lt;/span&gt;&lt;span id=&#34;_code_line-9-8&#34;&gt;&lt;a id=&#34;__codelineno-9-8&#34; name=&#34;__codelineno-9-8&#34; href=&#34;#__codelineno-9-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;Foo &lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-9-9&#34;&gt;&lt;a id=&#34;__codelineno-9-9&#34; name=&#34;__codelineno-9-9&#34; href=&#34;#__codelineno-9-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt; echo Bar&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;(The shell on the other side can execute more than one command - either split them with &lt;code&gt;;&lt;/code&gt; or &lt;code&gt;\n&lt;/code&gt; - quoted ofc, otherwise your local shell will interpret them)&lt;/p&gt; &lt;p&gt;Source is available at &lt;a href=&#34;https://gist.github.com/4672115&#34;&gt;https://gist.github.com/4672115&lt;/a&gt;, &lt;a href=&#34;https://stackoverflow.com/questions/6592376/prevent-ssh-from-breaking-up-shell-script-parameters/14601289#14601289&#34;&gt;https://stackoverflow.com/questions/6592376/prevent-ssh-from-breaking-up-shell-script-parameters/14601289#14601289&lt;/a&gt; and below.&lt;/p&gt; &lt;div class=&#34;language-bash copy highlight&#34;&gt;&lt;table class=&#34;highlighttable&#34;&gt;&lt;tr&gt;&lt;th colspan=&#34;2&#34; class=&#34;filename&#34;&gt;&lt;span class=&#34;filename&#34;&gt;sshsystem&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;linenos&#34;&gt;&lt;div class=&#34;linenodiv&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-1&#34;&gt; 1&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-2&#34;&gt; 2&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-3&#34;&gt; 3&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-4&#34;&gt; 4&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-5&#34;&gt; 5&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-6&#34;&gt; 6&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-7&#34;&gt; 7&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-8&#34;&gt; 8&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-9&#34;&gt; 9&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-10&#34;&gt;10&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-11&#34;&gt;11&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-12&#34;&gt;12&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-13&#34;&gt;13&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-14&#34;&gt;14&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-15&#34;&gt;15&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-16&#34;&gt;16&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-17&#34;&gt;17&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-18&#34;&gt;18&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-19&#34;&gt;19&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-20&#34;&gt;20&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-21&#34;&gt;21&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-22&#34;&gt;22&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-23&#34;&gt;23&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-24&#34;&gt;24&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-25&#34;&gt;25&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-26&#34;&gt;26&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-27&#34;&gt;27&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-28&#34;&gt;28&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-29&#34;&gt;29&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-30&#34;&gt;30&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-31&#34;&gt;31&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-32&#34;&gt;32&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-33&#34;&gt;33&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-34&#34;&gt;34&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-35&#34;&gt;35&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-36&#34;&gt;36&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-37&#34;&gt;37&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-38&#34;&gt;38&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-39&#34;&gt;39&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-40&#34;&gt;40&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-41&#34;&gt;41&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-42&#34;&gt;42&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-43&#34;&gt;43&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-44&#34;&gt;44&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-45&#34;&gt;45&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-46&#34;&gt;46&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-47&#34;&gt;47&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-48&#34;&gt;48&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-49&#34;&gt;49&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-50&#34;&gt;50&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-51&#34;&gt;51&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-52&#34;&gt;52&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-53&#34;&gt;53&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-54&#34;&gt;54&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-55&#34;&gt;55&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-56&#34;&gt;56&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-57&#34;&gt;57&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-58&#34;&gt;58&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-59&#34;&gt;59&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-60&#34;&gt;60&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;normal&#34;&gt;&lt;a href=&#34;#__codelineno-10-61&#34;&gt;61&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ch&#34;&gt;#!/bin/bash&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;# quote command in ssh call to prevent remote side from expanding any arguments&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-4&#34;&gt;&lt;a id=&#34;__codelineno-10-4&#34; name=&#34;__codelineno-10-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;# uses bash printf %q for quoting - no idea how compatible this is with other shells.&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-5&#34;&gt;&lt;a id=&#34;__codelineno-10-5&#34; name=&#34;__codelineno-10-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;# http://stackoverflow.com/questions/6592376/prevent-ssh-from-breaking-up-shell-script-parameters&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-6&#34;&gt;&lt;a id=&#34;__codelineno-10-6&#34; name=&#34;__codelineno-10-6&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-7&#34;&gt;&lt;a id=&#34;__codelineno-10-7&#34; name=&#34;__codelineno-10-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=()&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-8&#34;&gt;&lt;a id=&#34;__codelineno-10-8&#34; name=&#34;__codelineno-10-8&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-9&#34;&gt;&lt;a id=&#34;__codelineno-10-9&#34; name=&#34;__codelineno-10-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-10&#34;&gt;&lt;a id=&#34;__codelineno-10-10&#34; name=&#34;__codelineno-10-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-11&#34;&gt;&lt;a id=&#34;__codelineno-10-11&#34; name=&#34;__codelineno-10-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;1246AaCfgKkMNnqsTtVvXxYy&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-12&#34;&gt;&lt;a id=&#34;__codelineno-10-12&#34; name=&#34;__codelineno-10-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# simple argument&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-13&#34;&gt;&lt;a id=&#34;__codelineno-10-13&#34; name=&#34;__codelineno-10-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-14&#34;&gt;&lt;a id=&#34;__codelineno-10-14&#34; name=&#34;__codelineno-10-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-15&#34;&gt;&lt;a id=&#34;__codelineno-10-15&#34; name=&#34;__codelineno-10-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-16&#34;&gt;&lt;a id=&#34;__codelineno-10-16&#34; name=&#34;__codelineno-10-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;bcDeFIiJLlmOopRSWw&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-17&#34;&gt;&lt;a id=&#34;__codelineno-10-17&#34; name=&#34;__codelineno-10-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# argument with parameter&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-18&#34;&gt;&lt;a id=&#34;__codelineno-10-18&#34; name=&#34;__codelineno-10-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-19&#34;&gt;&lt;a id=&#34;__codelineno-10-19&#34; name=&#34;__codelineno-10-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-20&#34;&gt;&lt;a id=&#34;__codelineno-10-20&#34; name=&#34;__codelineno-10-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-21&#34;&gt;&lt;a id=&#34;__codelineno-10-21&#34; name=&#34;__codelineno-10-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;missing second part of long argument&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-22&#34;&gt;&lt;a id=&#34;__codelineno-10-22&#34; name=&#34;__codelineno-10-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;99&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-23&#34;&gt;&lt;a id=&#34;__codelineno-10-23&#34; name=&#34;__codelineno-10-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-24&#34;&gt;&lt;a id=&#34;__codelineno-10-24&#34; name=&#34;__codelineno-10-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-25&#34;&gt;&lt;a id=&#34;__codelineno-10-25&#34; name=&#34;__codelineno-10-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-26&#34;&gt;&lt;a id=&#34;__codelineno-10-26&#34; name=&#34;__codelineno-10-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-27&#34;&gt;&lt;a id=&#34;__codelineno-10-27&#34; name=&#34;__codelineno-10-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;bcDeFIiJLlmOopRSWw&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;*&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-28&#34;&gt;&lt;a id=&#34;__codelineno-10-28&#34; name=&#34;__codelineno-10-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# argument with parameter appended without space&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-29&#34;&gt;&lt;a id=&#34;__codelineno-10-29&#34; name=&#34;__codelineno-10-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-30&#34;&gt;&lt;a id=&#34;__codelineno-10-30&#34; name=&#34;__codelineno-10-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-31&#34;&gt;&lt;a id=&#34;__codelineno-10-31&#34; name=&#34;__codelineno-10-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-32&#34;&gt;&lt;a id=&#34;__codelineno-10-32&#34; name=&#34;__codelineno-10-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-33&#34;&gt;&lt;a id=&#34;__codelineno-10-33&#34; name=&#34;__codelineno-10-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# end of arguments&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-34&#34;&gt;&lt;a id=&#34;__codelineno-10-34&#34; name=&#34;__codelineno-10-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-35&#34;&gt;&lt;a id=&#34;__codelineno-10-35&#34; name=&#34;__codelineno-10-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-36&#34;&gt;&lt;a id=&#34;__codelineno-10-36&#34; name=&#34;__codelineno-10-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-37&#34;&gt;&lt;a id=&#34;__codelineno-10-37&#34; name=&#34;__codelineno-10-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-38&#34;&gt;&lt;a id=&#34;__codelineno-10-38&#34; name=&#34;__codelineno-10-38&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-*&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-39&#34;&gt;&lt;a id=&#34;__codelineno-10-39&#34; name=&#34;__codelineno-10-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;unrecognized argument: &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-40&#34;&gt;&lt;a id=&#34;__codelineno-10-40&#34; name=&#34;__codelineno-10-40&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;99&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-41&#34;&gt;&lt;a id=&#34;__codelineno-10-41&#34; name=&#34;__codelineno-10-41&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-42&#34;&gt;&lt;a id=&#34;__codelineno-10-42&#34; name=&#34;__codelineno-10-42&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;*&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-43&#34;&gt;&lt;a id=&#34;__codelineno-10-43&#34; name=&#34;__codelineno-10-43&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# end of arguments&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-44&#34;&gt;&lt;a id=&#34;__codelineno-10-44&#34; name=&#34;__codelineno-10-44&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-45&#34;&gt;&lt;a id=&#34;__codelineno-10-45&#34; name=&#34;__codelineno-10-45&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-46&#34;&gt;&lt;a id=&#34;__codelineno-10-46&#34; name=&#34;__codelineno-10-46&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-47&#34;&gt;&lt;a id=&#34;__codelineno-10-47&#34; name=&#34;__codelineno-10-47&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-48&#34;&gt;&lt;a id=&#34;__codelineno-10-48&#34; name=&#34;__codelineno-10-48&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-49&#34;&gt;&lt;a id=&#34;__codelineno-10-49&#34; name=&#34;__codelineno-10-49&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-50&#34;&gt;&lt;a id=&#34;__codelineno-10-50&#34; name=&#34;__codelineno-10-50&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;# user@host&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-51&#34;&gt;&lt;a id=&#34;__codelineno-10-51&#34; name=&#34;__codelineno-10-51&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-52&#34;&gt;&lt;a id=&#34;__codelineno-10-52&#34; name=&#34;__codelineno-10-52&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;shift&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-53&#34;&gt;&lt;a id=&#34;__codelineno-10-53&#34; name=&#34;__codelineno-10-53&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-54&#34;&gt;&lt;a id=&#34;__codelineno-10-54&#34; name=&#34;__codelineno-10-54&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;# command - quote&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-55&#34;&gt;&lt;a id=&#34;__codelineno-10-55&#34; name=&#34;__codelineno-10-55&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-56&#34;&gt;&lt;a id=&#34;__codelineno-10-56&#34; name=&#34;__codelineno-10-56&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# no need to handle passed command as an array - ssh will merge it anyway.&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-57&#34;&gt;&lt;a id=&#34;__codelineno-10-57&#34; name=&#34;__codelineno-10-57&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# use bash @Q parameter transformation to quote $@:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-58&#34;&gt;&lt;a id=&#34;__codelineno-10-58&#34; name=&#34;__codelineno-10-58&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;@@Q&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-59&#34;&gt;&lt;a id=&#34;__codelineno-10-59&#34; name=&#34;__codelineno-10-59&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-60&#34;&gt;&lt;a id=&#34;__codelineno-10-60&#34; name=&#34;__codelineno-10-60&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-10-61&#34;&gt;&lt;a id=&#34;__codelineno-10-61&#34; name=&#34;__codelineno-10-61&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;ssh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;sshargs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[@]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; &lt;div class=&#34;footnote&#34;&gt; &lt;hr /&gt; &lt;ol&gt; &lt;li id=&#34;fn:1&#34;&gt; &lt;p&gt;&lt;a href=&#34;http://tools.ietf.org/html/rfc4254#section-6.5&#34;&gt;The Secure Shell (SSH) Connection Protocol, Starting a Shell or a Command&lt;/a&gt;&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; title=&#34;Jump back to footnote 1 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/div&gt;</description> <link>https://stbuehler.de/blog/article/2013/01/30/fix_ssh_command_quoting.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2013/01/30/fix_ssh_command_quoting.html</guid> </item> <item> <title>Some notes on SHA-3</title> <description>&lt;!-- more --&gt; &lt;h2 id=&#34;what-is-sha-3&#34;&gt;What is SHA-3?&lt;a class=&#34;headerlink&#34; href=&#34;#what-is-sha-3&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;a href=&#34;https://csrc.nist.gov/groups/ST/hash/index.html&#34; title=&#34;Cryptographic hash and SHA-3 standard development&#34;&gt;SHA-3&lt;/a&gt; is a family of cryptographic hash functions (also see &lt;a href=&#34;https://en.wikipedia.org/wiki/SHA-3&#34; title=&#34;SHA-3&#34;&gt;SHA-3 on Wikipedia&lt;/a&gt;). &lt;a href=&#34;https://www.nist.gov/&#34; title=&#34;National Institute of Standards and Technology&#34;&gt;NIST&lt;/a&gt; selected &lt;a href=&#34;http://keccak.noekeon.org/&#34; title=&#34;The Keccak sponge function family&#34;&gt;Keccak&lt;/a&gt; as implementation for SHA-3 in October 2012, and released a &lt;a href=&#34;https://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf&#34; title=&#34;Draft FIPS 202, SHA-3 Standard: Permutation-Based Hash And Extendable-Output Functions&#34;&gt;draft&lt;/a&gt; specifying the details in April 2014. I think the algorithm details are final.&lt;/p&gt; &lt;h2 id=&#34;how-does-it-work&#34;&gt;How does it work?&lt;a class=&#34;headerlink&#34; href=&#34;#how-does-it-work&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Keccak consists of two components:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Permutation functions &lt;code&gt;Keccak-f&lt;/code&gt; for specific state sizes (1600, 800, 400, 200, 100, 50 and 25 bits); for SHA-3 only &lt;code&gt;Keccak-f[1600]&lt;/code&gt; is actually used.&lt;/li&gt; &lt;li&gt; &lt;p&gt;A &lt;a href=&#34;http://sponge.noekeon.org/&#34; title=&#34;The Sponge Functions Corner&#34;&gt;&amp;ldquo;sponge&amp;rdquo;&lt;/a&gt; construction: a sponge requires a transformation function (like &lt;code&gt;Keccak-f[1600]&lt;/code&gt;) and a capacity parameter.&lt;/p&gt; &lt;p&gt;The sponge maintains a state (as large as the transformation function handles and initialized to zero); the state is divided into a &amp;ldquo;rate&amp;rdquo; and a &amp;ldquo;capacity&amp;rdquo; part; the rate size is &lt;code&gt;state size - capacity&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Each input and output block is of rate size; when a block comes in it is bitwise XORed into the &amp;ldquo;rate&amp;rdquo; part of the state, and then the transformation is run (this is called &amp;ldquo;absorbing&amp;rdquo; a block). To output a block the &amp;ldquo;rate&amp;rdquo; part is simply copied into the output block (&amp;ldquo;squeezing&amp;rdquo;), followed by a transformation run on the state.&lt;/p&gt; &lt;p&gt;As the input data is usually not aligned to the block size, it is always padded by appending a &lt;code&gt;1&lt;/code&gt; bit, then &lt;code&gt;0&lt;/code&gt; bits until the next block is full but for one bit, and a final &lt;code&gt;1&lt;/code&gt; bit again, leading to a minimum padding of two bits (&lt;code&gt;&#34;11&#34;&lt;/code&gt;) and a maximum of &lt;code&gt;(rate + 1)&lt;/code&gt; bits; this padding is named &lt;code&gt;pad10*1&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;To generate output of a certain length one just squeezes blocks until the length is reached and truncates if necessary.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;This results in the basic &lt;code&gt;Keccak&lt;/code&gt; primitive for a capacity of &lt;code&gt;c&lt;/code&gt; bits and a certain output length:&lt;/p&gt; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;Keccak[c](msg, output length) := Sponge[Keccak-f[1600], c](pad10*1(msg), output length) &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The output length could be &amp;ldquo;infinite&amp;rdquo;, resulting in an endless bit stream (for use in a stream cipher or as PRNG).&lt;/p&gt; &lt;h2 id=&#34;security&#34;&gt;Security&lt;a class=&#34;headerlink&#34; href=&#34;#security&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;An algorithm is said to provide &lt;code&gt;n&lt;/code&gt; bits of security (for a specific property) if an attack requires &lt;code&gt;2^n&lt;/code&gt; steps (i.e. requires bruteforcing &lt;code&gt;n&lt;/code&gt; bits).&lt;/p&gt; &lt;p&gt;To provide &lt;code&gt;n&lt;/code&gt; bits of security (&lt;a href=&#34;https://en.wikipedia.org/wiki/Preimage_attack&#34; title=&#34;Preimage (and second Preimage) attack&#34;&gt;preimage, second preimage&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Collision_attack&#34; title=&#34;Collision attack&#34;&gt;collision&lt;/a&gt;) with a sponge construction (assuming the transformation function is secure) the capacity has to be &lt;code&gt;2*n&lt;/code&gt; bits, and the output has to be of length &lt;code&gt;2*n&lt;/code&gt; bits. If the output is only &lt;code&gt;n&lt;/code&gt; bits, preimage and second preimage are still &lt;code&gt;n&lt;/code&gt; bit secure, but collision security drops to &lt;code&gt;n/2&lt;/code&gt; bits (&amp;ldquo;birthday paradox&amp;rdquo;).&lt;/p&gt; &lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;# || denotes concatenation of bit strings &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;SHA3-224(msg) := Keccak[448](msg || 01, 224) &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;SHA3-256(msg) := Keccak[512](msg || 01, 256) &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;SHA3-384(msg) := Keccak[768](msg || 01, 384) &lt;/span&gt;&lt;span id=&#34;_code_line-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt;SHA3-512(msg) := Keccak[1024](msg || 01, 512) &lt;/span&gt;&lt;span id=&#34;_code_line-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;SHAKE128(msg, output length) := Keccak[256](msg || 1111, output length) &lt;/span&gt;&lt;span id=&#34;_code_line-1-7&#34;&gt;&lt;a id=&#34;__codelineno-1-7&#34; name=&#34;__codelineno-1-7&#34; href=&#34;#__codelineno-1-7&#34;&gt;&lt;/a&gt;SHAKE256(msg, output length) := Keccak[512](msg || 1111, output length) &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;All functions use a capacity for a security of &lt;code&gt;n&lt;/code&gt; bits, where &lt;code&gt;n&lt;/code&gt; is the number in the function name. However the output length of the &lt;code&gt;SHA3-n&lt;/code&gt; functions is only &lt;code&gt;n&lt;/code&gt; bits, restricting collision resistance to &lt;code&gt;n/2&lt;/code&gt; bits - there is no way around this, as the &lt;code&gt;SHA3-n&lt;/code&gt; functions are intended to be used as replacements for the &lt;code&gt;SHA-n&lt;/code&gt; functions from the SHA-2 family.&lt;/p&gt; &lt;p&gt;The different suffixes appended to the message before padding are used to distinguish different uses of the same &lt;code&gt;Keccak[c]&lt;/code&gt; function (domain separation): the suffix &lt;code&gt;&#34;01&#34;&lt;/code&gt; represents the domain of &lt;code&gt;SHA3-n&lt;/code&gt; functions which take a simple message. The suffix &lt;code&gt;&#34;11&#34;&lt;/code&gt; represents the SHAKE functions which take a &lt;a href=&#34;http://keccak.noekeon.org/Sakura.pdf&#34; title=&#34;Sakura: a flexible coding for tree hashing&#34;&gt;Sakura&lt;/a&gt; padded message; in Sakura the suffix &lt;code&gt;&#34;11&#34;&lt;/code&gt; represents a single message (Sakura also supports tree hashing).&lt;/p&gt; &lt;h2 id=&#34;possible-nist-manipulations-history&#34;&gt;Possible NIST manipulations / History&lt;a class=&#34;headerlink&#34; href=&#34;#possible-nist-manipulations-history&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The original Keccak submission used the same capacity for the &lt;code&gt;SHA3-n&lt;/code&gt; functions as are now in the draft. For the variable output length function it used a capacity of 576 bits, leading to a rate of 1024 bits. Also the suffixes were not part of the proposal.&lt;/p&gt; &lt;p&gt;In 2013 NIST proposed to use capacity 256 for &lt;code&gt;SHA3-224&lt;/code&gt;, &lt;code&gt;SHA3-256&lt;/code&gt; and &lt;code&gt;SHAKE256&lt;/code&gt;, and capacity 512 for &lt;code&gt;SHA3-384&lt;/code&gt;, &lt;code&gt;SHA-512&lt;/code&gt; and &lt;code&gt;SHAKE512&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;While the parameter selection itself would have been more consistent (the proposed &lt;code&gt;SHA3-512(msg) := Keccak[512](msg, 512)&lt;/code&gt; would have been 256-bit secure against everything), this would have reduced preimage and second preimage resistance below what the corresponding functions in the SHA-2 family provided.&lt;/p&gt; &lt;p&gt;Due to the negative feedback in the crypto community NIST announced in November 2013 to pick the parameters from the original submission, and renamed the &lt;code&gt;SHAKE&lt;/code&gt; functions to reflect the bits of security instead of capacity.&lt;/p&gt; &lt;h4 id=&#34;so-there-are-two-changes-remaining-since-the-final-submission&#34;&gt;So there are two changes remaining since the final submission:&lt;a class=&#34;headerlink&#34; href=&#34;#so-there-are-two-changes-remaining-since-the-final-submission&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;The suffixes for domain separation (this was proposed by the Keccak team after the submission, not by NIST itself).&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;code&gt;SHAKE256&lt;/code&gt; (512 bit capacity) is a little bit less secure than the original proposed &lt;code&gt;Keccak[]&lt;/code&gt; with a capacity of 576; on the other hand most people agree that aiming for more than 256 bit security is pointless.&lt;/p&gt; &lt;p&gt;The Keccak authors wrote:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;In the Keccak design philosophy, safety margin comes from the number of rounds in &lt;code&gt;Keccak-f&lt;/code&gt;, whereas the security level comes from the selected capacity.&lt;/p&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;As far as I can see SHA-3 is as trustworthy as the original Keccak submission.&lt;/p&gt; &lt;h2 id=&#34;which-sha-3-hash-function-to-select&#34;&gt;Which SHA-3 hash function to select&lt;a class=&#34;headerlink&#34; href=&#34;#which-sha-3-hash-function-to-select&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;If you are not bound to be compatible with SHA-2 functions I&amp;rsquo;d recommend to use &lt;code&gt;SHAKE256&lt;/code&gt; with 512 bits of output to get 256-bit security instead of &lt;code&gt;SHA3-512&lt;/code&gt; - this is nearly twice as fast (rate of 1088 bit vs 576), and more than 256-bit security is just wasting resources.&lt;/p&gt; &lt;p&gt;If you are only interested in 128-bit collision resistance (because you don&amp;rsquo;t want to &amp;ldquo;waste&amp;rdquo; more space storing the output) &lt;code&gt;SHA3-256&lt;/code&gt; is a good choice - &lt;code&gt;SHAKE128&lt;/code&gt; with 256 bits of output is not much faster (rate of 1344 bits vs 1088), but having 256 bit security for preimage could be worth the cost.&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2014/05/15/some_notes_on_sha-3.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2014/05/15/some_notes_on_sha-3.html</guid> </item> <item> <title>Type punning with unions</title> <description>&lt;p&gt;TLDR: don&amp;rsquo;t use unions for type punning; always use &lt;code&gt;memcpy&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Sometimes you might want to reinterpret a value of one type as value of another type. For example you might have an integer parameter, but you know that it actually contains a float value.&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;Let&amp;rsquo;s assume the integer was large enough to store the float somehow, and now you want to get the value back. If you follow &lt;a href=&#34;https://en.wikipedia.org/wiki/Type_punning#Use_of_union&#34;&gt;wikipedia&lt;/a&gt; you might do something like this:&lt;/p&gt; &lt;div class=&#34;language-c highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;union&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Usually this works fine; as long as you access the values directly through the union member probably no compiler will screw this up. (There are various claims whether this is actually supposed to work in different language versions and C vs C++.)&lt;/p&gt; &lt;p&gt;But if you start using pointers (or references in C++) this can fail very fast:&lt;/p&gt; &lt;div class=&#34;language-c highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;return0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-7&#34;&gt;&lt;a id=&#34;__codelineno-1-7&#34; name=&#34;__codelineno-1-7&#34; href=&#34;#__codelineno-1-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;test_union_type_punning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-8&#34;&gt;&lt;a id=&#34;__codelineno-1-8&#34; name=&#34;__codelineno-1-8&#34; href=&#34;#__codelineno-1-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;union&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-9&#34;&gt;&lt;a id=&#34;__codelineno-1-9&#34; name=&#34;__codelineno-1-9&#34; href=&#34;#__codelineno-1-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-10&#34;&gt;&lt;a id=&#34;__codelineno-1-10&#34; name=&#34;__codelineno-1-10&#34; href=&#34;#__codelineno-1-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-11&#34;&gt;&lt;a id=&#34;__codelineno-1-11&#34; name=&#34;__codelineno-1-11&#34; href=&#34;#__codelineno-1-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-12&#34;&gt;&lt;a id=&#34;__codelineno-1-12&#34; name=&#34;__codelineno-1-12&#34; href=&#34;#__codelineno-1-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;return0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-13&#34;&gt;&lt;a id=&#34;__codelineno-1-13&#34; name=&#34;__codelineno-1-13&#34; href=&#34;#__codelineno-1-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;If compiled with gcc (4.9.1) &lt;code&gt;gcc -Wall -O2 -S type-punning.c&lt;/code&gt; I get this:&lt;/p&gt; &lt;div class=&#34;language-asm highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nl&#34;&gt;return0:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.cfi_startproc&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;movl&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%rdi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;xorl&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%eax&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;movl&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;$0x3f800000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%rsi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.cfi_endproc&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34; href=&#34;#__codelineno-2-8&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34; href=&#34;#__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nl&#34;&gt;test_union_type_punning:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-10&#34;&gt;&lt;a id=&#34;__codelineno-2-10&#34; name=&#34;__codelineno-2-10&#34; href=&#34;#__codelineno-2-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.cfi_startproc&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-11&#34;&gt;&lt;a id=&#34;__codelineno-2-11&#34; name=&#34;__codelineno-2-11&#34; href=&#34;#__codelineno-2-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;xorl&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%eax&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-12&#34;&gt;&lt;a id=&#34;__codelineno-2-12&#34; name=&#34;__codelineno-2-12&#34; href=&#34;#__codelineno-2-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-13&#34;&gt;&lt;a id=&#34;__codelineno-2-13&#34; name=&#34;__codelineno-2-13&#34; href=&#34;#__codelineno-2-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.cfi_endproc&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Although in &lt;code&gt;return0&lt;/code&gt; &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;f&lt;/code&gt; refer to the same memory location, and the write to &lt;code&gt;f&lt;/code&gt; comes after the write to &lt;code&gt;i&lt;/code&gt;, the compiler will ignore the write to &lt;code&gt;f&lt;/code&gt;. This is called &amp;ldquo;strict aliasing&amp;rdquo;; the compiler assumes that a write to a float reference will not modify any integers, and therefore the written integer value is still present.&lt;/p&gt; &lt;p&gt;Even inlining doesn&amp;rsquo;t help the compiler to see it, and it also doesn&amp;rsquo;t print a warning.&lt;/p&gt; &lt;p&gt;That is why I always prefer punning with &lt;code&gt;memcpy&lt;/code&gt; like this:&lt;/p&gt; &lt;div class=&#34;language-c highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34; href=&#34;#__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34; href=&#34;#__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-5&#34;&gt;&lt;a id=&#34;__codelineno-3-5&#34; name=&#34;__codelineno-3-5&#34; href=&#34;#__codelineno-3-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;memcpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-6&#34;&gt;&lt;a id=&#34;__codelineno-3-6&#34; name=&#34;__codelineno-3-6&#34; href=&#34;#__codelineno-3-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-7&#34;&gt;&lt;a id=&#34;__codelineno-3-7&#34; name=&#34;__codelineno-3-7&#34; href=&#34;#__codelineno-3-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;With &lt;code&gt;gcc -Wall -O2 -mtune=ivybridge&lt;/code&gt; and clang (same options) both functions generate the same code:&lt;/p&gt; &lt;div class=&#34;language-asm highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nl&#34;&gt;get_float:&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.cfi_startproc&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;movd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%edi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%xmm0&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34; href=&#34;#__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-4-5&#34;&gt;&lt;a id=&#34;__codelineno-4-5&#34; name=&#34;__codelineno-4-5&#34; href=&#34;#__codelineno-4-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.cfi_endproc&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;So if you have the option avoid unions for type punning. &lt;code&gt;memcpy&lt;/code&gt; is safer and makes the intention more clear, and shouldn&amp;rsquo;t have any performance drawbacks.&lt;/p&gt; &lt;p&gt;References:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://stackoverflow.com/questions/11373203/accessing-inactive-union-member-undefined&#34;&gt;https://stackoverflow.com/questions/11373203/accessing-inactive-union-member-undefined&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Type_punning&#34;&gt;https://en.wikipedia.org/wiki/Type_punning&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description> <link>https://stbuehler.de/blog/article/2015/01/25/type_punning_with_unions.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2015/01/25/type_punning_with_unions.html</guid> </item> <item> <title>systemd: allow normal process to bind to privileged port</title> <description>&lt;p&gt;Sometimes services are started by systemd with already dropped privileges, for example &lt;a href=&#34;https://sources.debian.net/src/inspircd/2.0.23-2/debian/inspircd.service/&#34;&gt;inspircd.service&lt;/a&gt; starts as &lt;code&gt;irc&lt;/code&gt; user.&lt;/p&gt; &lt;p&gt;Such services cannot bind to priliged ports (&lt;code&gt;&amp;lt; 1024&lt;/code&gt;) usually - in this case I needed it to listen to port 443 though (additionally to some high port) to allow users behind special firewall configurations to connect to the server.&lt;/p&gt; &lt;p&gt;The solution is to add the following to the service (for example by running &lt;code&gt;systemctl edit inspircd.service&lt;/code&gt;):&lt;/p&gt; &lt;div class=&#34;language-systemd highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;[Service]&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;na&#34;&gt;AmbientCapabilities&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;CAP_NET_BIND_SERVICE&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description> <link>https://stbuehler.de/blog/article/2017/06/23/systemd_allow_normal_process_to_bind_to_privileged_port.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2017/06/23/systemd_allow_normal_process_to_bind_to_privileged_port.html</guid> </item> <item> <title>debian stretch: upgrade 32-bit to 64-bit</title> <description>&lt;p&gt;There are various reasons why one would prefer 64-bit over 32-bit (or not); basically it is about improved ABI (passing arguments in registers), bigger register (can be faster) versus higher memory usage (because pointers are twice as big). In some corner cases you want 64-bit to be able to use more memory in your programs (32-bit kernels can often handle more than 4G memory, but 32-bit userspace programs can&amp;rsquo;t).&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;For me 64-bit offers higher security as well: &lt;a href=&#34;https://en.wikipedia.org/wiki/Address_space_layout_randomization&#34;&gt;ASLR (address space layout randomization)&lt;/a&gt; should be more effective on 64-bit because it can use more entropy.&lt;/p&gt; &lt;p&gt;So that is why I decided to upgrade some 32-bit (called &amp;ldquo;i386&amp;rdquo; in debian) machines to 64-bit (&amp;ldquo;amd64&amp;rdquo;); after some trial and error I came to the following set of operations to do this in a &amp;ldquo;reliable&amp;rdquo; (for me) and fast way.&lt;/p&gt; &lt;div class=&#34;admonition note&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Note 2020-10-24&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://tracker.debian.org/pkg/debian-crossgrader&#34;&gt;crossgrader&lt;/a&gt; just made it to debian unstable; it appears to support crossgrading even across CPU-incompatible architectures.&lt;/p&gt; &lt;/div&gt; &lt;h2 id=&#34;instructions&#34;&gt;Instructions&lt;a class=&#34;headerlink&#34; href=&#34;#instructions&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;This one should be obvious: make sure you have backups&lt;/li&gt; &lt;li&gt;If you can&amp;rsquo;t figure out what one of the commands below does, this is not for you. Expert mode only :)&lt;/li&gt; &lt;li&gt;Don&amp;rsquo;t blame me if it fails :)&lt;/li&gt; &lt;li&gt;Some programs store data in a platform specific way. So far I had this problem only with &lt;code&gt;postgresql&lt;/code&gt;, but other databases are very likely to be affected too. Export the data in a platform independent way before and restore it afterwards.&lt;/li&gt; &lt;li&gt;If you run custom installed stuff like &lt;code&gt;rvm&lt;/code&gt;, &lt;code&gt;virtualenv&lt;/code&gt; or &lt;code&gt;npm&lt;/code&gt; they probably won&amp;rsquo;t work after the migration.&lt;/li&gt; &lt;li&gt; &lt;p&gt;Remember which packages were installed, so you can later check nothing is missing (and you didn&amp;rsquo;t install packages you didn&amp;rsquo;t want). As I use aptitude with &amp;ldquo;markauto&amp;rdquo; I also store these states:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;aptitude&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;search&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~M&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cut&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-c5-&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;cut&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-d&lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-f1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;aptitude.auto &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^ii&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;packages &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Check the current architectures. Should show &amp;ldquo;i386&amp;rdquo; in the first and either nothing or &amp;ldquo;amd64&amp;rdquo; (when multiarch is already enabled) in the second command.&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--print-architecture &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--print-foreign-architectures &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Now upgrade to a 64-bit kernel. Since stretch you already need a multiarch setup for this:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--add-architecture&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;amd64 &lt;/span&gt;&lt;span id=&#34;_code_line-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;update &lt;/span&gt;&lt;span id=&#34;_code_line-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;linux-image-amd64:amd64 &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;If you need dkms modules you also need &lt;code&gt;linux-headers-amd64:amd64&lt;/code&gt;. Make sure the dkms modules actually got compiled before rebooting if they are essential.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Reboot and make sure you boot the amd64 kernel - either manipulate your bootloader config before rebooting, select it manually, or remove the 32-bit kernel before.&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;uname&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-r &lt;/span&gt;&lt;span id=&#34;_code_line-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;# should show 4.9.0-3-amd64&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Now is a good time to remove special 32-bit only packages, like &lt;code&gt;libc6-xen&lt;/code&gt; or the 32-bit kernel.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;You&amp;rsquo;ll see a repeating pattern below, so I&amp;rsquo;ll explain it first. apt-get (and aptitude) are not good at resolving conflicts, and don&amp;rsquo;t understand they don&amp;rsquo;t have to remove the &lt;code&gt;:i386&lt;/code&gt; packages to install the corresponding &lt;code&gt;:amd64&lt;/code&gt; package. So they would start with removing the &lt;code&gt;:i386&lt;/code&gt; packages, which essentially breaks your system, instead of just installing the &lt;code&gt;:amd64&lt;/code&gt; package.&lt;/p&gt; &lt;p&gt;So we only download the packages with &lt;code&gt;apt&lt;/code&gt;, and install them manually with &lt;code&gt;dpkg&lt;/code&gt;. For this we need a clean &lt;code&gt;/var/cache/apt/archives/&lt;/code&gt; directory.&lt;/p&gt; &lt;p&gt;The pattern is like this:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean &lt;/span&gt;&lt;span id=&#34;_code_line-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--download-only&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;SOME_PACKAGES &lt;/span&gt;&lt;span id=&#34;_code_line-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/*.deb &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;If the download command shows errors, it usually mentions missing dependencies: just repeat the command and add those at the end of the command.&lt;/p&gt; &lt;p&gt;Sometimes dpkg fails:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;If a Pre-Depends package is missing, it won&amp;rsquo;t install it at all. At the end dpkg will show you the &lt;code&gt;*.deb&lt;/code&gt; filename - just install those again with &lt;code&gt;dpkg --install ...&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;If a Depends package is missing it won&amp;rsquo;t configure the package. Just run &lt;code&gt;dpkg --configure -a&lt;/code&gt; afterwards to fix those.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The examples below sometimes anticipate the dpkg failures and show a second command to run.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;For whatever fucked up reason the dash preinst script uses bash; and bash of course &amp;ldquo;Pre-Depends&amp;rdquo; on dash. There is a good chance this breaks later, and if one of them gets removed you&amp;rsquo;re in big trouble (&lt;code&gt;xxd -r&lt;/code&gt; might help you restoring binaries from another system). So we update these first:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean &lt;/span&gt;&lt;span id=&#34;_code_line-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--download-only&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dash:amd64&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;bash:amd64 &lt;/span&gt;&lt;span id=&#34;_code_line-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/*.deb &lt;/span&gt;&lt;span id=&#34;_code_line-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/dash_*.deb&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/bash_*.deb &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;div class=&#34;admonition note&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Update&lt;/p&gt; &lt;p&gt;Good news, &lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=604873&#34;&gt;#604873&lt;/a&gt; (and &lt;a href=&#34;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=866362&#34;&gt;#866362&lt;/a&gt; with it) got fixed in debian buster, which should make this step unnecessary.&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Now we change the host architecture by installing the new packaging tools. This should work without aptitude too if you don&amp;rsquo;t want it.&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean &lt;/span&gt;&lt;span id=&#34;_code_line-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--download-only&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;dpkg:amd64&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;apt:amd64&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;aptitude:amd64&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;apt-utils:amd64 &lt;/span&gt;&lt;span id=&#34;_code_line-6-3&#34;&gt;&lt;a id=&#34;__codelineno-6-3&#34; name=&#34;__codelineno-6-3&#34; href=&#34;#__codelineno-6-3&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/*.deb &lt;/span&gt;&lt;span id=&#34;_code_line-6-4&#34;&gt;&lt;a id=&#34;__codelineno-6-4&#34; name=&#34;__codelineno-6-4&#34; href=&#34;#__codelineno-6-4&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/dpkg_*.deb &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Check the architecture indeed changed:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--print-architecture &lt;/span&gt;&lt;span id=&#34;_code_line-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--print-foreign-architectures &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Now install all &lt;code&gt;:i386&lt;/code&gt; with &lt;code&gt;:amd64&lt;/code&gt; as well. You can start with the libraries and perl (this sometimes keeps the failing list shorter, but not always).&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean &lt;/span&gt;&lt;span id=&#34;_code_line-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--download-only&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^.i&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:i386&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;s/\(.*\):i386/\1:i386- \1:amd64/&amp;#39;&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-8-3&#34;&gt;&lt;a id=&#34;__codelineno-8-3&#34; name=&#34;__codelineno-8-3&#34; href=&#34;#__codelineno-8-3&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/lib*.deb&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/perl*.deb &lt;/span&gt;&lt;span id=&#34;_code_line-8-4&#34;&gt;&lt;a id=&#34;__codelineno-8-4&#34; name=&#34;__codelineno-8-4&#34; href=&#34;#__codelineno-8-4&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--configure&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-a &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The download command might fail due to missing dependencies (see note above); also packages which are not available on amd64 can&amp;rsquo;t be installed of course. You could try removing them if they are not strictly needed, or put a &lt;code&gt;| grep -v PKGNAME&lt;/code&gt; before sed.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Now install everything else as &lt;code&gt;:amd64&lt;/code&gt;.&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;clean &lt;/span&gt;&lt;span id=&#34;_code_line-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--download-only&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^.i&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:i386&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;s/\(.*\):i386/\1:i386- \1:amd64/&amp;#39;&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;/var/cache/apt/archives/*.deb &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Again you might need to fix the download command like before. Instead of redownloading you can just remove the just installed packages too, or just install them again.&lt;/p&gt; &lt;p&gt;This was basically the big step.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Make sure your stuff is working again. The following steps cleanup the 32-bit packages, and for example installing &lt;code&gt;postgresql-9.6:i386&lt;/code&gt; to recover your database becomes more difficult if all dependecies are already gone.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Now remove the &lt;code&gt;:i386&lt;/code&gt; packages - they shouldn&amp;rsquo;t be needed anymore. I used aptitude for this (limit package view with &lt;code&gt;l&lt;/code&gt;, then enter &lt;code&gt;~ri386&lt;/code&gt;). Something like this might work too:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;autoremove &lt;/span&gt;&lt;span id=&#34;_code_line-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;remove&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^.i&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:i386&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Restore the aptitude markauto state:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-11-1&#34;&gt;&lt;a id=&#34;__codelineno-11-1&#34; name=&#34;__codelineno-11-1&#34; href=&#34;#__codelineno-11-1&#34;&gt;&lt;/a&gt;aptitude&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;markauto&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;cat&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;aptitude.auto&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;s/:i386/:amd64/&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Check installed package differences:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-12-1&#34;&gt;&lt;a id=&#34;__codelineno-12-1&#34; name=&#34;__codelineno-12-1&#34; href=&#34;#__codelineno-12-1&#34;&gt;&lt;/a&gt;diff&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-u&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;sed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;s/:.*//&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;packages&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;uniq&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^ii&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;s/:.*//&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;uniq&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;less &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Lines with &lt;code&gt;+&lt;/code&gt; are new packages, lines with &lt;code&gt;-&lt;/code&gt; are removed packages.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Remove &lt;code&gt;i386&lt;/code&gt; architecture:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-13-1&#34;&gt;&lt;a id=&#34;__codelineno-13-1&#34; name=&#34;__codelineno-13-1&#34; href=&#34;#__codelineno-13-1&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--remove-architecture&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;i386 &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Only works if there are no &lt;code&gt;i386&lt;/code&gt; packages left.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;You&amp;rsquo;re done. Reboot if you want to make sure everything is still working :)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;additional-notes&#34;&gt;Additional notes&lt;a class=&#34;headerlink&#34; href=&#34;#additional-notes&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;h3 id=&#34;debian-multiarch-dependency-handling&#34;&gt;Debian multiarch dependency handling&lt;a class=&#34;headerlink&#34; href=&#34;#debian-multiarch-dependency-handling&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Sometimes the dependency handling is fucked up. E.g. &lt;code&gt;postgresql&lt;/code&gt; (architecture independent) depends on &lt;code&gt;postgresql-9.6&lt;/code&gt; - it isn&amp;rsquo;t multiarch enabled as far as I can tell, and this means it wants &lt;code&gt;postgresql-9.6&lt;/code&gt; with the host architecture (which is completely unreasonable as it is just a meta package pulling components).&lt;/p&gt; &lt;p&gt;A similar problem exists the other way too: &lt;code&gt;postgresql-9.6&lt;/code&gt; (architecture dependent) depends on &lt;code&gt;locales&lt;/code&gt; (architecture independent). &lt;code&gt;postgresql-9.6&lt;/code&gt; wants &lt;code&gt;locales&lt;/code&gt; to be from the same architecture as itself, and apt and dpkg pretend &lt;code&gt;locales&lt;/code&gt; is from the host architecture, which doesn&amp;rsquo;t match if you try to install &lt;code&gt;postgresql-9.6:i386&lt;/code&gt; and the host architecture is already &lt;code&gt;amd64&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;I have no solution for the first problem; in the second case just download the package with wget and install it with &lt;code&gt;dpkg --install&lt;/code&gt;. It won&amp;rsquo;t configure it (because a dependency is missing), but it should be usable.&lt;/p&gt; &lt;h3 id=&#34;useful-tools&#34;&gt;Useful tools&lt;a class=&#34;headerlink&#34; href=&#34;#useful-tools&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;code&gt;needrestart&lt;/code&gt; is a great tool to find processes which should be restarted after upgrades - or 32-bit to 64-bit migrations.&lt;/li&gt; &lt;li&gt;&lt;code&gt;etckeeper&lt;/code&gt; is a great tool to keep track of your &lt;code&gt;/etc/&lt;/code&gt; changes.&lt;/li&gt; &lt;/ul&gt; &lt;h3 id=&#34;feedback&#34;&gt;Feedback&lt;a class=&#34;headerlink&#34; href=&#34;#feedback&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;I received some mails with feedback, thanks &lt;a href=&#34;http://dubiel.pl/Programy/debian%20cross%20grade%20from%20i386%20to%20amd64.txt&#34;&gt;Leszek Dubiel&lt;/a&gt; and Klemens:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;It&amp;rsquo;s probably a good idea to make sure there are no pending updates before you start.&lt;/li&gt; &lt;li&gt; &lt;p&gt;I pass &lt;code&gt;--no-install-recommends&lt;/code&gt; to apt; if you enabled &lt;code&gt;APT::Install-Suggests&lt;/code&gt; in your apt config you should add &lt;code&gt;--install-suggests&lt;/code&gt; as well in those places, or simply put this into &lt;code&gt;/etc/apt/99-no-auto-install.conf&lt;/code&gt; during the procedure:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-14-1&#34;&gt;&lt;a id=&#34;__codelineno-14-1&#34; name=&#34;__codelineno-14-1&#34; href=&#34;#__codelineno-14-1&#34;&gt;&lt;/a&gt;APT::Install-Recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-14-2&#34;&gt;&lt;a id=&#34;__codelineno-14-2&#34; name=&#34;__codelineno-14-2&#34; href=&#34;#__codelineno-14-2&#34;&gt;&lt;/a&gt;APT::Install-Suggests&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;You could make sure before starting your packages are in good state, and you don&amp;rsquo;t have any configured-but-not-installed packages. List the unclean packages with:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-15-1&#34;&gt;&lt;a id=&#34;__codelineno-15-1&#34; name=&#34;__codelineno-15-1&#34; href=&#34;#__codelineno-15-1&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-v&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^ii&amp;#39;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Purge previously installed and still configured packages with (this should remove all configuration and data of those packages - so don&amp;rsquo;t do this if you still need those):&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-16-1&#34;&gt;&lt;a id=&#34;__codelineno-16-1&#34; name=&#34;__codelineno-16-1&#34; href=&#34;#__codelineno-16-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;purge&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;^rc&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Or with aptitude:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-17-1&#34;&gt;&lt;a id=&#34;__codelineno-17-1&#34; name=&#34;__codelineno-17-1&#34; href=&#34;#__codelineno-17-1&#34;&gt;&lt;/a&gt;aptitude&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;purge&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;~c&amp;#39;&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;You can try to make sure before that all the packages you want are available on 64-bit:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-18-1&#34;&gt;&lt;a id=&#34;__codelineno-18-1&#34; name=&#34;__codelineno-18-1&#34; href=&#34;#__codelineno-18-1&#34;&gt;&lt;/a&gt;apt-get&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--dry-run&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--download-only&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-y&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--no-install-recommends&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-18-2&#34;&gt;&lt;a id=&#34;__codelineno-18-2&#34; name=&#34;__codelineno-18-2&#34; href=&#34;#__codelineno-18-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-l&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;^.i&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;awk&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;grep&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;:i386&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;sed&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-e&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;s/\(.*\):i386/\1:i386- 1\1:amd64/&amp;#39;&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;If you have packages that only work in a 32-bit environment you might be able to run them in a multiarch setup afterwards; just be careful when removing 32-bit packages above (either don&amp;rsquo;t remove them, or reinstall them later).&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;If &lt;code&gt;dpkg --install&lt;/code&gt; fails with &amp;ldquo;too many errors&amp;rdquo; you might want to try:&lt;/p&gt; &lt;div class=&#34;language-shell copy highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-19-1&#34;&gt;&lt;a id=&#34;__codelineno-19-1&#34; name=&#34;__codelineno-19-1&#34; href=&#34;#__codelineno-19-1&#34;&gt;&lt;/a&gt;dpkg&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--abort-after&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;999999&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--install&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;... &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Due to my repeated usage of &lt;code&gt;apt-get clean&lt;/code&gt; a fast network connection is useful, or a local caching proxy (e.g. &lt;code&gt;squid-deb-proxy&lt;/code&gt;; better run it on a second machine though).&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</description> <link>https://stbuehler.de/blog/article/2017/06/28/debian_stretch_upgrade_32-bit_to_64-bit.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2017/06/28/debian_stretch_upgrade_32-bit_to_64-bit.html</guid> </item> <item> <title>Using VRF (Virtual Routing and Forwarding) on Linux</title> <description>&lt;p&gt;It isn&amp;rsquo;t uncommon on linux systems to have muliple (layer 3, i.e. with IP addresses, not counting the loopback device) network interfaces. For example your main interface (with the default route) and a docker bridge. Or you run a firewall between a public network and one or many internal networks (perhaps as tagged VLAN interfaces).&lt;/p&gt; &lt;p&gt;But in rather rare scenarios you need multiple default routes: for example a separate management access in case someone attacks your main interface or it breaks due to other reasons. Or you want to provide a service to different networks (which are not connected directly) from the same host.&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;In those cases you need to be careful: if you simply add multiple default routes, linux will just pick one and go with it. Back in the old days you had to use policy-based routing for those cases: add another routing table and select it based on the source address for example; the second routing table can have a different default route than your main table.&lt;/p&gt; &lt;div class=&#34;admonition example&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Example&lt;/p&gt; &lt;p&gt;I have seen enterprise appliances using multiple default routes (and multiple interfaces of course), and they kept wondering why it didn&amp;rsquo;t work. Well, we use &lt;a href=&#34;https://en.wikipedia.org/wiki/Access-control_list&#34;&gt;ACLs&lt;/a&gt; to make sure systems uses the correct source address to prevent &lt;a href=&#34;https://en.wikipedia.org/wiki/IP_address_spoofing&#34;&gt;IP address spoofing&lt;/a&gt;; even without ACLs we usually enable &lt;a href=&#34;https://en.wikipedia.org/wiki/Reverse-path_forwarding#Unicast_RPF_(uRPF)&#34;&gt;uRPF&lt;/a&gt;. If you really need multiple interfaces, which can be connected to from overlapping sources, you &lt;strong&gt;MUST&lt;/strong&gt; setup policy-based routing (unless the outgoing interface doesn&amp;rsquo;t matter).&lt;/p&gt; &lt;/div&gt; &lt;p&gt;VRFs on linux are mostly a fancy way to setup policy-based routing for such special cases.&lt;/p&gt; &lt;h2 id=&#34;basic-idea&#34;&gt;Basic idea&lt;a class=&#34;headerlink&#34; href=&#34;#basic-idea&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Make sure your loopback device is up; without it various things just fail: &lt;code&gt;ip link set dev lo up&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;For each VRF apart from your default context create a VRF interface with a separate routing table like: &lt;code&gt;ip link add name blue type vrf table 10&lt;/code&gt;. You can assign names to those ids in &lt;code&gt;/etc/iproute2/rt_tables&lt;/code&gt; or &lt;code&gt;/etc/iproute2/rt_tables.d/*.conf&lt;/code&gt; - also handy to see which IDs are already in use by default. Each VRF needs its own table id!&lt;/li&gt; &lt;li&gt;Start VRFs: &lt;code&gt;ip link set dev blue up&lt;/code&gt;&lt;/li&gt; &lt;li&gt;Assign interfaces to the VRF and start them: &lt;code&gt;ip link set dev eth0 vrf blue up&lt;/code&gt;&lt;/li&gt; &lt;li&gt;Now you can configure addresses with &lt;code&gt;ip address&lt;/code&gt; as always; to configure routes you need to specify the VRF like: &lt;code&gt;ip [-6] route ... vrf blue&lt;/code&gt; (or the table id with &lt;code&gt;... table 10&lt;/code&gt;).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Sadly there are some cornercases that won&amp;rsquo;t work properly.&lt;/p&gt; &lt;p&gt;TLDR: run &lt;a href=&#34;../../../../2020/02/29/fix-vrf-rules.sh&#34;&gt;fix-vrf-rules.sh&lt;/a&gt; to fix it.&lt;/p&gt; &lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;a class=&#34;headerlink&#34; href=&#34;#how-it-works&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Routing on linux uses rules to find tables, and then looks up the target in the tables.&lt;/p&gt; &lt;p&gt;More precisely: it loops through all rules by preference, and if a rule matches, it will execute its action. If a action doesn&amp;rsquo;t lead to a final result it will continue with the next rule.&lt;/p&gt; &lt;p&gt;Usually the action is a table lookup; if the lookup finds a matching route, the process ends. In short: first table with a matching entry wins!&lt;/p&gt; &lt;p&gt;You can take a look at the rules with: &lt;code&gt;ip rule&lt;/code&gt; (IPv6: &lt;code&gt;ip -6 rule&lt;/code&gt;. For everything below keep in mind IPv6 has a separate configuration).&lt;/p&gt; &lt;p&gt;For IPv4 they look like this by default:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;0: from all lookup local&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32766: from all lookup main&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32767: from all lookup default&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;(In IPv6 the &lt;code&gt;lookup default&lt;/code&gt; line is not present by default.)&lt;/p&gt; &lt;p&gt;When you create a VRF (with linux kernel &amp;gt;= 4.8) you get this instead:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;0: from all lookup local&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;1000: from all lookup [l3mdev-table]&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32766: from all lookup main&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32767: from all lookup default&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;It inserted a new rule with a rather magic &lt;code&gt;[l3mdev-table]&lt;/code&gt; lookup. This will lookup the table you specified on creation of the VRF interface when the packet to be routed uses an interface that belongs to a VRF. Only one rule is needed for all VRFs!&lt;/p&gt; &lt;p&gt;But&amp;hellip; sadly the &lt;code&gt;lookup local&lt;/code&gt; comes before the VRF lookup; if you try to ping one of your main addresses from the VRF it will find them in the &lt;code&gt;local&lt;/code&gt; table, and never reach the VRF routing table. This is almost never what you wanted; with RFC1918 addresses you might want to reach someone else entirely (or just want to take it the proper path due to stateful firewalls: the response won&amp;rsquo;t take the shortcut!).&lt;/p&gt; &lt;p&gt;The solution is to move the &lt;code&gt;lookup local&lt;/code&gt; rule down; even the &lt;a href=&#34;https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/net/forwarding/lib.sh?id=29795de0d242a5ba45904b36a5fb67e38a304cb7#n370&#34;&gt;&amp;ldquo;selftests&amp;rdquo; script&lt;/a&gt; in the kernel does this:&lt;/p&gt; &lt;div class=&#34;language-sh highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-4&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pref&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;32765&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;table&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-4&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;del&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pref&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pref&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;32765&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;table&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;del&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pref&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The kernel &lt;a href=&#34;https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/vrf.txt&#34;&gt;Documentation/networking/vrf.txt&lt;/a&gt; also recommends adding unreachable routes to the VRF routing tables so that routes afterwards are taken (I&amp;rsquo;d recommend using &lt;code&gt;vrf blue&lt;/code&gt; instead of &lt;code&gt;table 10&lt;/code&gt; though):&lt;/p&gt; &lt;div class=&#34;language-sh highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-4&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;route&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;table&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unreachable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;default&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metric&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4278198272&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-6&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;route&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;table&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unreachable&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;default&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;metric&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4278198272&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;An even easier solution in my opinion is to add another rule with an &lt;code&gt;unreachable&lt;/code&gt; target which only triggers in VRF context:&lt;/p&gt; &lt;div class=&#34;language-sh highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-4&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;pref&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;l3mdev&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;unreachable &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Now the rules should look like this:&lt;/p&gt; &lt;div class=&#34;language-console highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;1000: from all lookup [l3mdev-table]&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;2000: from all lookup [l3mdev-table] unreachable&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32765: from all lookup local&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32766: from all lookup main&lt;/span&gt; &lt;/span&gt;&lt;span id=&#34;_code_line-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;go&#34;&gt;32767: from all lookup default&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The &lt;code&gt;unreachable&lt;/code&gt; action overrides the lookup, but due to &lt;code&gt;l3mdev&lt;/code&gt; only triggers if a VRF lookup would have triggered, and solves the problem for all VRFs.&lt;/p&gt; &lt;p&gt;My script &lt;a href=&#34;../../../../2020/02/29/fix-vrf-rules.sh&#34;&gt;fix-vrf-rules.sh&lt;/a&gt; should apply those changes in a safe way.&lt;/p&gt; &lt;h2 id=&#34;demo&#34;&gt;Demo&lt;a class=&#34;headerlink&#34; href=&#34;#demo&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;I created another script &lt;a href=&#34;../../../../2020/02/29/vrf-demo.sh&#34;&gt;vrf-demo.sh&lt;/a&gt; (requires &lt;a href=&#34;../../../../2020/02/29/fix-vrf-rules.sh&#34;&gt;fix-vrf-rules.sh&lt;/a&gt;) to show how a VRF setup can look like.&lt;/p&gt; &lt;p&gt;First it runs in a separate network namespace, so your normal network doesn&amp;rsquo;t break.&lt;/p&gt; &lt;p&gt;Then it will create a VRF and a veth-link (&amp;ldquo;virtual ethernet&amp;rdquo;, consisting of two interfaces) between the VRF and the default environment, setup some addresses and routing and showing connectivity.&lt;/p&gt; &lt;h2 id=&#34;using-vrfs&#34;&gt;Using VRFs&lt;a class=&#34;headerlink&#34; href=&#34;#using-vrfs&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Sadly most programs can&amp;rsquo;t use VRFs directly; they&amp;rsquo;d need support to set the &lt;code&gt;SO_BINDTODEVICE&lt;/code&gt; (or &lt;code&gt;SO_BINDTOIFINDEX&lt;/code&gt;) socket option. Without that they will end up using the default VRF (binding sources addresses from other VRFs doesn NOT work).&lt;/p&gt; &lt;p&gt;For incoming TCP connections you should be able to use &lt;code&gt;sysctl -w net.ipv4.tcp_l3mdev_accept=1&lt;/code&gt; to have a TCP server running in the &amp;ldquo;global&amp;rdquo; VRF accept connections in other VRFs as well (and the connection then being in the VRF it came from). The kernel also has sysctl options for UDP and RAW sockets, but I can&amp;rsquo;t see how that&amp;rsquo;d be useful, as they don&amp;rsquo;t result in a (VRF specific) connection socket, and response packets wouldn&amp;rsquo;t be sent in the VRF.&lt;/p&gt; &lt;p&gt;You can change the default VRF for a program with &lt;code&gt;ip vrf exec blue ...&lt;/code&gt; - this will install a hook in the kernel to basically set &lt;code&gt;SO_BINDTODEVICE&lt;/code&gt; everytime a new socket is created.&lt;/p&gt; &lt;h2 id=&#34;comparing-with-policy-based-routing&#34;&gt;Comparing with policy-based routing&lt;a class=&#34;headerlink&#34; href=&#34;#comparing-with-policy-based-routing&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;With the traditional policy-based routing you&amp;rsquo;d add rules like this:&lt;/p&gt; &lt;div class=&#34;language-sh highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;_code_line-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;ip&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;rule&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;add&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192&lt;/span&gt;.0.2.2&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;lookup&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;40&lt;/span&gt; &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;And then fill the routing table 40.&lt;/p&gt; &lt;p&gt;As binding to source addresses is a platform-independent concept, many programs support it (compared to &lt;code&gt;SO_BINDTODEVICE&lt;/code&gt;).&lt;/p&gt; &lt;p&gt;On the other hand you can use the same IP addresses in different VRFs; this is not possible without VRFs (for example you could run a DNS resolver for different networks on the same IP address for easier configuration).&lt;/p&gt;</description> <link>https://stbuehler.de/blog/article/2020/02/29/using_vrf_virtual_routing_and_forwarding_on_linux.html</link> <pubDate>Thu, 14 May 2026 17:49:50 +0000</pubDate> <source url="https://stbuehler.de/feed_rss_updated.xml">stbuehler.de</source><guid isPermaLink="true">https://stbuehler.de/blog/article/2020/02/29/using_vrf_virtual_routing_and_forwarding_on_linux.html</guid> </item> </channel> </rss>