<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Stev.Org</title>
    <description>Random Stuff from a software developer</description>
    <link>http://www.stev.org/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.0.0.36</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.stev.org/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>James</dc:creator>
    <dc:title>Stev.Org</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/StevOrg" /><feedburner:info uri="stevorg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>54.65</geo:lat><geo:long>-5.64</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><feedburner:emailServiceId>StevOrg</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>Python - Doesn't do real for loops</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Previous I wrote about python and its weakness for &lt;a href="http://www.stev.org/post/2012/02/22/Python-2d-Arrays-dont-work.aspx"&gt;2d arrays&lt;/a&gt;. This has now got me thinking a little more out of the box.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have also discovered that python doesn't actually support the tradition for loop. It supports a for each loop instead which has issues when attempts to run quite large loops.&amp;nbsp;This is a simple example of one of these issues which you can only ever discover when it is too late normally resulting in a crash of some kind.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;To start with lets look at the simple loop.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;&amp;gt;&amp;gt;&amp;gt; for i in range(0, 10):
...  print i
...
0
[cut]
9
&amp;gt;&amp;gt;&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It does of course print 0 - 9 as output. But look at how it is constructed. It uses the range function and range does't produce a number range. It produces a list of numbers from the specified paramaters on the function. So whats the big deal?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Well if you need to run a "big" for loop in python you simply cannot use it ... Well not without using lots and lots of memory. Not to mention that the entire list has to be created before the first for loop runs. Which is just going to make it dog slow to begin with.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So to get python to use around 170MB of memory (in a for loop) simply write&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;&amp;gt;&amp;gt;&amp;gt; for i in range(0, 10000000):
...     print i&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;But wait... 10 million? That a very big number. Or is it? It is not uncommon for large data sets to grow to 10 millions records. This would be exactly the sort of place you might want to use python as well.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So I guess the alternative to this is to role your own for loop using a while loop. Which I have had todo for various other things for variable stride lengths across array's. Though it kinda defets the entire purpose of there being a for loop in the first place.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As a bonus surprise while playing with this feature it probably also open's up a whole new range of security holes if a loop counter is supplied from end user input. This would lead to using massive amounts of memory. The real surprise I was greated with the following from the linux kernel who's out of memory killer could have also picked apache or a database engine to kill in its place.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;[5537286.542945] Out of memory: kill process 14166 (python) score 230114 or a child
[5537286.543168] Killed process 14166 (python)&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;But I guess thats python's way of doing things!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yInnaR9He0hUBIhHbYKBMtWG2QU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yInnaR9He0hUBIhHbYKBMtWG2QU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yInnaR9He0hUBIhHbYKBMtWG2QU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yInnaR9He0hUBIhHbYKBMtWG2QU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kRJU_BAcDIM:CC4dHi6NMTM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kRJU_BAcDIM:CC4dHi6NMTM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=kRJU_BAcDIM:CC4dHi6NMTM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kRJU_BAcDIM:CC4dHi6NMTM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=kRJU_BAcDIM:CC4dHi6NMTM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kRJU_BAcDIM:CC4dHi6NMTM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kRJU_BAcDIM:CC4dHi6NMTM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=kRJU_BAcDIM:CC4dHi6NMTM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/kRJU_BAcDIM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/kRJU_BAcDIM/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/24/Python-Dont-do-for-loops.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=39ac430b-c047-4cf6-999e-637e520c9971</guid>
      <pubDate>Fri, 24 Feb 2012 07:00:00 +0000</pubDate>
      <category>Python</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=39ac430b-c047-4cf6-999e-637e520c9971</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=39ac430b-c047-4cf6-999e-637e520c9971</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/24/Python-Dont-do-for-loops.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=39ac430b-c047-4cf6-999e-637e520c9971</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=39ac430b-c047-4cf6-999e-637e520c9971</feedburner:origLink></item>
    <item>
      <title>Python - 2d Array's don't work.</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you have been working with python you will notice that 2d array's just don't work. This might come as a surprise since almost every other modern programming language supports 2d array's. What might even come as a bigger surprise is that pythin doesn't support array's at all in its language. It uses lists to support this functionality. It might look like an array but it is actually a list.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This can be showen with the following. Note the error about the list.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;arr = []
arr[0] = 1


Traceback (most recent call last):
  File "&amp;lt;stdin&amp;gt;", line 1, in &amp;lt;module&amp;gt;
IndexError: list assignment index out of range&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So once you stop thinking about trying to create and array in pythin (which is easy since they don't exist) and start thinking about creating a list of items things become much easyier to understand why your 2d arrays of arr = [][] just doesnt work. As you have just attempts to create 2 lists and set a variable with them.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So to create a &lt;span style="text-decoration: line-through;"&gt;single array&lt;/span&gt; list is easy and we can do so using the following code.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;&amp;gt;&amp;gt;&amp;gt; arr = range(0,5)
&amp;gt;&amp;gt;&amp;gt; print arr
[0, 1, 2, 3, 4]

&amp;gt;&amp;gt;&amp;gt; arr[0] = 1
&amp;gt;&amp;gt;&amp;gt; print arr
[1, 1, 2, 3, 4]&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I actually find this really ugly. Since we just created a list of incrementing number and the array still needs to be set to zero. So to create a real array preset to zero you need to use the following.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;&amp;gt;&amp;gt;&amp;gt; arr = []
&amp;gt;&amp;gt;&amp;gt; for i in range(0, 5):
...  arr.append(0)
...
&amp;gt;&amp;gt;&amp;gt; print arr
[0, 0, 0, 0, 0]&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So moving onto the 2d array and you do exactly the same thing. Except you create a list and put it in the list item. Like this&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: plain;"&gt;&amp;gt;&amp;gt;&amp;gt; arr = []
&amp;gt;&amp;gt;&amp;gt; for i in range(0, 5):
...  x = []
...  for j in range(0, 5):
...   x.append(0)
...  arr.append(x)
...
&amp;gt;&amp;gt;&amp;gt; print arr
[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now you can read / write to the items by using an array like syntax or arr[0][0] .. arr[4][4].&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There is another alternative support to using 2d arrays in python by using a single list and then calulating the offsets. However for the particular problem I was trying to solve it really didn't help since python doesn't appear to support proper for loops either!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I guess thats what you get with python!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KSRKwfxUnnss7zgkUON6ekLyLnk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KSRKwfxUnnss7zgkUON6ekLyLnk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KSRKwfxUnnss7zgkUON6ekLyLnk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KSRKwfxUnnss7zgkUON6ekLyLnk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=5aLSlJaNCwc:b9WpUkgbp20:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=5aLSlJaNCwc:b9WpUkgbp20:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=5aLSlJaNCwc:b9WpUkgbp20:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=5aLSlJaNCwc:b9WpUkgbp20:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=5aLSlJaNCwc:b9WpUkgbp20:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=5aLSlJaNCwc:b9WpUkgbp20:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=5aLSlJaNCwc:b9WpUkgbp20:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=5aLSlJaNCwc:b9WpUkgbp20:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/5aLSlJaNCwc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/5aLSlJaNCwc/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/22/Python-2d-Arrays-dont-work.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=8f387296-d47a-406f-ad0b-7b714c410105</guid>
      <pubDate>Wed, 22 Feb 2012 20:25:00 +0000</pubDate>
      <category>Python</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=8f387296-d47a-406f-ad0b-7b714c410105</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=8f387296-d47a-406f-ad0b-7b714c410105</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/22/Python-2d-Arrays-dont-work.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=8f387296-d47a-406f-ad0b-7b714c410105</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=8f387296-d47a-406f-ad0b-7b714c410105</feedburner:origLink></item>
    <item>
      <title>C - get home dir location in linux</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This is a short example of how to get the home directory location in linux in a C program. There is really a few choices here and depending on what your requirements are you might want to use one or other methods. The first method can be changed by the user. The second method cannot. However if the first method fails you should drop faill back on the other method.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The simple method is to pull the enviroment variable "HOME"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The slightly more complex method is to read it from the system user database.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;pwd.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;


int main(int argc, char **argv) {


        char *homedir = getenv("HOME");

        if (homedir != NULL) {
                printf("Home dir in enviroment");
                printf("%s\n", homedir);
        }

        uid_t uid = getuid();
        struct passwd *pw = getpwuid(uid);

        if (pw == NULL) {
                printf("Failed\n");
                exit(EXIT_FAILURE);
        }

        printf("%s\n", pw-&amp;gt;pw_dir);

        return 0;
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xiogPmcfWuRJ12JaEHBgZBzj3vI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xiogPmcfWuRJ12JaEHBgZBzj3vI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xiogPmcfWuRJ12JaEHBgZBzj3vI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xiogPmcfWuRJ12JaEHBgZBzj3vI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=oLdKGiwdR8c:_sQsUZV4raI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=oLdKGiwdR8c:_sQsUZV4raI:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=oLdKGiwdR8c:_sQsUZV4raI:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=oLdKGiwdR8c:_sQsUZV4raI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=oLdKGiwdR8c:_sQsUZV4raI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=oLdKGiwdR8c:_sQsUZV4raI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=oLdKGiwdR8c:_sQsUZV4raI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=oLdKGiwdR8c:_sQsUZV4raI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/oLdKGiwdR8c" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/oLdKGiwdR8c/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/20/C-get-home-dir-location-in-linux.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=1081d8d3-2241-4f49-bad6-b00f97994b4a</guid>
      <pubDate>Mon, 20 Feb 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=1081d8d3-2241-4f49-bad6-b00f97994b4a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=1081d8d3-2241-4f49-bad6-b00f97994b4a</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/20/C-get-home-dir-location-in-linux.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=1081d8d3-2241-4f49-bad6-b00f97994b4a</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=1081d8d3-2241-4f49-bad6-b00f97994b4a</feedburner:origLink></item>
    <item>
      <title>C - ip address validation</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A short example to show how to check and ip address is actually an ip address in C. I have seen a number of time that people provide solution using reg'ex and various other methods to attempt to do this. However there is a standard function that will test for you.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The function is called inet_pton will be able to tell you if a string is acutally an ip address or not. Typically the function also has another use which is to convert an ip address into its network byte ordered integer format.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

#include &amp;lt;arpa/inet.h&amp;gt;

int main(int argc, char **argv) {
    unsigned long ip = 0;

    if (argc &amp;lt; 2) {
        printf("Usage: %s &amp;lt;ipv4&amp;gt;\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (0 == inet_pton(AF_INET, argv[1], &amp;amp;ip)) {
        printf("Failed\n");
        exit(EXIT_FAILURE);
    }

    printf("IP: %ld\n", ip);
    return 0;
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3DG6IeXL0Ooqx--3nqWpL1FYFZI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3DG6IeXL0Ooqx--3nqWpL1FYFZI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3DG6IeXL0Ooqx--3nqWpL1FYFZI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3DG6IeXL0Ooqx--3nqWpL1FYFZI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=IbPg4gFu1eU:Y_60I-hpEAs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=IbPg4gFu1eU:Y_60I-hpEAs:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=IbPg4gFu1eU:Y_60I-hpEAs:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=IbPg4gFu1eU:Y_60I-hpEAs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=IbPg4gFu1eU:Y_60I-hpEAs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=IbPg4gFu1eU:Y_60I-hpEAs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=IbPg4gFu1eU:Y_60I-hpEAs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=IbPg4gFu1eU:Y_60I-hpEAs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/IbPg4gFu1eU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/IbPg4gFu1eU/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/17/C-ip-address-validation.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=adfe5d34-722d-48ca-b770-c99771d850c1</guid>
      <pubDate>Fri, 17 Feb 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=adfe5d34-722d-48ca-b770-c99771d850c1</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=adfe5d34-722d-48ca-b770-c99771d850c1</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/17/C-ip-address-validation.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=adfe5d34-722d-48ca-b770-c99771d850c1</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=adfe5d34-722d-48ca-b770-c99771d850c1</feedburner:origLink></item>
    <item>
      <title>C - Get current ip address of an interface</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This is a short example to retrive an ip address from an interface in linux. It is typically used to be able to bind a port to a specific address on a machine.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;errno.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;net/if.h&amp;gt;

#include &amp;lt;sys/ioctl.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;

int main(int argc, char **argv) {
    int sock = socket(PF_INET, SOCK_DGRAM, 0);
    struct ifreq req;

    if (argc &amp;lt; 2) {
        fprintf(stderr, "Usage: %s &amp;lt;interfacename&amp;gt;\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (sock &amp;lt; 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    memset(&amp;amp;req, 0, sizeof(req));
    strncpy(req.ifr_name, argv[1], IF_NAMESIZE - 1);

    if (ioctl(sock, SIOCGIFADDR, &amp;amp;req) &amp;lt; 0) {
        perror("ioctl");
        exit(EXIT_FAILURE);
    }

    printf("%s\n", inet_ntoa(((struct sockaddr_in *)&amp;amp;req.ifr_addr)-&amp;gt;sin_addr));


    close(sock);

    exit(EXIT_SUCCESS);
    return 0;
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wiSElu0j9nNxpq1jrCalsrYwQ0c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wiSElu0j9nNxpq1jrCalsrYwQ0c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wiSElu0j9nNxpq1jrCalsrYwQ0c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wiSElu0j9nNxpq1jrCalsrYwQ0c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=cZswugr4UkQ:uzLRWoRmMDQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=cZswugr4UkQ:uzLRWoRmMDQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=cZswugr4UkQ:uzLRWoRmMDQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=cZswugr4UkQ:uzLRWoRmMDQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=cZswugr4UkQ:uzLRWoRmMDQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=cZswugr4UkQ:uzLRWoRmMDQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=cZswugr4UkQ:uzLRWoRmMDQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=cZswugr4UkQ:uzLRWoRmMDQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/cZswugr4UkQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/cZswugr4UkQ/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/15/C-Get-current-ip-address-of-an-interface.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=e98876a7-3375-4845-864f-50dc65a08727</guid>
      <pubDate>Wed, 15 Feb 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=e98876a7-3375-4845-864f-50dc65a08727</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=e98876a7-3375-4845-864f-50dc65a08727</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/15/C-Get-current-ip-address-of-an-interface.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=e98876a7-3375-4845-864f-50dc65a08727</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=e98876a7-3375-4845-864f-50dc65a08727</feedburner:origLink></item>
    <item>
      <title>Read / Write a pid for a file in linux</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This is a short example to show you how to read and write a process id to a file in linux.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;First the write.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;

int main(int argc, char **argv) {
    pid_t pid = getpid();

    if (argc &amp;lt; 2) {
        printf("Usage: %s &amp;lt;filename&amp;gt;\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    FILE *fp = fopen(argv[1], "w");
    if (!fp) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    fprintf(fp, "%d\n", pid);

    fclose(fp);

    return EXIT_SUCCESS;
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Then the read&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;

int main(int argc, char **argv) {
    pid_t pid = 0;

    if (argc &amp;lt; 2) {
        printf("Usage: %s &amp;lt;filename&amp;gt;\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    if (fscanf(fp, "%d\n", &amp;amp;pid) == 1) {
        printf("PID: %d\n", pid);
    } else {
        printf("Failed to Read PID\n");
    }

    fclose(fp);

    return EXIT_SUCCESS;
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YTK5_4Xop3yzyBUqUi4Tmy6gDDQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YTK5_4Xop3yzyBUqUi4Tmy6gDDQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YTK5_4Xop3yzyBUqUi4Tmy6gDDQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YTK5_4Xop3yzyBUqUi4Tmy6gDDQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=zOExFyiGKwc:aG1qG29vJrk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=zOExFyiGKwc:aG1qG29vJrk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=zOExFyiGKwc:aG1qG29vJrk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=zOExFyiGKwc:aG1qG29vJrk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=zOExFyiGKwc:aG1qG29vJrk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=zOExFyiGKwc:aG1qG29vJrk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=zOExFyiGKwc:aG1qG29vJrk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=zOExFyiGKwc:aG1qG29vJrk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/zOExFyiGKwc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/zOExFyiGKwc/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/13/Read-Write-a-pid-for-a-file-in-linux.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=da95cc4e-aee4-4c30-b108-7584facd2f72</guid>
      <pubDate>Mon, 13 Feb 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=da95cc4e-aee4-4c30-b108-7584facd2f72</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=da95cc4e-aee4-4c30-b108-7584facd2f72</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/13/Read-Write-a-pid-for-a-file-in-linux.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=da95cc4e-aee4-4c30-b108-7584facd2f72</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=da95cc4e-aee4-4c30-b108-7584facd2f72</feedburner:origLink></item>
    <item>
      <title>Using asprintf instead of sprintf or snprintf</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One of the problem that has always existed in c programming is to create a big enough buffer in order to store a string. This can create a chicken / egg problem when trying to use sprintf or snprintf where you don't know how big the buffer actually needs to be to store the string.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There is another function in linux which will allocate a buffer which is called asprintf (allocate string printf). this will make sure that the buffer is always going to be big enough to store the data and does not suffer from the same problems when using sprintf or snprintf.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The cost of using this is of course is performance releated since it needs to allocate memory and you also need to free it later. This type of allocation can be expensive if called a large number of times. There is also of course the problem of remembering to free the allocated memory later or it will create a memory leak.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;To use this function you also need to define _GNU_SOURCE on the gcc command line (of in the program with a define before the includes)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is an example of using asprintf.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main(int argc, char **argv) {
    char *tmp = 0;

    if (asprintf(&amp;amp;tmp, "%s %d", "Magic Number", 1234) &amp;lt; 0) {
        perror("asprintf");
        exit(EXIT_FAILURE);
    }

    printf("%s\n", tmp);

    free(tmp);

    return 0;
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VfVMUTg1RCLCLFLuW8TPTnXJMkw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VfVMUTg1RCLCLFLuW8TPTnXJMkw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VfVMUTg1RCLCLFLuW8TPTnXJMkw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VfVMUTg1RCLCLFLuW8TPTnXJMkw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kHaIMd1OjeY:-Lu9NUQMVH8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kHaIMd1OjeY:-Lu9NUQMVH8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=kHaIMd1OjeY:-Lu9NUQMVH8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kHaIMd1OjeY:-Lu9NUQMVH8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=kHaIMd1OjeY:-Lu9NUQMVH8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kHaIMd1OjeY:-Lu9NUQMVH8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=kHaIMd1OjeY:-Lu9NUQMVH8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=kHaIMd1OjeY:-Lu9NUQMVH8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/kHaIMd1OjeY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/kHaIMd1OjeY/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/10/Using-saprintf-instead-of-sprintf-or-snprintf.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=eef48f61-27f7-40ae-98f1-41976f3053d6</guid>
      <pubDate>Fri, 10 Feb 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=eef48f61-27f7-40ae-98f1-41976f3053d6</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=eef48f61-27f7-40ae-98f1-41976f3053d6</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/10/Using-saprintf-instead-of-sprintf-or-snprintf.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=eef48f61-27f7-40ae-98f1-41976f3053d6</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=eef48f61-27f7-40ae-98f1-41976f3053d6</feedburner:origLink></item>
    <item>
      <title>Using perror in C to convert error numbers to a string</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A short example on how to convert error number to a human readable string in C.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int main(int argc, char **argv) {
	int err = 0;

	if (argc &amp;lt; 2) {
		printf("Usage: %s &amp;lt;error number&amp;gt;\n", argv[0]);
		exit(-1);
	}

	err = atoi(argv[1]);

	printf("Error: %s\n", strerror(err));	


	return 0;
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9HB4_BNW91BG3PrWdfwd4pZk5WA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9HB4_BNW91BG3PrWdfwd4pZk5WA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9HB4_BNW91BG3PrWdfwd4pZk5WA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9HB4_BNW91BG3PrWdfwd4pZk5WA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=T06JzQadddw:TJoV_Au7H-c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=T06JzQadddw:TJoV_Au7H-c:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=T06JzQadddw:TJoV_Au7H-c:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=T06JzQadddw:TJoV_Au7H-c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=T06JzQadddw:TJoV_Au7H-c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=T06JzQadddw:TJoV_Au7H-c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=T06JzQadddw:TJoV_Au7H-c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=T06JzQadddw:TJoV_Au7H-c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/T06JzQadddw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/T06JzQadddw/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/08/Using-perror-in-C-to-convert-error-numbers-to-a-string.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=0a400508-31fb-4893-a9c9-14e32bd4322b</guid>
      <pubDate>Wed, 08 Feb 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=0a400508-31fb-4893-a9c9-14e32bd4322b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=0a400508-31fb-4893-a9c9-14e32bd4322b</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/08/Using-perror-in-C-to-convert-error-numbers-to-a-string.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=0a400508-31fb-4893-a9c9-14e32bd4322b</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=0a400508-31fb-4893-a9c9-14e32bd4322b</feedburner:origLink></item>
    <item>
      <title>Postgres - Convert unix timestamp</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I am actually surprised that postgres does not have a builtin function to deal with unix timestamps. After all it does run on linux which does use unix timestamps. So it must be a common problem. Here is a quick solution.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: sql;"&gt;CREATE OR REPLACE FUNCTION parseunixtimestamp(int)
	RETURNS timestamp AS 
		'SELECT TIMESTAMP ''epoch'' + $1 * INTERVAL ''1 second'''
	LANGUAGE SQL;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now you can use it in select or insert statements. Like this&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: sql;"&gt;INSERT INTO TABLE (name, createdon) VALUES("a value", parseunixtimestamp(55436437))&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you need to you can remove it again later by running&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: sql;"&gt;DROP FUNCTION parseunixtimestamp(integer);&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tKHjPH4hqGcT4z7keR7eA6R2I8Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tKHjPH4hqGcT4z7keR7eA6R2I8Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tKHjPH4hqGcT4z7keR7eA6R2I8Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tKHjPH4hqGcT4z7keR7eA6R2I8Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=FiVDvrI5Z2Q:B1NOBQl2MN8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=FiVDvrI5Z2Q:B1NOBQl2MN8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=FiVDvrI5Z2Q:B1NOBQl2MN8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=FiVDvrI5Z2Q:B1NOBQl2MN8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=FiVDvrI5Z2Q:B1NOBQl2MN8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=FiVDvrI5Z2Q:B1NOBQl2MN8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=FiVDvrI5Z2Q:B1NOBQl2MN8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=FiVDvrI5Z2Q:B1NOBQl2MN8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/FiVDvrI5Z2Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/FiVDvrI5Z2Q/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/02/02/Postgres-Convert-unix-timestamp.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=4e3d4c5e-fb26-458a-87f9-e914e33079bc</guid>
      <pubDate>Thu, 02 Feb 2012 08:00:00 +0000</pubDate>
      <category>Postgres</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=4e3d4c5e-fb26-458a-87f9-e914e33079bc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=4e3d4c5e-fb26-458a-87f9-e914e33079bc</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/02/02/Postgres-Convert-unix-timestamp.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=4e3d4c5e-fb26-458a-87f9-e914e33079bc</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=4e3d4c5e-fb26-458a-87f9-e914e33079bc</feedburner:origLink></item>
    <item>
      <title>Example of how to overwrite argv in C</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A short code example to show how to overwrite the contents of argv. It is useful for when a password is passed on the command line and it should not be visible in the process list to other users on the same machine.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;pre class="brush: cpp;"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int main(int argc, char **argv) {
	int i = 0;
	int len = 0;

	if (argc &amp;lt; 2) {
		printf("Usage: %s &amp;lt;some argument&amp;gt;\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	len = strlen(argv[1]);
	for(i=0;i&amp;lt;len;i++) {
		argv[1][i] = 'x';
	}

	system("ps f");

	return 0;
}&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9tNqhRLmfAXqvcpoM8y9UBnJnto/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9tNqhRLmfAXqvcpoM8y9UBnJnto/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9tNqhRLmfAXqvcpoM8y9UBnJnto/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9tNqhRLmfAXqvcpoM8y9UBnJnto/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=BdMnipEnW0I:GEnruUWFhYk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=BdMnipEnW0I:GEnruUWFhYk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=BdMnipEnW0I:GEnruUWFhYk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=BdMnipEnW0I:GEnruUWFhYk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=BdMnipEnW0I:GEnruUWFhYk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=BdMnipEnW0I:GEnruUWFhYk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/StevOrg?a=BdMnipEnW0I:GEnruUWFhYk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevOrg?i=BdMnipEnW0I:GEnruUWFhYk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevOrg/~4/BdMnipEnW0I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/StevOrg/~3/BdMnipEnW0I/post.aspx</link>
      <author>james@stev.org</author>
      <comments>http://www.stev.org/post/2012/01/31/Example-of-how-to-overwrite-argv-in-C.aspx#comment</comments>
      <guid isPermaLink="false">http://www.stev.org/post.aspx?id=86a2d7d8-01d0-45c7-8d27-1328339f8fde</guid>
      <pubDate>Tue, 31 Jan 2012 08:00:00 +0000</pubDate>
      <category>C</category>
      <category>Linux Programming</category>
      <dc:publisher>james</dc:publisher>
      <pingback:server>http://www.stev.org/pingback.axd</pingback:server>
      <pingback:target>http://www.stev.org/post.aspx?id=86a2d7d8-01d0-45c7-8d27-1328339f8fde</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.stev.org/trackback.axd?id=86a2d7d8-01d0-45c7-8d27-1328339f8fde</trackback:ping>
      <wfw:comment>http://www.stev.org/post/2012/01/31/Example-of-how-to-overwrite-argv-in-C.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.stev.org/syndication.axd?post=86a2d7d8-01d0-45c7-8d27-1328339f8fde</wfw:commentRss>
    <feedburner:origLink>http://www.stev.org/post.aspx?id=86a2d7d8-01d0-45c7-8d27-1328339f8fde</feedburner:origLink></item>
  </channel>
</rss>

