<?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>daniel.haxx.se &#187; c-ares</title>
	<atom:link href="http://daniel.haxx.se/blog/tag/c-ares/feed/" rel="self" type="application/rss+xml" />
	<link>http://daniel.haxx.se/blog</link>
	<description>Technology is life</description>
	<lastBuildDate>Sat, 11 Feb 2012 18:53:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>getaddrinfo with round robin DNS and happy eyeballs</title>
		<link>http://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs/</link>
		<comments>http://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 22:15:21 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[POSIX]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[tcpip]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=3439</guid>
		<description><![CDATA[This is not news. This is only facts that seem to still be unknown to many people so I just want to help out documenting this to help educate the world. I&#8217;ll dance around the subject first a bit by providing the full background info&#8230;
round robin basics
Round robin DNS has been the way since a [...]]]></description>
			<content:encoded><![CDATA[<p>This is not news. This is only facts that seem to still be unknown to many people so I just want to help out documenting this to help educate the world. I&#8217;ll dance around the subject first a bit by providing the full background info&#8230;</p>
<h2>round robin basics</h2>
<p><a href="http://en.wikipedia.org/wiki/Round-robin_DNS">Round robin DNS</a> has been the way since a long time back to get some rough and cheap load-balancing and spreading out visitors over multiple hosts when they try to use a single host/service with static content. By setting up an <a href="http://rscott.org/dns/a.html">A entry</a> in a DNS zone to resolve to multiple IP addresses, clients would get different results in a semi-random manner and thus hitting different servers at different times:</p>
<blockquote>
<pre>server     A   192.168.0.1
server     A   10.0.0.1
server     A   127.0.0.1</pre>
</blockquote>
<p>For example, if you&#8217;re a small open source project it makes a perfect way to feature a distributed service that appears with a single name but is hosted by multiple distributed independent servers across the Internet.  It is also used by high profile web servers, like for example www.google.com and www.yahoo.com.</p>
<h2>host name resolving</h2>
<p>If you&#8217;re an old-school hacker, if you learned to do socket and TCP/IP programming from the original Stevens&#8217; books and if you were brought up on BSD unix you learned that you resolve host names with <a href="http://pubs.opengroup.org/onlinepubs/009695399/functions/gethostbyname.html">gethostbyname</a>() and friends. This is a POSIX and single unix specification that&#8217;s been around since basically forever.  When calling <em>gethostbyname()</em> on a given round robin host name, the function returns an array of addresses. That list of addresses will be in a seemingly random order. If an application just iterates over the list and connects to them in the order as received, the round robin concept works perfectly well.</p>
<h2>but gethostbyname wasn&#8217;t good enough</h2>
<p>gethostbyname() is really IPv4-focused. The mere whisper of IPv6 makes it break down and cry. It had to be replaced by something better.  Enter <a href="http://pubs.opengroup.org/onlinepubs/009604499/functions/getaddrinfo.html">getaddrinfo</a>() also POSIX (and defined in <a href="http://www.ietf.org/rfc/rfc3493.txt">RFC 3943</a> and again updated in <a href="http://www.ietf.org/rfc/rfc5014.txt">RFC 5014</a>). This is the modern function that supports IPv6 and more. It is the shiny thing the world needed!</p>
<h2>not a drop-in replacement</h2>
<p>So the (good parts of the) world replaced all calls to gethostbyname() with calls to getaddrinfo() and everything now supported IPv6 and things were all dandy and fine?  Not exactly.  Because there were subtleties involved. Like in which order these functions return addresses. In 2003 the IETF guys had shipped <a href="http://www.ietf.org/rfc/rfc3484.txt">RFC 3484</a> detailing <em>Default Address Selection for Internet Protocol version 6</em>, and using that as guideline most (all?) implementations were now changed to return the list of addresses in that order. It would then become a list of hosts in &#8220;preferred&#8221; order. Suddenly applications would iterate over both IPv4 and IPv6 addresses and do it in an order that would be clever from an IPv6 upgrade-path perspective.</p>
<h2>no round robin with getaddrinfo</h2>
<p>So, back to the good old way to do round robin DNS: multiple addresses (be it IPv4 or IPv6 or both). With the new ideas of how to return addresses this load balancing way no longer works. Now getaddrinfo() returns basically the same order in every invoke. I noticed this back in 2005 and posted a question on the glibc hackers mailinglist: <a href="http://www.cygwin.com/ml/libc-alpha/2005-11/msg00028.html">http://www.cygwin.com/ml/libc-alpha/2005-11/msg00028.html</a> As you can see, my question was delightfully ignored and nobody ever responded. The order seems to be dictated mostly by the above mentioned RFCs and the local <a href="http://linux.die.net/man/5/gai.conf">/etc/gai.conf</a> file, but neither is helpful if getting decent round robin is your aim.  Others <a href="http://lists.debian.org/debian-ctte/2007/09/msg00035.html">have noticed this flaw</a> <a href="http://www.mail-archive.com/wget@sunsite.dk/msg09237.html">as well</a> and some have fought compassionately arguing that this is a bad thing, while of course there&#8217;s an opposite side with people claiming it is the right behavior and that doing round robin DNS like this was a bad idea to start with anyway.  The impact on a large amount of common utilities is simply that <strong>when they go IPv6-enabled, they also at the same time go round-robin-DNS disabled</strong>.</p>
<h2>no decent fix</h2>
<p>Since getaddrinfo() now has worked like this for almost a decade, we can forget about &#8220;fixing&#8221; it. Since gai.conf needs local edits to provide a different function response it is not an answer.  But perhaps worse is, since getaddrinfo() is now made to return the addresses in a sort of order of preference it is hard to &#8220;glue on&#8221; a layer on top that simple shuffles the returned results. Such a shuffle would need to take IP versions and more into account. And it would become application-specific and thus would have to be applied to one program at a time.  The popular browsers seem less affected by this getaddrinfo drawback. My guess is that because they&#8217;ve already worked on making asynchronous name resolves so that name resolving doesn&#8217;t lock up their processes, they have taken different approaches and thus have their own code for this.  In <a href="http://curl.haxx.se/">curl&#8217;s</a> case, it can be built with <a href="http://c-ares.haxx.se/">c-ares</a> as a resolver backend even when supporting IPv6, and c-ares does not offer the sort feature of getaddrinfo and thus in these cases curl will work with round robin DNSes much more like it did when it used gethostbyname.</p>
<h2>alternatives</h2>
<p>The downside with all alternatives I&#8217;m aware of is that they aren&#8217;t just taking advantage of plain DNS. In order to duck for the problems I&#8217;ve mentioned, you can instead tweak your DNS server to respond differently to different users. That way you can either just randomly respond different addresses in a round robin fashion, or you can try to make it more clever by things such as <a href="http://www.powerdns.com/content/home-powerdns.html">PowerDNS&#8217;s</a> geobackend feature. Of course we all know that A) <a href="http://en.wikipedia.org/wiki/Geotargeting">geoip</a> is crude and often wrong and B) your real-world geography does not match your network topology.</p>
<h2>happy eyeballs</h2>
<p>During this period, another connection related issue has surfaced. The fact that IPv6 connections are often handled as a second option in dual-stacked machines, and the fact is that IPv6 is mostly present in dual stacks these days. This sadly punishes early adopters of IPv6 (yes, they unfortunately IPv6 must still be considered early) since those services will then be slower than the older IPv4-only ones.</p>
<p>There seems to be a general consensus on what the way to overcome this problem is: the <a href="http://tools.ietf.org/html/draft-ietf-v6ops-happy-eyeballs-07">Happy Eyeballs approach</a>. In short (and simplified) it recommends that we try both (or all) options at once, and the fastest to respond wins and gets to be used. This requires that we resolve A and AAAA names at once, and if we get responses to both, we connec() to both the IPv4 and IPv6 addresses and see which one is the fastest to connect.</p>
<p>This of course is not just a matter of replacing a function or two anymore. To implement this approach you need to do something completely new. Like for example just doing getaddrinfo() + looping over addresses and try connect() won&#8217;t at all work. You would basically either start two threads and do the IPv4-only route in one and do the IPv6 route in the other, <em>or</em> you would have to issue non-blocking resolver calls to do A and AAAA resolves in parallel in the same thread and when the first response arrives you fire off a non-blocking connect() &#8230;</p>
<p>My point being that introducing Happy Eyeballs in your good old socket app will require some rather major remodeling no matter what. Doing this will most likely also affect how your application handles with round robin DNS so now you have a chance to reconsider your choices and code!</p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Three out of one hundred</title>
		<link>http://daniel.haxx.se/blog/2011/10/31/three-out-of-one-hundred/</link>
		<comments>http://daniel.haxx.se/blog/2011/10/31/three-out-of-one-hundred/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 21:38:26 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[IT Politics]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[libssh2]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=2715</guid>
		<description><![CDATA[If I&#8217;m not part of the solution, I&#8217;m part of the problem and I don&#8217;t want to be part of the problem. More specifically, I&#8217;m talking about female presence in tech and in particular in open source projects.
I&#8217;ve been an open source and free software hacker, contributor and maintainer for almost 20 years. I&#8217;m the perfect [...]]]></description>
			<content:encoded><![CDATA[<p>If I&#8217;m not part of the solution, I&#8217;m part of the problem and <em>I don&#8217;t want to be part of the problem</em><strong>.</strong> More specifically, I&#8217;m talking about female presence in tech and in particular in open source projects.</p>
<p><img class="alignright size-full wp-image-2982" title="3 out of 100" src="http://daniel.haxx.se/blog/wp-content/uploads/2011/08/3of100.png" alt="3 out of 100" width="225" height="220" />I&#8217;ve been an open source and free software hacker, contributor and maintainer for almost 20 years. I&#8217;m the perfect stereo-type too: a white, hetero, 40+ years old male living in a suburb of a west European city. (I just lack a beard.) I&#8217;ve done more than 20,000 commits in public open source code repositories.  In the projects I maintain, and have a leading role in, and for the sake of this argument I&#8217;ll limit the discussion to <a href="http://curl.haxx.se/">curl</a>, <a href="http://www.libssh2.org/">libssh2</a>, and <a href="http://c-ares.haxx.se/">c-ares</a>, we&#8217;re certainly no better than the ordinary average male-dominated open source projects. We&#8217;re basically only men (boys?) talking to other men and virtually all the documentation, design and coding is done by male contributors (to a significant degree).</p>
<p>Sure, we have female contributors in all these projects, but for example in the curl case we have <a href="http://curl.haxx.se/docs/thanks.html">over 850 named contributors</a> and while I&#8217;m certainly not sure who is a woman and who is not when I get contributions, there&#8217;s only like 10 names in the list that are typically western female names. Let&#8217;s say there are 20. or 30. Out of a total of 850 the proportions are devastating no matter what. It might be up to 3%. Three. <strong>THREE</strong>. I know women are under-represented in technology in general and in open source in particular, but I think 3% is even lower than the already low bad average open source number. (Although, some reports claim the number of female developers in foss is as low as just above 1%, <a href="http://geekfeminism.wikia.com/wiki/FLOSS">geekfeminism</a> says 1-5%).</p>
<h2>Numbers</h2>
<p>Three percent. (In a project that&#8217;s been alive and kicking for <a href="http://daniel.haxx.se/blog/2011/03/20/curlyears-plus-equals-one/">thirteen years</a>&#8230;) At this level after this long time, there&#8217;s already a bad precedent and it of course doesn&#8217;t make it easier to change now. It is also three percent of the contributors when we consider all contributors alike. If we&#8217;d count the number of female persons in <em>leading roles</em> in these projects, the amount would be even less.</p>
<p>It could be worth noting that we don&#8217;t really have any recent reliable stats for &#8220;real world&#8221; female share either. Most sources that I find on the Internet and people have quoted in talks tend to repeat old numbers that were extracted using debatable means and questions. The comparisons I&#8217;ve seen repeated many times on female participation in FOSS vs commercial software, are very often based on stats that are really not comparable. If someone has reliable and somewhat fresh data, please point them out for me!</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 106px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&#8220;Ghosh, R. A.; Glott, R.; Krieger, B.;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 106px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Robles, G. 2002. Free/Libre and Open Source Software: Survey and Study. Part</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 106px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">IV: Survey of Developers. Maastricht: International Institute of Infonomics</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 106px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">/Merit.</div>
<h2>A design problem of &#8220;the system&#8221;</h2>
<p>I would blame &#8220;the system&#8221;. I&#8217;m working in embedded systems professionally as a consultant and contract developer. I&#8217;ve worked as a professional developer for some 20 years. In my niche, there&#8217;s not even 10% female developers. A while ago I went through my past assignments in order to find the last female developer that I&#8217;ve worked with, in a project, physically located in the same office. The last time I met a fellow developer at work who was female was early 2007. I&#8217;ve worked in 17 (seventeen!) projects since then, without even once having had a single female developer colleague. I usually work in smaller projects with like 5-10 people. So one female in 18 projects makes it something like <em>one out of 130</em> or so. I&#8217;m not saying this is a number that is anything to draw any conclusions from since it just me and my guesstimates. It does however hint that the problem is far beyond &#8220;just&#8221; FOSS.  It is a tech problem. Engineering? Software? Embedded software? Software development? I don&#8217;t know, but I know it is present both in my professional life as well as in my volunteer open source work.</p>
<p><a href="http://geekfeminism.wikia.com/wiki/Technology_industry">Geekfeminism says the share is 10-30%</a> in the &#8220;tech industry&#8221;. My experience says the share gets smaller and smaller the closer to &#8220;the metal&#8221; and low level programming you get &#8211; but I don&#8217;t have any explanation for it.</p>
<h2>Fixing the problems</h2>
<p>What are we (I) doing wrong? Am I at fault? Is the the way I talk or the way we run these projects in some subtle &#8211; or obvious &#8211; ways not friendly enough or downright hostile to women?  What can or <em>should</em> we change in these projects to make us less hostile? The sad reality is that I don&#8217;t think we have any such fatal flaws in our projects that create the obstacles. I don&#8217;t think many females ever show up near enough the projects to even get mistreated in the first place.</p>
<p>I have a son and I have a daughter &#8211; they&#8217;re both still young and unaware of this kind of differences and problems. I hope I will be able to motivate and push and raise them equally. I don&#8217;t want to live in a world where my daughter will have a hard time to get into tech just because she&#8217;s a girl.</p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2011/10/31/three-out-of-one-hundred/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>libcurl&#8217;s name resolving</title>
		<link>http://daniel.haxx.se/blog/2011/04/25/libcurls-name-resolving/</link>
		<comments>http://daniel.haxx.se/blog/2011/04/25/libcurls-name-resolving/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 17:54:29 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[dns]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=2761</guid>
		<description><![CDATA[Recently we&#8217;ve put in some efforts into remodeling libcurl&#8217;s code that handles name resolves, and then in particular the two asynchronous name resolver backends that we support: c-ares and threaded.
Name resolving in general in libcurl
libcurl can be built to do name resolves using different means. The primary difference between them is that they are either synchronous or [...]]]></description>
			<content:encoded><![CDATA[<p>Recently we&#8217;ve put in some efforts into remodeling <a href="http://curl.haxx.se/libcurl/">libcurl&#8217;s</a> code that handles name resolves, and then in particular the two asynchronous name resolver backends that we support: <em>c-ares</em> and <em>threaded</em>.</p>
<h2>Name resolving in general in libcurl</h2>
<p>libcurl can be built to do name resolves using different means. The primary difference between them is that they are either synchronous or asynchronous. The synchronous way makes the operation block during name resolves and there&#8217;s no &#8220;decent&#8221; way to abort the resolves if they take longer time than the program wants to allow it (other than using signals and that&#8217;s not what we consider a decent way).</p>
<h2>Asynch resolving in libcurl</h2>
<p>This is done using one of two ways: by building libcurl with <a href="http://c-ares.haxx.se/">c-ares</a> support or by building libcurl and tell it to use threads to solve the problem. libcurl can be built using either mechanism on just about all platforms, but on Windows the build defaults to using the threaded resolver.</p>
<h3 style="padding-left: 30px;">The c-ares solution</h3>
<p style="padding-left: 30px;">c-ares&#8217; primary benefit is that it is an asynchronous name resolver library so it can do name resolves without blocking without requiring a new thread. It makes it use less resources and remain a perfect choice even if you&#8217;d scale up your application up to and beyond an insane number of simultaneous connections. Its primary drawback is that since it isn&#8217;t based on the system default name resolver functions, they don&#8217;t work exactly like the system name resolver functions and that causes trouble at times.</p>
<h3 style="padding-left: 30px;">The threaded solution</h3>
<p style="padding-left: 30px;">By making sure the system functions are still used, this makes name resolving work exactly as with the synchronous solution, but thanks to the threading it doesn&#8217;t block. The downside here is of course that it uses a new thread for every name resolve, which in some cases can become quite a large number and of course creating and killing threads at a high rate is much more costly than sticking with the single thread.</p>
<h2>Pluggable</h2>
<p>Now we&#8217;ve made sure that we have an internal API that both our asynchronous name resolvers implement, and all code internally use this API. It makes the code a lot cleaner than the previous #ifdef maze for the different approaches, and it has the side-effect that it should allow much easier pluggable backends in case someone would like to make libcurl support another asynchronous name resolver or system.</p>
<p><em>This is all brand new in the master branch so please try it out and help us polish the initial quirks that may still exist in the code.</em></p>
<p>There is no current plan to allow this plugging to happen run-time or using any kind of external plugins. I don&#8217;t see any particular benefit for us to do that, but it would give us a lot more work and responsibilities.</p>
<p style="text-align: center;"><a href="http://curl.haxx.se/"><img class="size-full wp-image-64  aligncenter" title="cURL" src="http://daniel.haxx.se/blog/wp-content/uploads/2007/09/curl-keywords300.jpg" alt="cURL" width="300" height="110" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2011/04/25/libcurls-name-resolving/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>localhost hack on Windows</title>
		<link>http://daniel.haxx.se/blog/2011/02/21/localhost-hack-on-windows/</link>
		<comments>http://daniel.haxx.se/blog/2011/02/21/localhost-hack-on-windows/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 23:46:53 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[localhost]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=2592</guid>
		<description><![CDATA[Readers of my blog and friends in general know that I&#8217;m not really a Windows guy. I never use it and I never develop things explicitly for windows &#8211; but I do my best in making sure my portable code also builds and runs on windows. This blog post is about a new detail that [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-518" title="There's no place like 127.0.0.1" src="http://daniel.haxx.se/blog/wp-content/uploads/2009/02/no-place-like.jpg" alt="There's no place like 127.0.0.1" width="200" height="131" />Readers of my blog and friends in general know that I&#8217;m not really a Windows guy. I never use it and I never develop things explicitly for windows &#8211; but I do my best in making sure my portable code also builds and runs on windows. This blog post is about a new detail that I&#8217;ve just learned and that I think I could help shed the light on, to help my fellow hackers.  The other day I was contacted by a user of <a href="http://curl.haxx.se/libcurl/">libcurl</a> because he was using it on Windows and he noticed that when wanting to transfer data from the loopback device (where he had a service of his own), and he accessed it using &#8220;localhost&#8221; in the URL passed to libcurl, he would spot a DNS request for the address of that host name while when he used regular windows tools he would not see that!  After some mails back and forth, the details got clear:</p>
<p style="padding-left: 30px;">Windows has a default /etc/hosts version (conveniently instead put at &#8220;c:\WINDOWS\system32\drivers\etc\hosts&#8221;) and that default  /etc/hosts alternative used to have an entry for &#8220;localhost&#8221; in it that would point to 127.0.0.1.</p>
<p style="padding-left: 30px;">When Windows 7 was released, Microsoft had removed the localhost entry from the /etc/hosts file. Reading sources on the net, it might be related to them supporting IPv6 for real but it&#8217;s not at all clear what the connection between those two actions would be.</p>
<p style="padding-left: 30px;"><a href="http://msdn.microsoft.com/en-us/library/ms738520(v=vs.85).aspx">getaddrinfo()</a> in Windows has since then, and it is unclear exactly at which point in time it started to do this, been made to know about the specific string &#8220;localhost&#8221; and is documented to always return &#8220;all loopback addresses on the local computer&#8221;.</p>
<p>So, a custom resolver such as <a href="http://c-ares.haxx.se/">c-ares</a> that doesn&#8217;t use Windows&#8217; functions to resolve names but does it all by itself, that has been made to look in the /etc/host file etc now suddenly no longer finds &#8220;localhost&#8221; in a local file but ends up asking the DNS server for info about it&#8230;  A case that is far from ideal. Most servers won&#8217;t have an entry for it and others might simply provide the wrong address.</p>
<p>I think we&#8217;ll have to give in and provide this hack in c-ares as well, just the way Windows itself does.</p>
<p>Oh, and as a bonus there&#8217;s even an additional hack mentioned in the getaddrinfo docs: <em>On Windows Server 2003 and later if the pNodeName parameter points to a string equal to &#8220;..localmachine&#8221;, all registered addresses on the local computer are returned.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2011/02/21/localhost-hack-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C-ares, now and ahead!</title>
		<link>http://daniel.haxx.se/blog/2010/07/22/c-ares-now-and-ahead/</link>
		<comments>http://daniel.haxx.se/blog/2010/07/22/c-ares-now-and-ahead/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 21:52:22 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=1829</guid>
		<description><![CDATA[The project c-ares started many years ago (March 2004) when I decided to fork the existing ares project to get the changes done that I deemed necessary &#8211; and the original project owner didn&#8217;t want them.
I did my original work on c-ares back then primarily to get a good asynchronous name resolver for libcurl so [...]]]></description>
			<content:encoded><![CDATA[<p>The project <a href="http://c-ares.haxx.se/">c-ares</a> started many years ago (March 2004) when I decided to fork the existing ares project to get the changes done that I deemed necessary &#8211; and the original project owner didn&#8217;t want them.</p>
<p>I did my original work on c-ares back then primarily to get a good asynchronous name resolver for <a href="http://curl.haxx.se/libcurl/">libcurl</a> so that we would get around the limitation of having to do the name resolves totally synchronously as the libc interfaces mandate. Of course, c-ares was and is more than just name resolving and not too surprisingly, there have popped up other projects that are now using c-ares.</p>
<p>I&#8217;m maintaining a bunch of open source projects, and c-ares was never one that I felt a lot of love for, it was mostly a project that I needed to get done and when things worked the way I wanted them I found myself having ended up as maintainer for yet another project. I&#8217;ve repeatedly mentioned on the <a href="http://c-ares.haxx.se/mail.cgi">c-ares mailing list</a> that I don&#8217;t really have time to maintain it and that I&#8217;d rather step down and let someone else &#8220;take over&#8221;.</p>
<p>After having said this for over 4 years, I&#8217;ve come to accept that even though c-ares has many users out there, and even seems to be appreciated by companies and open source projects, there just isn&#8217;t any particular big desire to help out in our project. I find it very hard to just &#8220;give up&#8221; a functional project, so I linger and do my best to give it the efforts and love it needs. <em>I very much need and want help to maintain and develop c-ares</em>. I&#8217;m not doing a very good job with it right now.</p>
<p><strong>Threaded name resolves competes</strong></p>
<p>I once thought we would be able to make c-ares capable of becoming a true drop-in replacement for the native system name resolver functions, but over the years with c-ares I&#8217;ve learned that the dusty corners of name resolving in unix and Linux have so many features and fancy stuff that c-ares is still a long way from that. It has also made me turn around somewhat and I&#8217;ve reconsidered that perhaps using a threaded native resolver is the better way for libcurl to do asynchronous name resolves. That way we don&#8217;t need any half-baked implementations of the resolver. Of course it comes at the price of a new thread for each name resolve, which turns really nasty of you grow the number of connections just a tad bit, but still most libcurl-using applications today hardly use more than just a few (say less than a hundred) simultaneous transfers.</p>
<p><strong>Future!</strong></p>
<p>I don&#8217;t think the future has any radical changes or drastically new stuff in the pipe for c-ares. I think we should keep polishing off bugs and add the small functions and features that we&#8217;re missing. I believe we&#8217;re not yet parsing all records we could do, to a convenient format.</p>
<p>As usual, a project is not about how much we can add but about how much we can avoid adding and how much we can remain true to our core objectives. I wish the growing popularity will make more people join the project and then not only to through a single patch at us, but to also hand around a while and help us somewhat more.</p>
<p>Hopefully we will one day be able to use c-ares instead of a typical libc-based name resolver and yet resolve the same names.</p>
<p>Join us and help us give c-ares a better future!</p>
<p style="text-align: center;"><a href="http://c-ares.haxx.se/"><img class="size-medium wp-image-1412  aligncenter" title="c-ares" src="http://daniel.haxx.se/blog/wp-content/uploads/2009/11/cares-300x104.png" alt="c-ares" width="300" height="104" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2010/07/22/c-ares-now-and-ahead/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>roffit lives!</title>
		<link>http://daniel.haxx.se/blog/2010/06/04/roffit-lives/</link>
		<comments>http://daniel.haxx.se/blog/2010/06/04/roffit-lives/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 11:29:33 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[libssh2]]></category>
		<category><![CDATA[man pages]]></category>
		<category><![CDATA[roffit]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=1749</guid>
		<description><![CDATA[Many moons ago I created a little tool I named roffit. It is just a tiny perl script that converts a man page written in the nroff format to good-looking HTML. I should perhaps also add that I didn&#8217;t find any decent alternatives then so I wrote up my own version. I&#8217;ve been using it [...]]]></description>
			<content:encoded><![CDATA[<p>Many moons ago I created a little tool I named <a href="http://daniel.haxx.se/projects/roffit/">roffit</a>. It is just a tiny perl script that converts a man page written in the nroff format to good-looking HTML. I should perhaps also add that I didn&#8217;t find any decent alternatives then so I wrote up my own version. I&#8217;ve been using it since in projects such as <a href="http://curl.haxx.se/">curl</a>, <a href="http://c-ares.haxx.se/">c-ares</a> and <a href="http://www.libssh2.org/">libssh2</a> to produce web versions of the docs.</p>
<p>It has just done its job and I haven&#8217;t had any needs to fiddle with it. The project page lists it as last modified in 2004, even though I actually moved it to a <a href="http://www.sourceforge.net/">sourceforge</a> CVS repo back in 2007.</p>
<p>Just a few days ago, I got emailed and was notified that <a href="http://www.debian.org/">Debian</a> has it included as a <a href="http://packages.debian.org/unstable/main/roffit">package in the distribution</a> and someone was annoyed on some particular flaws.</p>
<p>This resulted in a bunch of bugs getting submitted to the <a href="http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=roffit;dist=unstable">Debian bug tracker</a>, I started up the brand new <a href="http://cool.haxx.se/cgi-bin/mailman/listinfo/roffit-devel">roffit-devel mailing list</a> to easier host roffit discussions and I switched over the CVS repo to a <a href="http://github.com/bagder/roffit">git one on github</a>.</p>
<p>If you like seeing man pages turned into web pages, consider joining up and help us improve this thing!</p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2010/06/04/roffit-lives/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The big protocols</title>
		<link>http://daniel.haxx.se/blog/2010/01/24/the-big-protocols/</link>
		<comments>http://daniel.haxx.se/blog/2010/01/24/the-big-protocols/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 21:53:45 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[dnssec]]></category>
		<category><![CDATA[OWASP]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=1496</guid>
		<description><![CDATA[OWASP Sweden once again arranged another interesting meeting, this time with three talks.
The title of the meeting on January 21st here in Stockholm called the protocols &#8220;the big ones&#8221; (but in Swedish) but I have no idea what kind of measurement they&#8217;ve used or what the small ones are or what other &#8220;big protocols&#8221; there [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.owasp.org/index.php/Sweden">OWASP Sweden </a>once again arranged another interesting meeting, this time with three talks.<img class="alignright size-full wp-image-1506" style="border: 0pt none; margin: 8px;" title="owasp" src="http://daniel.haxx.se/blog/wp-content/uploads/2010/01/owasp.png" alt="owasp" width="125" height="125" /></p>
<p>The title of the meeting on January 21st here in Stockholm called the protocols &#8220;the big ones&#8221; (but in Swedish) but I have no idea what kind of measurement they&#8217;ve used or what the small ones are or what other &#8220;big protocols&#8221; there might be! <img src='http://daniel.haxx.se/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>First we got to hear Håvard Eidnes tell us about <a href="http://en.wikipedia.org/wiki/Border_Gateway_Protocol">BGP</a> and that protocol seems to suffer from its share of security problems with the protocol itself but perhaps even more with the actual implementations as one of the bigger recent BGP-related incidents that was spoken about was about how internal routes were leaked to the outside from Pakistan in Feb 2008 which made them <a href="http://www.renesys.com/blog/2008/02/pakistan_hijacks_youtube_1.shtml">block the entire world&#8217;s access to Youtube</a>. This talk also gave us some insights on the &#8220;wild west&#8221; of international routing and the lack of control and proper knowledge about who&#8217;s allowed to route what to where.</p>
<p>There then was a session by Rickard Bellgrim about <a href="http://www.dnssec.net/">DNSSEC</a> and even though I&#8217;ve heard talks about this protocol in the past I couldn&#8217;t but to again feel that man they have a lot of terminology in that world that makes even a basic description fairly hard to keep up with in some parts of it all. And man do they have a lot of signing and keys and fingerprints and trusts going on&#8230; Of course DNSSEC is the answer to lots of existing problems with DNS and DNSSEC certainly opens up a range of new fun. The idea to somehow replace the need for ca-certs by storing keys in DNS is interesting, but even though technically working and sound I fear the browser vendors and the CAs of the SSL world won&#8217;t be very fast to turn the wheels to roll in that direction. DNSSEC certainly makes name resolving a lot more complicated, and I wonder if <a href="http://c-ares.haxx.se/">c-ares</a> should ever get into that game&#8230; And BTW, DNSSEC of course doesn&#8217;t take away the fact that <a href="http://www.esecurityplanet.com/features/article.php/3860016/DNSSEC-Compromised-Again.htm">specific implementations may still be vulnerable to security flaws</a>.</p>
<p>The last talk of the evening was about SSL, or rather TLS, held by Fredrik Hesse. He gave us a pretty detailed insight into how the protocol works, and then a fairly detailed overview of the flaws discovered during the last year or so, primarily <a href="http://www.phreedom.org/research/rogue-ca/">MD5 and rogue ca certs</a>, the <a href="http://daniel.haxx.se/blog/2009/10/19/null-prefix-domino/">null-prefix cert names</a> and the <a href="http://extendedsubset.com/?p=8">TLS renegotiation bug</a>. I felt good about already knowing just about everything of what he told us. I can also boast with having corrected the speaker afterward at the pub where we were having our post-talk-beers as he was evidently very OpenSSL focused when he spoke about what SSL libraries can and cannot do.</p>
<p>A great evening. And with good beers too. Thanks to the organizers!</p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2010/01/24/the-big-protocols/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>c-ares 1.7.0</title>
		<link>http://daniel.haxx.se/blog/2009/11/30/c-ares-1-7-0/</link>
		<comments>http://daniel.haxx.se/blog/2009/11/30/c-ares-1-7-0/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 21:22:37 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=1299</guid>
		<description><![CDATA[The first c-ares release so far in 2009 took place today when we shipped c-ares 1.7.0 and uploaded it to the web site.
News this time include:

Added ares_library_init() and ares_library_cleanup()
Added ares_parse_srv_reply(), ares_parse_txt_reply() and ares_free_data()
in6_addr is not used in ares.h anymore, but a private ares_in6_addr is
instead declared and used
ares_gethostbyname() now supports &#8216;AF_UNSPEC&#8217; as a family for resolving
either [...]]]></description>
			<content:encoded><![CDATA[<p>The first <a href="http://c-ares.haxx.se/">c-ares </a>release so far in 2009 took place today when we shipped c-ares 1.7.0 and uploaded it to the web site.</p>
<p>News this time include:</p>
<ul>
<li>Added <a href="http://c-ares.haxx.se/ares_library_init.html">ares_library_init</a>() and <a href="http://c-ares.haxx.se/ares_library_cleanup.html">ares_library_cleanup</a>()</li>
<li>Added ares_parse_srv_reply(), ares_parse_txt_reply() and ares_free_data()</li>
<li>in6_addr is not used in ares.h anymore, but a private ares_in6_addr is<br />
instead declared and used</li>
<li>ares_gethostbyname() now supports &#8216;AF_UNSPEC&#8217; as a family for resolving<br />
either AF_INET6 or AF_INET</li>
<li>a build-time configured ares_socklen_t is now used instead of socklen_t</li>
<li>new &#8211;enable-curldebug configure option</li>
<li>ARES_ECANCELLED is now sent as reason for ares_cancel()</li>
<li>new &#8211;enable-symbol-hiding configure option</li>
<li>new Makefile.msvc for any MSVC compiler or MS Visual Studio version</li>
<li>addrttl and addr6ttl structs renamed to ares_addrttl and ares_addr6ttl</li>
<li>naming convention for libraries built with MSVC, see README.msvc</li>
</ul>
<p>The set of bugfixes done include these:</p>
<ul>
<li>ares_parse_*_reply() functions now return ARES_EBADRESP instead of<br />
ARES_EBADNAME if the name in the response failed to decode</li>
<li>only expose/export symbols starting with &#8216;ares_&#8217;</li>
<li>fix \Device\TCP handle leaks triggered by buggy iphlpapi.dll</li>
<li>init without internet gone no longer fails</li>
<li>out of bounds memory overwrite triggered with malformed /etc/hosts file</li>
<li>function prototypes in man pages out of sync with ares.h</li>
</ul>
<p>As usual, c-ares would be nothing without the fierce and skillful help provided by a team of volunteer hackers. We always need more help and assitance, join the c-ares mailing list and join in the fun!</p>
<p style="text-align: center;"><a href="http://c-ares.haxx.se/"><img class="size-thumbnail wp-image-1412  aligncenter" title="c-ares" src="http://daniel.haxx.se/blog/wp-content/uploads/2009/11/cares-150x52.png" alt="c-ares" width="150" height="52" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2009/11/30/c-ares-1-7-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adapting to being behind</title>
		<link>http://daniel.haxx.se/blog/2009/11/19/adapting-to-being-behind/</link>
		<comments>http://daniel.haxx.se/blog/2009/11/19/adapting-to-being-behind/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 07:37:29 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[libssh2]]></category>
		<category><![CDATA[Haxx]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=1301</guid>
		<description><![CDATA[For many years I&#8217;ve always kept up to speed with my commitments in my primary open source projects. I&#8217;ve managed to set aside enough time to close the bug reports as fast as they have poured in. This, while still having time to work on new features every now and then.
During this last year (or [...]]]></description>
			<content:encoded><![CDATA[<p>For many years I&#8217;ve always kept up to speed with my commitments in my primary open source projects. I&#8217;ve managed to set aside enough time to close the bug reports as fast as they have poured in. This, while still having time to work on new features every now and then.</p>
<p>During this last year (or so) however, I&#8217;ve come to realize that I no longer can claim to be in that fortunate position and I now find myself seeing the pile of open bugs get bigger and bigger over time. I get more bug reports than I manage to close.</p>
<p>There are of course explanations for this. In both ends of the mix actually. I&#8217;ve got slightly less time due my recent decision to go working for <a href="http://www.haxx.se/">Haxx </a>full-time, and how I&#8217;ve decided to focus slightly more on paid work which thus leads to me having less time for the unpaid work I&#8217;m doing.</p>
<p>Also, I&#8217;ve seen activity raise in the <a href="http://curl.haxx.se/">curl </a>project, in the <a href="http://www.libssh2.org/">libssh2 </a>project and in the <a href="http://c-ares.haxx.se/">c-ares </a>project. All of these projects have the same problem of various degrees: a lack of participating developers working on fixing bugs. Especially bugs reported by someone else.</p>
<p>Since this situation is still fairly new to me, I need to learn on how to adapt to it. How to deal with a stream of issues that is overwhelming and I must select what particular things I care about and what to &#8220;let through&#8221;. This of course isn&#8217;t ideal for the projects but I can&#8217;t do much more than proceed to the best of my ability, to try to make people aware of that this is happening and try to get more people involved to help out!</p>
<p>Don&#8217;t get fooled by my focus on &#8220;time&#8221; above. Sometimes I even plainly lack the energy necessary to pull through. It depends a lot on the tone or impression I get from the report or reporter how I feel, but when a reporter is rude or just too &#8220;demanding&#8221; (like constantly violating the mailing list etiquette or just leaving out details even when asked) I can&#8217;t but help to feel that <em>at times </em>working as a developer during my full-day paid hours can make it a bit hard to then work a couple of hours more in the late evening debugging further.</p>
<p>The upside, let&#8217;s try to see it as a positive thing, is that now I can actually &#8220;punish&#8221; those that clearly don&#8217;t deserve to get helped since I now focus on the nice people, the good reports, the ones which seem to be written by clever people with an actual interest to see their problems addressed. Those who don&#8217;t do their part I&#8217;ll just happily ignore until they shape up.</p>
<p>I will deliberately just let issues &#8220;slip through&#8221; and not get my attention and require that if they are important enough people will either report it again, someone else will step up and help fix them or perhaps someone will even consider paying for the fix.</p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2009/11/19/adapting-to-being-behind/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How much for a bug?</title>
		<link>http://daniel.haxx.se/blog/2009/09/14/how-much-for-a-bug/</link>
		<comments>http://daniel.haxx.se/blog/2009/09/14/how-much-for-a-bug/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 21:02:35 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[cURL and libcurl]]></category>
		<category><![CDATA[c-ares]]></category>
		<category><![CDATA[libssh2]]></category>

		<guid isPermaLink="false">http://daniel.haxx.se/blog/?p=1185</guid>
		<description><![CDATA[Warning: blog post with no clear conclusion! 
I offer support deals to companies that want to get help with Open Source programs I&#8217;ve contributed to. The deals I&#8217;ve made so far have primarily involved libcurl, c-ares or libssh2, but that&#8217;s basically because those are projects in which I participate a lot in (and maintain) so [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-1193 alignright" style="margin: 8px;" title="no bugs" src="http://daniel.haxx.se/blog/wp-content/uploads/2009/09/no-bugs.png" alt="no bugs" width="190" height="181" /><strong>Warning: blog post with no clear conclusion! </strong></p>
<p>I offer support deals to companies that want to get help with Open Source programs I&#8217;ve contributed to. The deals I&#8217;ve made so far have primarily involved <a href="http://curl.haxx.se/libcurl/">libcurl</a>, <a href="http://c-ares.haxx.se/">c-ares</a> or <a href="http://www.libssh2.org/">libssh2</a>, but that&#8217;s basically because those are projects in which I participate a lot in (and maintain) so people find me easily in relation to those projects.</p>
<p>I wouldn&#8217;t mind accepting service and support deals for other projects or softwares either, as long as they are softwares I know and am fairly familiar with already and I am not scared of digging in and fixing things under the hood when that is required.</p>
<p>In fact, I could very well consider to <strong>offer to fix bugs in <em>any </em>Open Source software</strong>. Like a general: if you have a bug in an open source project that you really want fixed and you can&#8217;t do it yourself I might be your man. Of course this would be limited to some certain kinds of projects and programs, but it could still include a wide range of softwares. A lot more than the ones I happen to be involved in at any particular point in time.</p>
<p>But while &#8220;a bug&#8221; is a fairly easily defined term to a user who can&#8217;t make something work in a given program it can be anything from dead simple to downright impossible for a developer to fix. The fact that users many times cannot determine if a &#8220;bug&#8221; is hard or easy, if it&#8217;s a bug or a feature not working on purpose, makes such a business deal very hard to provide.</p>
<h2>How to pay to get a bug fixed?</h2>
<p>Fixed price per bug? Presumably only tricky bugs would be considered for this so it would require a fairly high fixed price. But then it&#8217;ll also never be used for simple bugs either since the fixed price would scare away such use cases. I don&#8217;t think a fixed-price scheme works very well for this.<img class="alignright size-full wp-image-316" style="margin: 8px;" title="One dollar bill" src="http://daniel.haxx.se/blog/wp-content/uploads/2008/03/1dollarbill.jpg" alt="One dollar bill" width="200" height="87" /></p>
<p>Then we only have a variable price approach left. A common way for a consultant like me is to charge for my time spent on a project: I set an hourly rate, I fix the issue in N hours. I charge hourly rate * N. For smallish projects, this is less attractive to customers. If we have no previous relationship, there&#8217;s a trust issue where the customer might not just blindly accept that I worked 10 hours on a task they think sounds easy so they feel overcharged. Also, there&#8217;s the risk that I estimate the job to be 2 hours but end up spending 12. My conclusion is that per-hour pricing doesn&#8217;t work for this either.</p>
<p>A variable price approach based on something else than number of hours it took for me to fix the problem is therefore needed.</p>
<p>A bug fix is of course worth whatever someone is willing to pay for it. But we don&#8217;t know what they are prepared to pay. On the other end, a bug fix can get done by someone for the price he/she is willing to accept to get the job done. So where is the cross section of those two unknown graphs?</p>
<p>I don&#8217;t have the answer here. I&#8217;m very interested in feedback and suggestions though. If you would pay for a bug fix, how would you like to get the price set?</p>
]]></content:encoded>
			<wfw:commentRss>http://daniel.haxx.se/blog/2009/09/14/how-much-for-a-bug/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

