<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Emile "iMil" Heitor 's home &#187; C</title>
	<atom:link href="http://imil.net/wp/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://imil.net/wp</link>
	<description>life, unix and stuff</description>
	<lastBuildDate>Wed, 08 Feb 2012 22:31:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>snprintf(surprise, BUFSIZ, &#8220;prout%s&#8221;, surprise);</title>
		<link>http://imil.net/wp/2009/05/19/snprintfsurprise-bufsiz-prouts-surprise/</link>
		<comments>http://imil.net/wp/2009/05/19/snprintfsurprise-bufsiz-prouts-surprise/#comments</comments>
		<pubDate>Tue, 19 May 2009 19:58:46 +0000</pubDate>
		<dc:creator>iMil</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[c0daz]]></category>
		<category><![CDATA[pkgin]]></category>

		<guid isPermaLink="false">http://imil.net/wp/?p=272</guid>
		<description><![CDATA[Cet après midi, j&#8217;ai eu une mauvaise surprise. Je fus en effet étonné de constater qu&#8217;en compilant pkgin sous GNU/Linux, les appels du type :

snprintf(a, size, "unechaine/%s", a);

tronquaient a avec uniquement unechaine.
Evidemment, mon premier reflexe fut de blâmer GNU/Linux puisque ce code passait sans aucun soucis sur NetBSD, DragonFly BSD et même Solaris. Et pourtant. [...]]]></description>
			<content:encoded><![CDATA[<p>Cet après midi, j&#8217;ai eu une mauvaise surprise. Je fus en effet étonné de constater qu&#8217;en compilant <a href="http://imil.net/pkgin">pkgin</a> sous GNU/Linux, les appels du type :</p>
<pre>
snprintf(a, size, "unechaine/%s", a);
</pre>
<p>tronquaient <code>a</code> avec uniquement <code>unechaine</code>.</p>
<p>Evidemment, mon premier reflexe fut de blâmer GNU/Linux puisque ce code passait sans aucun soucis sur NetBSD, DragonFly BSD et même Solaris. Et pourtant. C&#8217;est <i>gl</i> qui m&#8217;informa que <a href="http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf">ce document issu de l&#8217;ISO et l&#8217;IEC</a> explique clairement que le fait d&#8217;appeler <code>snprintf()</code> de la sorte rendait le résultat &#8220;imprévisible&#8221;. Dont acte.</p>
<p>Ainsi, j&#8217;ai imaginé la parade suivante :</p>
<p>Faire renvoyer le resultat <i>malloc</i>&#8216;é du <i>format string</i></p>
<pre>
char *
safe_snprintf(int size, const char *fmt, ...)
{
    char *p;
    va_list ap;

    XMALLOC(p, size * sizeof(char));
    va_start(ap, fmt);
    (void) vsnprintf(p, size, fmt, ap);
    va_end(ap);

    return p;
}
</pre>
<p>Puis simuler le précédent appel à <code>snprintf</code> via un <code>define</code> qui s&#8217;occuppera de libérer la destination et la faire pointer vers la chaine allouée précédemment renvoyée par <code>safe_printf()</code>.</p>
<pre>
#define XSNPRINTF(dst, size, fmt...)            \
    do {                                        \
        char *pdst;                             \
        pdst = safe_snprintf(size, fmt);        \
        XFREE(dst);                             \
        dst = pdst;                             \
} while (/* CONSTCOND */ 0)
</pre>
<p>Je teste ce workaround en ce moment, et le résultat semble probant.<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://imil.net/wp/2009/05/19/snprintfsurprise-bufsiz-prouts-surprise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La magie de l&#8217;ELF</title>
		<link>http://imil.net/wp/2008/12/10/la-magie-de-lelf/</link>
		<comments>http://imil.net/wp/2008/12/10/la-magie-de-lelf/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 14:01:00 +0000</pubDate>
		<dc:creator>iMil</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[c0daz]]></category>
		<category><![CDATA[NetBSD]]></category>

		<guid isPermaLink="false">http://imil.net/wp/?p=242</guid>
		<description><![CDATA[En comparant le projet qui m&#8217;obsède jour et nuit et les outils similaires déjà existants (crunchgen(1), rescue), j&#8217;en suis venu à me poser des questions sur le cas d&#8217;un mode &#8220;full static&#8221;. Pour mémoire, BeastieBox &#8220;trouve&#8221; la fonction à appeler fonction de argv[0], et je pars du principe que chaque nom de fonction doit être [...]]]></description>
			<content:encoded><![CDATA[<p>En comparant <a href="http://beastiebox.sourceforge.net/">le projet qui m&#8217;obsède jour et nuit</a> et les outils similaires déjà existants (<code>crunchgen(1), rescue</code>), j&#8217;en suis venu à me poser des questions sur le cas d&#8217;un mode &#8220;full static&#8221;. Pour mémoire, BeastieBox &#8220;trouve&#8221; la fonction à appeler fonction de <code>argv[0]</code>, et je pars du principe que chaque nom de fonction doit être construit dynamiquement. Ce <a href="http://mollacademy.gcu.info/doku.php?id=c:dlopen_self">tour de passe-passe</a> est facilement geré par les fonctions <code>dlopen(3) / dlsym(3)</code> dans le cas d&#8217;un binaire compilé dynamiquement, mais quid d&#8217;un binaire <code>beastiebox</code> compilé à l&#8217;aide du swtich <code>-static</code> ? Point de <code>ld.so_elf</code> à la rescousse ici, la seule solution qui m&#8217;est apparue&#8230; c&#8217;est d&#8217;attaquer le binaire comme le fait précisemment <code>ld.so_elf</code>, en <code>mmap</code>&#8216;ant le binaire et en l&#8217;adressant via les structures ELF.</p>
<p>J&#8217;ai posté l&#8217;explication dans la <a href="http://mollacademy.gcu.info/doku.php?id=c:static_symbols_with_elf">Mollacademy</a>, et le code associé de <i>BeastieBox</i> est visible <a href="http://beastiebox.cvs.sourceforge.net/viewvc/beastiebox/beastiebox/slsym.c?revision=1.3&#038;view=markup">ici</a>, <a href="http://beastiebox.cvs.sourceforge.net/viewvc/beastiebox/beastiebox/slsym.h?revision=1.3&#038;view=markup">ici</a> et <a href="http://beastiebox.cvs.sourceforge.net/viewvc/beastiebox/beastiebox/main.c?revision=1.14&#038;view=markup">là</a>.<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://imil.net/wp/2008/12/10/la-magie-de-lelf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Marty, ressors la Delorean (update)</title>
		<link>http://imil.net/wp/2008/11/29/marty-ressors-la-delorean-update/</link>
		<comments>http://imil.net/wp/2008/11/29/marty-ressors-la-delorean-update/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 10:44:16 +0000</pubDate>
		<dc:creator>iMil</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[embedded]]></category>
		<category><![CDATA[NetBSD]]></category>

		<guid isPermaLink="false">http://imil.net/wp/?p=239</guid>
		<description><![CDATA[Y&#8217;a quelques jours, je me suis lancé dans un nouveau projet. Plus pour le fun que par réelle nécéssité, je me suis mis en tête d&#8217;ecrire un BusyBox-like orienté BSD. J&#8217;en suis pour le moment aux balbutiements du projet, mais quelques commandes sont déjà fonctionnelles.
Mon approche est un tantinet differente du fonctionnement de BusyBox. Afin [...]]]></description>
			<content:encoded><![CDATA[<p>Y&#8217;a quelques jours, je me suis lancé dans un nouveau projet. Plus pour le fun que par réelle nécéssité, je me suis mis en tête d&#8217;ecrire un <a href="http://www.busybox.net/">BusyBox</a>-like orienté BSD. J&#8217;en suis pour le moment aux balbutiements du projet, mais quelques commandes sont déjà fonctionnelles.</p>
<p>Mon approche est un tantinet differente du fonctionnement de BusyBox. Afin de permettre l&#8217;écriture simple et rapide de plugins, je supporte deux modes, un mode statique (ala BB), et un mode dynamique grace aux interfaces DLFCN(3).</p>
<p>Ainsi, toujours sur le modèle de BB, un <code>ln -s</code> du programme principal vers la fonction souhaitée appellera :</p>
<ul>
<li>dans le cas d&#8217;une compilation dynamique, le symbole &#8220;fonction&#8221; dans la librairie <i>libfonction.so</i>, par exemple <i>command_ifconfig</i> dans libifconfig.so</li>
<li>dans le cas d&#8217;une compilation statique, le symbole souhaité dans le propre executable en utilisant une astuce <a href="http://mollacademy.gcu.info/doku.php?id=c:dlopen_self">décrite ici</a></li>
</ul>
<p>Afin de viser la plus petite taille possible pour l&#8217;ensemble, je suis en train de porter les outils de base d&#8217;un <a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/?only_with_tag=netbsd-1-0">NetBSD 1.0</a>, et aussi surprenant que cela puisse paraitre, le portage est relativement simple.</p>
<p>Si d&#8217;aucuns dans l&#8217;assemblée sont interessés par le projet, au doux nom de BeastieBox, les premiers morceaux de code sont disponibles <a href="http://beastiebox.cvs.sourceforge.net/beastiebox/">sur SourceForge</a>.</p>
<p><strong>Update</strong></p>
<p>Et maintenant, ça boot !<br />
<img src="/gfx/beastiebox-boot.png"/></p>
<p><strong>Update</strong></p>
<p>Le projet a maintenant <a href="http://beastiebox.sourceforge.net/">sa page officielle</a><br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://imil.net/wp/2008/11/29/marty-ressors-la-delorean-update/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: imil.net @ 2012-02-09 08:53:55 by W3 Total Cache -->
