<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUACRX04fip7ImA9WhRXGUQ.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122</id><updated>2011-12-27T15:49:24.336+02:00</updated><category term="CWF Freeware" /><category term="packed array" /><category term="memory violation" /><category term="poem" /><category term="pitfall" /><category term="RTM_SETLINK" /><category term="C" /><category term="bitset" /><category term="RTM_GETLINK" /><category term="fixing" /><category term="segmentation fault" /><category term="overflow" /><category term="diary" /><category term="C++" /><category term="interface" /><category term="porting 32 bit to 64 bit" /><category term="virtual memory" /><category term="Nissan Primera SLX P11 -99" /><category term="MOT" /><category term="C quiz" /><category term="vlan" /><category term="RTM_DELLINK" /><category term="address" /><category term="IRC" /><category term="Bit masking" /><category term="link" /><category term="memory allocation failure" /><category term="code" /><category term="vector" /><category term="nested attribute" /><category term="car" /><category term="Cexplode" /><category term="attribute" /><category term="php" /><category term="Maz" /><category term="programming" /><category term="example" /><category term="trim" /><category term="explode()" /><category term="route" /><category term="MazBotV4" /><category term="RTM_NEWLINK" /><category term="malloc" /><category term="shared memory" /><category term="portability" /><category term="bitwise operations" /><category term="object oriented C" /><category term="Linux" /><category term="netlink" /><category term="IRCbot" /><category term="coding" /><category term="OOP" /><category term="MazPong" /><category term="answer" /><category term="porting" /><title>Programmer's diary</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://maz-programmersdiary.blogspot.com/" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/aRiDj" /><feedburner:info uri="blogspot/aridj" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C08BSXc8eCp7ImA9WhdVEE0.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-1547521390773821764</id><published>2011-09-14T14:16:00.009+03:00</published><updated>2011-09-14T15:04:18.970+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-14T15:04:18.970+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="vlan" /><category scheme="http://www.blogger.com/atom/ns#" term="RTM_SETLINK" /><category scheme="http://www.blogger.com/atom/ns#" term="netlink" /><category scheme="http://www.blogger.com/atom/ns#" term="nested attribute" /><category scheme="http://www.blogger.com/atom/ns#" term="link" /><category scheme="http://www.blogger.com/atom/ns#" term="RTM_NEWLINK" /><category scheme="http://www.blogger.com/atom/ns#" term="address" /><category scheme="http://www.blogger.com/atom/ns#" term="attribute" /><category scheme="http://www.blogger.com/atom/ns#" term="RTM_GETLINK" /><category scheme="http://www.blogger.com/atom/ns#" term="RTM_DELLINK" /><category scheme="http://www.blogger.com/atom/ns#" term="route" /><category scheme="http://www.blogger.com/atom/ns#" term="interface" /><title>Netlink sockets</title><content type="html">Recently I was requested to add IPv6 support to an existing IPv4 configuration interface written in C. The existing interface was written on top of a Linux OS, and it was used to bring up links, configure routes, attach alias addresses to interfaces, create VLAN interfaces and so on. Well, I rolled up my sleeves and begun the work. After a few hours of browsing the internet, I noticed that there really was not so much information about how to do all this. It seems to me that IPv6 is not yet so widely used. After a while I however was directed to netlink sockets. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First instructions about how to use netlink sockets, suggested using some wrapper library like libnl. However after bunch of unsuccessfull attempts I gave up with libnl (my mind was really not compatible with libnl documentation) and decided to use raw netlink sockets. Basic usage information for netlink sockets was easily avaliable. There is RFC discussing the netlink sockets, as well as man pages. However these do not seem to cover all pitfalls or usage information. In my journey to making this IPv6 interface to work I fell in more than one trap, and eventually ended up adding prints to kernel to see where the excution ended up, and where my requests were discarded...&lt;br /&gt;&lt;br /&gt;But let's start the actual business.&lt;br /&gt;&lt;br /&gt;Linux networking will be discussed in terms of links (interfaces), addresses and routes. For me these words mean something like:&lt;br /&gt;&lt;br /&gt;link (interface), for example eth0 - a door to outer world. Or eth0.2, virtual interface (VLAN interface), nevertheless seen as a door to outer world by the system.&lt;br /&gt;&lt;br /&gt;address: For example 192.168.1.77/32, or  fe80::211:43ff:fe26:2b6c/64, a label telling what is behind the door - and address of one specific door.&lt;br /&gt;&lt;br /&gt;route: for example 0.0.0.0 via dev eth0, or 10.34.143.0 255.255.255.0 gw 192.168.1.55 metric 2&lt;br /&gt;which tells the system to kick a packet out through a specific door, if destination matches to certain something.&lt;br /&gt;&lt;br /&gt;I guess I will shortly explain routes here. But before I do that, I'll mention that even though the netlink sockets are a way to configure and handle all these (well, if underlying drivers do support this - I guess they nowadays often do), they're also way more. Netlink is quite generic interface to exchange information between kernel and userspace. I know at least firewalls and neighbor cache can be managed via netlink interface on linux. However we concentrate on links, addresses and routes here.&lt;br /&gt;&lt;br /&gt;Now, if we look at the previous route examples.&lt;br /&gt;&lt;br /&gt;route 1 was format &lt;i&gt;0.0.0.0 via dev eth0&lt;/i&gt;&lt;br /&gt;destination 0.0.0.0 (special, 'any' ip - means this is a default route, and all packacges for which we do not have better routing information will use this route.)&lt;br /&gt;dev eth0 specifies interface in which this package should be directed.&lt;br /&gt;&lt;br /&gt;route 2 was &lt;i&gt;10.34.143.0 255.255.255.0 gw 192.168.1.55 metric 2&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;destination 10.34.143.0&lt;br /&gt;mask 255.255.255.0&lt;br /&gt;&lt;br /&gt;This tells us that if package is destined to address 10.34.143.xx, then this route is selected. The mask information tells which bits of the destination address are meaningfull. Eg, all bits which are not zero in mask, will be meaningfull. destination/mask pair&lt;br /&gt;192.168.254.0&lt;br /&gt;255.255.254.0&lt;br /&gt;would mean that packets targeted to 255.255.254.xx or 255.255.255.xx would go to this route. Another way to express this is using format  &amp;lt; address &amp;gt; / &amp;lt; amout of meaningfull bits &amp;gt; &lt;br /&gt;&lt;br /&gt;destination 10.34.143.0&lt;br /&gt;mask 255.255.255.0&lt;br /&gt;&lt;br /&gt;could be shown as &lt;br /&gt;10.34.143.0/24 (mask 255.255.255.0 has 24 meaningfull bits since each 0-255 value occupies 8 bits. Thus 255.255.255 is 8+8+8 = 24)&lt;br /&gt;&lt;br /&gt;gw means gateway. This is something like saying that the specified destinations are located behind a machine which address is xx.&lt;br /&gt;Eg, saying that send these packets to gw machine, it knows where they should be redirected. Hence all packets going to this route will be first delivered to 192.168.1.55. &lt;br /&gt;&lt;br /&gt;Metric 2... Metric is a way for us to define routes which are overlapping. Eg, if we have two routes, which' destinations would match, then we use &lt;br /&gt;1. route with more accurate mask (Eg, if we specify route with mask 255.255.255.255 == host route, saying that destination address is exact, then this route will be preferred over routes with looser mask).&lt;br /&gt;2. Route with smaller metric value.&lt;br /&gt;&lt;br /&gt;With IPv6 the routing gets a bit more complicated, since some of the subnet information is built into addresses. I won't get into that now, hopefully you know what you're doing :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So let's see. The netlink socket interface is typical socket interface. Eg, we send messages to socket, and receive replies from socket. We can also register for receiving reports from interesting events, and receive messages informing the changes. I however only show the typical send request = &amp;gt;  receive responce sequences.&lt;br /&gt;&lt;br /&gt;As mentioned, requests are divided to link, address and route requests. (families). And each of these have request types of&lt;br /&gt;&lt;br /&gt;creating new  &amp;lt; address/interface/route &amp;gt; &lt;br /&gt;deleting old  &amp;lt; address/interface/route &amp;gt; &lt;br /&gt;getting information about existing  &amp;lt; address/interface/route &amp;gt; &lt;br /&gt;&lt;br /&gt;Exact defines (which also need to be filled in request) are:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;br /&gt;RTM_NEWADDR&lt;br /&gt;RTM_DELADDR,&lt;br /&gt;RTM_GETADDR,&lt;br /&gt;&lt;br /&gt;RTM_NEWROUTE&lt;br /&gt;RTM_DELROUTE,&lt;br /&gt;RTM_GETROUTE,&lt;br /&gt;&lt;br /&gt;RTM_NEWLINK&lt;br /&gt;RTM_DELLINK&lt;br /&gt;RTM_GETLINK,&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;for links there also &lt;br /&gt;&lt;i&gt;&lt;br /&gt;RTM_SETLINK,&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;which need to be used to change existing link's attributes. NEWLINK requests with these attributes will be discarded (for me understanding this required adding prints to kernel...)&lt;br /&gt; &lt;br /&gt;Actual request consist of:&lt;br /&gt;&lt;br /&gt;1. message header type struct msghdr. I assume you're familiar with this standard message header.&lt;br /&gt;2. netlink message header type struct nlmsghdr&lt;br /&gt;3. request family specific header (struct ifaddrmsg /  struct ifinfomsg / struct rtmsg)&lt;br /&gt;4. set of family specific attributes&lt;br /&gt;&lt;br /&gt;Netlink message header &lt;br /&gt;&lt;i&gt;&lt;br /&gt;struct nlmsghdr&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   nlmsg_len;  /* Length of message including header */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   nlmsg_type; /* Message content */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   nlmsg_flags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Additional flags */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   nlmsg_seq;  /* Sequence number */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   nlmsg_pid;  /* Sending process port ID */&lt;br /&gt;};&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;carries information necessary for &lt;br /&gt;1. knowning the lenght of the message.&lt;br /&gt;2. telling the type of the message (family)&lt;br /&gt;3. flags telling how message should be handled - directly from /usr/include/linux/netlink.&lt;br /&gt;&lt;i&gt;&lt;br /&gt;  /* Flags values */&lt;br /&gt;&lt;br /&gt;NLM_F_REQUEST        /* It is request message.   */&lt;br /&gt;NLM_F_MULTI        /* Multipart message, terminated by NLMSG_DONE */&lt;br /&gt;NLM_F_ACK          /* Reply with ack, with zero or error code */&lt;br /&gt;NLM_F_ECHO         /* Echo this request        */&lt;br /&gt;&lt;br /&gt;/* Modifiers to GET request */&lt;br /&gt;NLM_F_ROOT     /* specify tree root    */&lt;br /&gt;NLM_F_MATCH    /* return all matching  */&lt;br /&gt;NLM_F_ATOMIC       /* atomic GET       */&lt;br /&gt;NLM_F_DUMP  &lt;br /&gt;&lt;br /&gt;/* Modifiers to NEW request */&lt;br /&gt;NLM_F_REPLACE      /* Override existing        */&lt;br /&gt;NLM_F_EXCL     /* Do not touch, if it exists   */&lt;br /&gt;NLM_F_CREATE       /* Create, if it does not exist */&lt;br /&gt;NLM_F_APPEND       /* Add to end of list       */&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;for example every request should contain flag &lt;br /&gt;NLM_F_REQUEST. Note that NLM_F_MATCH is propably not implemented, and you will get all routes/links/addresses that are specified - regardless the attributes / values in family specific struct. Flags are more accurately introduced for example in man pages.&lt;br /&gt;&lt;br /&gt;3&amp;4. identifying the request/responce pair. Typicaly you should set pid to something derived from process/thread id. I use &lt;br /&gt;(pthread_self() &amp;lt;  &amp;lt; 16|getpid()); &lt;br /&gt;Kernel's responces have pid set to 0. &lt;br /&gt;&lt;br /&gt;You should propably use different sequence number for each request - that way you can associate correct responces with correct requests. I usually have global variable, and issue atomic incrementation operation to it when getting new sequence ID.&lt;br /&gt;&lt;br /&gt;I also like to know if my request succeeded. Thus I always use NLM_F_ACK in other but GET requests. This will make kernel to send us reply with zero errorcode if requested operation succeeded. With GET requests I can expect getting reply anyways.&lt;br /&gt;&lt;br /&gt;(The kernel's ACK message for successfull operation with NLM_F_ACK flag will be like:&lt;br /&gt;&lt;br /&gt;struct nlmsghdr followed by struct nlmsgerr&lt;br /&gt;where nlmsg_type == NLMSG_ERROR and error member of struct nlmsgerr is set to 0.&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Family specific structs follow after the nlmsghdr. They're form:&lt;br /&gt;&lt;br /&gt;Addresses:&lt;br /&gt;struct ifaddrmsg &lt;br /&gt;&lt;i&gt;&lt;br /&gt;struct ifaddrmsg&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifa_family;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifa_prefixlen;  /* The prefix length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifa_flags;  /* Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifa_scope;  /* Address scope&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__u32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   ifa_index;  /* Link index&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   */&lt;br /&gt;};&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Family being address family (typically AF_INET / AF_INET6)&lt;br /&gt;prefixlen telling the mask bits. (see explanation of mask in routes above. This is used when we for example add new ip-address to existing interface - so called alias IP address. Then the mask tells what network lies behind the door for outgoing packets!)&lt;br /&gt;flags &lt;br /&gt;&lt;i&gt;&lt;br /&gt;/* ifa_flags */&lt;br /&gt; IFA_F_SECONDARY    &lt;br /&gt; IFA_F_TEMPORARY   &lt;br /&gt;&lt;br /&gt; IFA_F_NODAD    &lt;br /&gt; IFA_F_OPTIMISTIC   &lt;br /&gt; IFA_F_DADFAILED     &lt;br /&gt; IFA_F_HOMEADDRESS  &lt;br /&gt; IFA_F_DEPRECATED    &lt;br /&gt; IFA_F_TENTATIVE     &lt;br /&gt; IFA_F_PERMANENT     &lt;br /&gt;&lt;/i&gt;&lt;br /&gt;whose meanings are quite unknown for me - I haven't really needed any of these.&lt;br /&gt;&lt;br /&gt;ifa_scope&lt;br /&gt;I've successfully used 0 as scope for all requests - I have no idea what the scope really is with addresses.&lt;br /&gt;&lt;br /&gt;ifa_index (index number of the interface this address is bound, see man pages for &lt;br /&gt;unsigned if_nametoindex(const char *ifname);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;links(interfaces)&lt;br /&gt;struct ifinfomsg &lt;br /&gt;&lt;i&gt;&lt;br /&gt;struct ifinfomsg&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char   ifi_family;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char   __ifi_pad;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short  ifi_type;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* ARPHRD_* */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ifi_index;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  /* Link index   */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifi_flags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  /* IFF_* flags  */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifi_change;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* IFF_* change mask */&lt;br /&gt;};&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;When I created new link (in order to do a VLAN interface - that was the only thing I used NEWLINK request for), I at first banged my head to wall by creating RTM_NEWLINK request, where ifinfomsg struct had fields filled... I always received error responces from kernel. When I finally compiled my own kernel, with lots of info prints included, I learned that the ifinfomsg struct should not contain much of values with NEWLINK request - or request would be discarded.  Then I only filled ifi_change field with 0xffffffff and left rest of the fields to zero. Then I added attributes which specified the link to be VLAN interface. I'll show the attributes for requests later... This allowed me to create a new link. &lt;br /&gt;&lt;br /&gt;After link was created, I used RTM_SETLINK request to set the link state to IFF_UP. For this step I filled ifi_index with index of newly created interface, and set flags to contain IFF_UP bit. ifi_change should still be 0xffffffff (at least according to man pages), since it is reserved for future use. I was lazy. I simply set the ifi_flags to be IFF_UP. I guess this approach may be hazardous (not sure though). It may be the interface has some other flags set up, and simply setting flags to be IFF_UP without knowing the original state may make us to lose some information. I do not know since I have not studied these flags so thoroughly. I just guess that better way could be first reading the flags, and then or (|) the IFF_UP with existing bits. However I guess making this so, that possible state changes between reading and setting the flags would be noticed - is hard. I just decided that there is no flags which I could accidentally zero... It is easier to not know ;)&lt;br /&gt;&lt;br /&gt;routes&lt;br /&gt;struct rtmsg&lt;br /&gt;&lt;i&gt;&lt;br /&gt;struct rtmsg&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_family;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_dst_len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_src_len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_tos;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_table;  /* Routing table id */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_protocol;   /* Routing protocol; see below  */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_scope;  /* See below */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   rtm_type;   /* See below&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rtm_flags;&lt;br /&gt;};&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;where types can be&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;    RTN_UNSPEC,&lt;br /&gt;    RTN_UNICAST,        /* Gateway or direct route  */&lt;br /&gt;    RTN_LOCAL,      /* Accept locally       */&lt;br /&gt;    RTN_BROADCAST,      /* Accept locally as broadcast,&lt;br /&gt;                   send as broadcast */&lt;br /&gt;    RTN_ANYCAST,        /* Accept locally as broadcast,&lt;br /&gt;                   but send as unicast */&lt;br /&gt;    RTN_MULTICAST,      /* Multicast route      */&lt;br /&gt;    RTN_BLACKHOLE,      /* Drop             */&lt;br /&gt;    RTN_UNREACHABLE,    /* Destination is unreachable   */&lt;br /&gt;    RTN_PROHIBIT,       /* Administratively prohibited  */&lt;br /&gt;    RTN_THROW,      /* Not in this table        */&lt;br /&gt;    RTN_NAT,        /* Translate this address   */&lt;br /&gt;    RTN_XRESOLVE,       /* Use external resolver    */&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;For normal routes you propably want to use RTN_UNICAST. Although knowing the amount of spam flowing through  the ethernet wires... Well, I feel the RTN_BLACKHOLE is tempting ;)&lt;br /&gt;&lt;br /&gt;defined protocols:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;#define RTPROT_UNSPEC   0&lt;br /&gt;#define RTPROT_REDIRECT 1   /* Route installed by ICMP redirects;&lt;br /&gt;                   not used by current IPv4 */&lt;br /&gt;#define RTPROT_KERNEL   2   /* Route installed by kernel        */&lt;br /&gt;#define RTPROT_BOOT 3   /* Route installed during boot      */&lt;br /&gt;#define RTPROT_STATIC   4   /* Route installed by administrator */&lt;br /&gt;&lt;br /&gt;/* Values of protocol  &amp;gt; = RTPROT_STATIC are not interpreted by kernel;&lt;br /&gt;   they are just passed from user and back as is.&lt;br /&gt;   It will be used by hypothetical multiple routing daemons.&lt;br /&gt;   Note that protocol values should be standardized in order to&lt;br /&gt;   avoid conflicts.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#define RTPROT_GATED    8   /* Apparently, GateD */&lt;br /&gt;#define RTPROT_RA   9   /* RDISC/ND router advertisements */&lt;br /&gt;#define RTPROT_MRT  10  /* Merit MRT */&lt;br /&gt;#define RTPROT_ZEBRA    11  /* Zebra */&lt;br /&gt;#define RTPROT_BIRD 12  /* BIRD */&lt;br /&gt;#define RTPROT_DNROUTED 13  /* DECnet routing daemon */&lt;br /&gt;#define RTPROT_XORP 14  /* XORP */&lt;br /&gt;#define RTPROT_NTK  15  /* Netsukuku */&lt;br /&gt;#define RTPROT_DHCP 16      /* DHCP client */&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I used RTPROT_STATIC, which corresponds the situation where user adds a route using "ip route add" command.&lt;br /&gt;&lt;br /&gt;possible scopes:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;    RT_SCOPE_UNIVERSE=0,&lt;br /&gt;/* User defined values  */&lt;br /&gt;    RT_SCOPE_SITE=200,&lt;br /&gt;    RT_SCOPE_LINK=253,&lt;br /&gt;    RT_SCOPE_HOST=254,&lt;br /&gt;    RT_SCOPE_NOWHERE=255&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Well, for route which is not meant to stay inside some known system, it is feasible to use RT_SCOPE_UNIVERSE.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;/* rtm_flags */&lt;br /&gt;&lt;br /&gt;#define RTM_F_NOTIFY        0x100   /* Notify user of route change  */&lt;br /&gt;#define RTM_F_CLONED        0x200   /* This route is cloned     */&lt;br /&gt;#define RTM_F_EQUALIZE      0x400   /* Multipath equalizer: NI  */&lt;br /&gt;#define RTM_F_PREFIX        0x800   /* Prefix addresses     */&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;I used no flags, eg set the flags to zero.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So at this spot, our request consists of netlink header telling the type of our request (address, link or route) and the type specific structure behind this netlink header. Now, so that it wouldn't be so simple, we'll introduce some more dynamic data :]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;attributes&lt;br /&gt;&lt;br /&gt;Each request supports variable amount of attributes which will further describe the address/route/interface being created (changed/deleted). Attributes are data prepended with struct rtattr structure. It looks like:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;struct rtattr&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short  rta_len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short  rta_type;&lt;br /&gt;};&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;After this structure we have actual attribute data, which of course depends on rta_type, and has lenght &lt;br /&gt;rta_len - sizeof(struct rtattr). Aligned to 4 bytes :]&lt;br /&gt;&lt;br /&gt;Well, as a C coder can imagine, this level of dynamic structures can be quite challenging to handle. And as can be guessed, there is macros written to ease the attribute handling. (I also wrote simpe functions to add attributes to the request.)&lt;br /&gt;&lt;br /&gt;Macros to handle all this are:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;RTA_ALIGN(len)&lt;br /&gt;RTA_OK(rta,len)&lt;br /&gt;RTA_NEXT(rta,attrlen)&lt;br /&gt;RTA_LENGTH(len)&lt;br /&gt;RTA_DATA(rta)&lt;br /&gt;RTA_PAYLOAD(rta)&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;RTA_ALIGN(len) Rounds the given lenght to next alignment boundary. Eg. with typical 4 byte alignment&lt;br /&gt;&lt;br /&gt;RTA_ALIGN(1) would return 4 as would RTA_ALIGN(4). RTA_ALIGN(5) would return 8 and so on.&lt;br /&gt;RTA_OK(rta,len) can be used to see if the attribute is Ok. It is quite common to use RTA_NEXT with RTA_OK to parse incoming messages. Eg, with RTA_NEXT we get the next attribute, and with RTA_OK we check attribute is ok to be inspected. len passed to these macros is originally the lenght of attribute buffer. Each call to RTA_NEXT shall update the lenght.&lt;br /&gt;RTA_LENGHT(len) returns the lenght which is required to store attribute which data is len bytes. Eg, RTA_LENGHT adds the lenght of rtattr header to the lenght of the data, and adds required padding bytes to get the data correctly aligned.&lt;br /&gt;RTA_DATA(rta) returns pointer to the beginning of the data in attribute rta.&lt;br /&gt;RTA_PAYLOAD(rta) returns the lenght of the data payload in attribute.&lt;br /&gt;&lt;br /&gt;Sounds confusing? Well, don't be worried. I'll later show you a few functions to handle the attributes...&lt;br /&gt;&lt;br /&gt;Now we can get to the confusing point...&lt;br /&gt;With VLAN interface creation I hit my head to wall. I did some googling. Then I googled more. Finally I had googled my *** off. "VLAN interface netlink sockets", "RTM_NEWLINK VLAN". "Create VLAN via netlink". "VLAN netlink attribute". It basically took all my googling skills, as well as jump into kernel sources to finally find it. What kind of magical attribute allows one to specify VLAN interface. Google gave me some hints that such an attribute exists, and finally I found it...&lt;br /&gt;&lt;br /&gt;nested attributes. Nested attributes are attributes, which have attributes inside. That's it. One of the attributes to create a VLAN interface is one of these. But I'll show that later.&lt;br /&gt;&lt;br /&gt;Attributes supported by different families are:&lt;br /&gt;&lt;br /&gt;Addresses:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;    IFA_UNSPEC,&lt;br /&gt;    IFA_ADDRESS,&lt;br /&gt;    IFA_LOCAL,&lt;br /&gt;    IFA_LABEL,&lt;br /&gt;    IFA_BROADCAST,&lt;br /&gt;    IFA_ANYCAST,&lt;br /&gt;    IFA_CACHEINFO,&lt;br /&gt;    IFA_MULTICAST,&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Routes:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;    RTA_UNSPEC,&lt;br /&gt;    RTA_DST,&lt;br /&gt;    RTA_SRC,&lt;br /&gt;    RTA_IIF,&lt;br /&gt;    RTA_OIF,&lt;br /&gt;    RTA_GATEWAY,&lt;br /&gt;    RTA_PRIORITY,&lt;br /&gt;    RTA_PREFSRC,&lt;br /&gt;    RTA_METRICS,&lt;br /&gt;    RTA_MULTIPATH,&lt;br /&gt;    RTA_PROTOINFO, /* no longer used */&lt;br /&gt;    RTA_FLOW,&lt;br /&gt;    RTA_CACHEINFO,&lt;br /&gt;    RTA_SESSION, /* no longer used */&lt;br /&gt;    RTA_MP_ALGO, /* no longer used */&lt;br /&gt;    RTA_TABLE,&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Interfaces (links):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;    IFLA_UNSPEC,&lt;br /&gt;    IFLA_ADDRESS,&lt;br /&gt;    IFLA_BROADCAST,&lt;br /&gt;    IFLA_IFNAME,&lt;br /&gt;    IFLA_MTU,&lt;br /&gt;    IFLA_LINK,&lt;br /&gt;    IFLA_QDISC,&lt;br /&gt;    IFLA_STATS,&lt;br /&gt;    IFLA_COST,&lt;br /&gt;    IFLA_COST&lt;br /&gt;    IFLA_PRIORITY,&lt;br /&gt;    IFLA_PRIORITY&lt;br /&gt;    IFLA_MASTER,&lt;br /&gt;    IFLA_MASTER&lt;br /&gt;    IFLA_WIRELESS,      /* Wireless Extension event - see wireless.h */&lt;br /&gt;    IFLA_WIRELESS&lt;br /&gt;    IFLA_PROTINFO,      /* Protocol specific information for a link */&lt;br /&gt;    IFLA_PROTINFO&lt;br /&gt;    IFLA_TXQLEN,&lt;br /&gt;    IFLA_TXQLEN&lt;br /&gt;    IFLA_MAP,&lt;br /&gt;    IFLA_MAP&lt;br /&gt;    IFLA_WEIGHT,&lt;br /&gt;    IFLA_WEIGHT&lt;br /&gt;    IFLA_OPERSTATE,&lt;br /&gt;    IFLA_LINKMODE,&lt;br /&gt;    IFLA_LINKINFO,&lt;br /&gt;    IFLA_LINKINFO&lt;br /&gt;    IFLA_NET_NS_PID,&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Some of these attributes are documented in rtnetlink man pages at man section 7 - some aren't...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now just to ease the pain for those who struggle with the VLAN interface setup... I managed to do it with following attributes:&lt;br /&gt;&lt;br /&gt;IFLA_LINK, data size of int, contains the real interface which this VLAN interface uses beneath.&lt;br /&gt;IFLA_IFNAME, name of the new VLAN interface, lenght depends on lenght of the name you give. I used naming convention  &amp;lt; original_interface &amp;gt; . &amp;lt; vlan Id &amp;gt; &lt;br /&gt;&lt;br /&gt;nested attribute IFLA_LINKINFO, containing:&lt;br /&gt;    attribute IFLA_INFO_KIND, data is string 'vlan', lenght being the lenght of the string + padding.&lt;br /&gt;    another nested attribute IFLA_INFO_DATA, containing:&lt;br /&gt;        attribute IFLA_VLAN_ID, which data is the vlan id.&lt;br /&gt;&lt;br /&gt;Uh oh... Sounds confusing, right? Nested attribute containing an attribute and another nested attribute which contains an attribute... Oh joy, occasionally I tend to believe that programmers have been REALLY drunk when getting their ideas... (http://xkcd.com/323/)&lt;br /&gt;&lt;br /&gt;Anyways, I'll show you the code which I used to handle this:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;#define NLMSG_BOTTOM(nlmsg) ((struct rtattr *)(((void *)(nlmsg)) + NLMSG_ALIGN((nlmsg)- &amp;gt; nlmsg_len)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static int addAttr(struct nlmsghdr *nl_req, int attrlabel, const void *data, int datalen)&lt;br /&gt;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct rtattr *attr=NLMSG_BOTTOM(nl_req));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int attrlen=RTA_LENGTH(datalen); /* sizeof(struct rtattr) + datalen + align */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(NULL==nl_req || (datalen &amp;gt; 0 &amp;&amp; NULL==data))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("NULL arg detected!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attr- &amp;gt; rta_type=attrlabel;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attr- &amp;gt; rta_len=attrlen;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(RTA_DATA(attr),data,datalen);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nl_req- &amp;gt; nlmsg_len=NLMSG_ALIGN(nl_req- &amp;gt; nlmsg_len)+RTA_ALIGN(attrlen);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static struct rtattr * addNestedAttr(struct nlmsghdr *nl_req, int attrlabel)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct rtattr *nested = NLMSG_BOTTOM(nl_req);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!addAttr(nl_req, attrlabel, NULL, 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nested;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void endNestedAttr(struct nlmsghdr *nl_req, struct rtattr *nested)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nested- &amp;gt; rta_len = (void *)NLMSG_BOTTOM(nl_req) - (void *)nested;&lt;br /&gt;}&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;/* ...snip - Add attributes to the nlmsg msg */&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct rtattr *attr1, *attr2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(addAttr(msg,IFLA_LINK,&amp;orig_ifindex,sizeof(int)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("IFLA_LINK %d adding as rtattr to req failed!",orig_ifindex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(addAttr(msg,IFLA_IFNAME,ifname,strlen(ifname)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("IFLA_IFNAME  %s adding as rtattr to req failed!",ifname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(NULL==(attr1=addNestedAttr(msg,IFLA_LINKINFO)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("addNestedAttr IFLA_LINKINFO FAILED!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(addAttr(msg,IFLA_INFO_KIND,"vlan", strlen("vlan")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("IFLA_INFO_KIND \"vlan\" adding FAILED!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   retval=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(NULL==(attr2=addNestedAttr(msg,IFLA_INFO_DATA)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("addNestedAttr IFLA_INFO_DATA FAILED!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(addAttr(msg,IFLA_VLAN_ID,&amp;vlanid,sizeof(unsigned short)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("IFLA_VLAN_ID  %hu adding as rtattr to req failed!",vlanid);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endNestedAttr(msg,attr2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endNestedAttr(msg,attr1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("VLAN ID %hu, orig ifindex %d and new ifname %s added as attrs",vlanid,orig_ifindex,ifname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This code assumes that the lenght of the nlmsg (in struct nlmsghdr) is summed up during message creation. Eg, that when the attributes are added, the lenght in nlmsghdr is updated to be the lenght of message constructed this far. Attribute addition relies upon this lenght, when adding new attributes &amp;&amp; updates this lenght when attributes are added. (see the macro NLMSG_BOTTOM() )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now I guess I am approaching the end of this short introduction. I'll however show you something from where you can get the idea of how messages are sent and received, and how attributes can be parsed. In order to sum up the full horror of this interface (dynamic = &amp;gt;  flexible and generic = &amp;gt;  terribly hard to use) I have to mention something about receiving the messages...&lt;br /&gt;&lt;br /&gt;Messages will arrive from socket the socket. They will be placed in buffer you gave. You need to be prepared to handle:&lt;br /&gt;&lt;br /&gt;1. reply where you have specified to short buffer = &amp;gt;  you'll get reply with MSG_TRUNC bit set.&lt;br /&gt;2. Reply where you have multiple nlmsgs in one received buffer. In that case, there's NLM_F_MULTI flag set. In that case last message shall have NLM_F_DONE set.&lt;br /&gt;&lt;br /&gt;Eg. You may end up having a buffer, where you have variable amount of nlmsgs, wach containing different sized/type struct and variable amount of possibly nested attributes after that... Some (pseudo)code as an example...&lt;br /&gt;&lt;i&gt;&lt;br /&gt;struct sockaddr_nl kernproc;&lt;br /&gt;struct msghdr msg;&lt;br /&gt;struct nlmsghdr *netlinkresp;&lt;br /&gt;struct iovec iov;&lt;br /&gt;&lt;br /&gt;memset(&amp;msg,0,sizeof(msg));&lt;br /&gt;&lt;br /&gt;memset(&amp;kernproc,0,sizeof(kernproc));&lt;br /&gt;memset(&amp;iov,0,sizeof(iov));&lt;br /&gt;&lt;br /&gt;kernproc.nl_family = AF_NETLINK;&lt;br /&gt;&lt;br /&gt;msg.msg_name=(void *)&amp;kernproc;&lt;br /&gt;msg.msg_namelen=sizeof(kernproc);&lt;br /&gt;&lt;br /&gt;netlinkresp= &amp;lt; buffer allocated for responce &amp;gt; ;&lt;br /&gt;&lt;br /&gt;/* Add NLMSG_F_ACK if no reply is to be expected othervice */&lt;br /&gt;&lt;br /&gt;iov.iov_base=(void *)netlinkresp;&lt;br /&gt;iov.iov_len= &amp;lt; nlmsg_len &amp;gt; ;&lt;br /&gt;&lt;br /&gt;msg.msg_iov=&amp;iov;&lt;br /&gt;msg.msg_iovlen = 1; /* only one iov struct abowe */&lt;br /&gt;iov.iov_len= &amp;lt; size of the resp buffer &amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;retry:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval=recvmsg(sock, &amp;msg, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(0 &amp;gt; =retval)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(errno==EINTR)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto retry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("Error when receiving from netlink sock!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* handle error */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* ...reply received */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So &lt;br /&gt;1. Check lenght of received message from return value of recv. Never exeed it.&lt;br /&gt;2. Check the msghdr (not nlmsghdr) to see the message was not truncated.&lt;br /&gt;    if(msg.msg_flags&amp;MSG_TRUNC)&lt;br /&gt;       ... allocate more space for resp and retry...&lt;br /&gt;3. strore pointer to the nlmsghdr message header. &lt;br /&gt;4. start a loop and use NLMSG_OK() to see message is ok. If msg is not OK, then you have nothing to handle.&lt;br /&gt;5. Check the type of nlmsg, and lenght. If lenght is greater or equal to type specific header, then use&lt;br /&gt;NLMSG_DATA to get the actual message. Cast and store a pointer to this.&lt;br /&gt;5. Check the received message for information you longed for. If whole nlmsg lenght is still not handled, then there probably are attributes.&lt;br /&gt;6. Obtain ptr to first attribute by adding size of message specific struct to the NLMSG_DATA().&lt;br /&gt;7. start a loop and check the attribute with RTA_OK() If RTA_OK fails go to step 9&lt;br /&gt;8. check attribute type, and data according to type &amp; len.&lt;br /&gt;obtain next attr with RTA_NEXT - &amp;gt;  end loop and go back to step 7.&lt;br /&gt;9. when last attribute is handled, check if NLMSG had NLM_F_MULTI set, and at least not NLMSG_DONE was specified, then get next NLMSG with NLMSG_NEXT() and loop again from step 4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sending a message is done using same generic iovec mechanism. Eg:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct sockaddr_nl kernproc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct msghdr msg;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct nlmsghdr *netlinkreq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct iovec iov;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;msg,0,sizeof(msg));this- &amp;gt; mypid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;kernproc,0,sizeof(kernproc));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(&amp;iov,0,sizeof(iov));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kernproc.nl_family = AF_NETLINK;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.msg_name=(void *)&amp;kernproc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.msg_namelen=sizeof(kernproc);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq= &amp;lt; pointer to allocated and filled message request &amp;gt; ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_pid= (pthread_self() &amp;lt;  &amp;lt; 16|getpid());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_seq= atomicallyIncrementSeqId(seqid);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#ifdef debug&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;debugprint_msg(netlinkreq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endif&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iov.iov_base=(void *)netlinkreq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iov.iov_len=netlinkreq- &amp;gt; nlmsg_len;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.msg_iov=&amp;iov;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg.msg_iovlen = 1; /* only one iov struct abowe */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retval =sendmsg(sock,&amp;msg,0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(retval &amp;lt; =0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("sendmsg() FAILED!");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return retval;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;the debugprint function I have used contains following code:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(netlinkreq- &amp;gt; nlmsg_flags &amp; NLM_F_ACK)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("Msg contains f_ack!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!NLMSG_OK(netlinkreq,netlinkreq- &amp;gt; nlmsg_len))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("Looks like we're sending invalid nlmsg!! NLMSG_OK() == false at send!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"sending NLMSG: len %u, type %hu, flags %hu, seq %u pid %u",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_len,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_type,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_flags,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_seq,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;netlinkreq- &amp;gt; nlmsg_pid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(netlinkreq- &amp;gt; nlmsg_type)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTM_NEWROUTE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTM_DELROUTE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTM_GETROUTE:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Req is route req (new %u, del %u, get %u)",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTM_NEWROUTE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTM_DELROUTE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTM_GETROUTE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"family %u, dstlen %u, srclen %u, tos %u, table %u, proto %u, scope %u, type %u, flags %u",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_family,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_dst_len,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_src_len,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_tos,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_table,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_protocol,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_scope,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_type,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct rtmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; rtm_flags&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int len=netlinkreq- &amp;gt; nlmsg_len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct rtattr *at=(struct rtattr *)((char *)NLMSG_DATA(netlinkreq)+sizeof(struct rtmsg));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(NULL!=at &amp;&amp; RTA_OK(at,len))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char tmp[100];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(at- &amp;gt; rta_type)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTA_DST:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"dst is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTA_SRC:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"src is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTA_GATEWAY:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"gw is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTA_OIF:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"OIF is set to %u",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*(unsigned int *)RTA_DATA(at)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTA_PRIORITY:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Priority is set to %u",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*(unsigned int *)RTA_DATA(at)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("rta_type %u, len %u",at- &amp;gt; rta_type,at- &amp;gt; rta_len);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at=RTA_NEXT(at,len);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTM_NEWADDR:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTM_GETADDR:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case RTM_DELADDR:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Req is ADDR req (new %u, del %u, get %u)",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTM_NEWADDR,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTM_DELADDR,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTM_GETADDR&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"ifa_family %u, ifa_prefixlen %u, ifa_flags %u, ifa_scope %u, ifa_index %d",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct ifaddrmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; ifa_family,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct ifaddrmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; ifa_prefixlen,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct ifaddrmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; ifa_flags,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unsigned int)((struct ifaddrmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; ifa_scope,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(int)((struct ifaddrmsg *) NLMSG_DATA(netlinkreq) )- &amp;gt; ifa_index&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int len=netlinkreq- &amp;gt; nlmsg_len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct rtattr *at=(struct rtattr *)((char *)NLMSG_DATA(netlinkreq)+sizeof(struct ifaddrmsg));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(NULL!=at &amp;&amp; RTA_OK(at,len))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char tmp[100];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(at- &amp;gt; rta_type)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case IFA_ADDRESS:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"IFA_ADDRESS is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case IFA_LOCAL:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"IFA_LOCAL is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case IFA_BROADCAST:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"IFA_BROADCAST is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case IFA_LABEL:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"IFA_LABEL is set to '%s'",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(char *)RTA_DATA(at)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case IFA_ANYCAST:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"IFA_ANYCAST is set to %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inet_ntop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(at- &amp;gt; rta_len &amp;gt; 8)?AF_INET6:AF_INET,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RTA_DATA(at),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("rta_type %u, len %u",at- &amp;gt; rta_type,at- &amp;gt; rta_len);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at=RTA_NEXT(at,len);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;.&lt;br /&gt;./* You could add other type of requests here too */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;There you see how browsing through one message contents can be done. One loop more with some extra checks, and NLMSG_NEXT and NLMSG_OK macros would allow you to go through received nlmsgs. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyways, I guess I can end my brief introduction to netlink sockets here. Remeber to check the &lt;br /&gt;man 7 rtnetlink and man 3 netlink for more information. Here is just some pieces like nested attributes and VLAN interface setup explained... Maybe you do not need to bang your head to wall just as much as I had to do. :]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oh, and if you find this post or the code examples usefull, please do leave me a note :) And as allways, code presented here can be used/modified to suit your purposes, as long as you either drop me a note in Mazziesaccount@gmail.com or comment in here, and mention original author (me, Maz) &amp;&amp; this site in your codes - especially if you publish them to be public somewhere.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-1547521390773821764?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VUIMFzv6Io1PRBLFZwjyM7rz1NM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VUIMFzv6Io1PRBLFZwjyM7rz1NM/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/VUIMFzv6Io1PRBLFZwjyM7rz1NM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VUIMFzv6Io1PRBLFZwjyM7rz1NM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/flDgICEaw2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/1547521390773821764/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2011/09/netlink-sockets.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/1547521390773821764?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/1547521390773821764?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/flDgICEaw2s/netlink-sockets.html" title="Netlink sockets" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2011/09/netlink-sockets.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMDSHw_fip7ImA9WhdWGUw.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-967231936245121709</id><published>2010-07-07T10:52:00.004+03:00</published><updated>2011-09-13T14:47:59.246+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-13T14:47:59.246+03:00</app:edited><title>Download links in this blog.</title><content type="html">Hi dee Ho again!&lt;br /&gt;&lt;br /&gt;Times change. I iced my bot project (lack of time etc. etc...). The svn repository which is often referred here got shot down. The latest sources should still be available at&lt;br /&gt;&lt;br /&gt;http://xp-dev.com/svn/MazBotV4/trunk/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hi dee Ho peeps!&lt;br /&gt;&lt;br /&gt;I have often given you a link to svn repository which is locadted on blackdiam.net/svn. Many of the sources for my C stuff are located there.&lt;br /&gt;&lt;br /&gt;I did some refactoring in the repository, and most of the links got dated. If you encounter non working link to blackdiam.net svn repository in this blog, following corrective actions can be done:&lt;br /&gt;&lt;br /&gt;Old link to dev repo base was:&lt;br /&gt;http://blackdiam.net/svn/MazBot/&lt;br /&gt;&lt;br /&gt;New link to dev repo base is&lt;br /&gt;http://blackdiam.net/svn/MazBot/trunc/&lt;br /&gt;And more stable environment is in&lt;br /&gt;http://blackdiam.net/svn/MazBot/releases/0.2.1/&lt;br /&gt;&lt;br /&gt;Hopefully you find what you're looking for :)&lt;br /&gt;&lt;br /&gt;-Maz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-967231936245121709?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EsGK9294E7CUDMHNA7rigw_bFqE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EsGK9294E7CUDMHNA7rigw_bFqE/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/EsGK9294E7CUDMHNA7rigw_bFqE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EsGK9294E7CUDMHNA7rigw_bFqE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/YTXmVqSr6KA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/967231936245121709/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2010/07/download-links-in-this-blog.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/967231936245121709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/967231936245121709?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/YTXmVqSr6KA/download-links-in-this-blog.html" title="Download links in this blog." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2010/07/download-links-in-this-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QCSH8zeip7ImA9WhdVEEQ.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-6349738026102267361</id><published>2010-06-29T16:49:00.005+03:00</published><updated>2011-09-15T15:56:09.182+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-15T15:56:09.182+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="packed array" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="bitset" /><category scheme="http://www.blogger.com/atom/ns#" term="MazBotV4" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><title>More tools to write better C</title><content type="html">EDIT: 15.09.2011 Another SVN working now. Sources can be found from&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xp-dev.com/svn/MazBotV4/trunk/"&gt;http://xp-dev.com/svn/MazBotV4/trunk/generic/src/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;files:&lt;br /&gt;&lt;br /&gt;MbotBitset.c&lt;br /&gt;MbotBitset.h&lt;br /&gt;MbotPackedArray.c&lt;br /&gt;MbotPackedArray.h&lt;br /&gt;&lt;br /&gt;are covered here.&lt;br /&gt;&lt;br /&gt;Oh my oh my. It has been ages since I last annoyed you my dear readers. Well, I figured I could now do that again and share some bits (pun intended) which may come handy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Bitset:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With bitset I mean a simple way of decreasing memory usage while storing information. There's plenty of situations where we need to store some state for multiple things. A simple (and very much schooly) example could be student's course proceedings in a school. Eg, let's imagine a school where we have 10000 students. Each student needs to pass set of courses, and these courses are either passed or not passed. Now, we could assign an ID-number for each student, starting from 0, and ending up to 9999. (Gosh how fast these classes grow nowadays. What does this tell about us parents...).&lt;br /&gt;&lt;br /&gt;Now first idea how to simply store this status is to create an array for each course, index it with student IDs, and set the element of array to 1 if student has passed the course, or 0 if he/she has not. Eg. we might end up in a solution like:&lt;br /&gt;&lt;br /&gt;int biology1[10000];&lt;br /&gt;&lt;br /&gt;int has_student_passed_biology1(int student_id)&lt;br /&gt;{&lt;br /&gt;  if(student_id&amp;lt;0 || student_id&amp;gt;10000)&lt;br /&gt;      return -1;&lt;br /&gt;  else&lt;br /&gt;      return biology1[student_id];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Lets ponder a lil while. An integer on x86 machine takes up 32 bits of space. How many bits do we need? Naturally, we only need 1 bit, (student can have passed the course (1) or not passed (0). (Of course there is cases when we do not need even this many bits, for example the introduction to quantum mechanics was such a course for 1.st years physics students... No one passed, but let's ignore that now :D) So for each course we end up wasting 31 bits of memory/student. This is 310000 bits (we had 10000 students), Eg. roughly 37.8 kilobytes. Well, when we think of modern PCs, this might not be significant. But on the other hand, when we think of all the possible places where we can do this wasting...  Well, have you ever wondered M$ product's memory usage? :D And if we think of embedded systems with limited amount of memory.........&lt;br /&gt;&lt;br /&gt;To tackle this problem we could change ints to chars. That would divide the loss by 4. But it would still be a waste. Especially in already bloated world of SW.&lt;br /&gt;&lt;br /&gt;So my (and many other's) solution is a bitset. In a simplest form it is just a way to read/write state of single bit. And basically this is what my bitset does. Eg, at the beginning, you initialize my bitset by telling how many bits you need, and later you set/unset/get the state of N.th bit of bitset.&lt;br /&gt;&lt;br /&gt;My bitset implementation can be obtained from my bot project's repository:&lt;br /&gt;&lt;a href="http://xp-dev.com/svn/MazBotV4/trunk/generic/src/"&gt;http://xp-dev.com/svn/MazBotV4/trunk/generic/src/&lt;/a&gt;&lt;br /&gt;The files are MbotBitset.h and MbotBitset.c&lt;br /&gt;&lt;br /&gt;NOTE! I've not tested this bit set on 64 bit architectures, and it may fail there. (It may also work though). If you test it, please report the results in this blog for example (as a comment), or by email (Mazziesaccount@gmail.com).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Packed Array:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, if we continue playing with thoughts of students, we can go back in good ol' times where grades from courses at university had only 4 possibilities. Failed, 1,2 or 3. Now if we think of storing these numbers, we note following:&lt;br /&gt;1. bitset cannot really be easily used, since it only allows 2 states / Id. (since it only uses 1 bit to represent the value, but representing 4 states requires 2 bits, 00, 01, 10, 11)&lt;br /&gt;2. If we use char array, only 2 of 8 bits is used / student.&lt;br /&gt;&lt;br /&gt;To tackle this one I wrote a packed array.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Basically my packed array just calculates amount of bits needed to represent the largest value (told at array initialization), and then allocates the amount of memory that is needed for array with X members (also told at initialization). Then it splits the memory to slots and allows writing/reading values stored in N bits wide slots.&lt;br /&gt;&lt;br /&gt;My packed array implementation can be found from same place as the bitset, files MbotPackedArray.h and MbotPackedArray.c&lt;br /&gt;&lt;br /&gt;NOTE! Packed array has not been tested on 64-bit machine (and I assume it will not work there). Also 32 bit environment has not been so throughoutly tested, but at least I've not noticed that there is bugs left...&lt;br /&gt;Anyways, I'd be gratefull if you reported results of all experiments with the packed array / bitset.&lt;br /&gt;&lt;br /&gt;(To my mail (Mazziesaccount@gmail.com) Bugs, success stories, improvements...&lt;br /&gt;or in this blog as a comment.Bugs, success stories, improvements...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-6349738026102267361?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9TKhQKonNAWJbNUDcOk0dNqQExg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9TKhQKonNAWJbNUDcOk0dNqQExg/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/9TKhQKonNAWJbNUDcOk0dNqQExg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9TKhQKonNAWJbNUDcOk0dNqQExg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/5jlhlFKWrpA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/6349738026102267361/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2010/06/more-tools-to-write-better-c.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6349738026102267361?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6349738026102267361?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/5jlhlFKWrpA/more-tools-to-write-better-c.html" title="More tools to write better C" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2010/06/more-tools-to-write-better-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEGQHc5fip7ImA9WhdWGUw.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-2865793800214472146</id><published>2009-07-22T23:50:00.009+03:00</published><updated>2011-09-13T14:50:21.926+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-13T14:50:21.926+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IRC" /><category scheme="http://www.blogger.com/atom/ns#" term="Cexplode" /><category scheme="http://www.blogger.com/atom/ns#" term="MazPong" /><category scheme="http://www.blogger.com/atom/ns#" term="IRCbot" /><category scheme="http://www.blogger.com/atom/ns#" term="MazBotV4" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><title>New C project started...</title><content type="html">I abandoned the foreverlasting MazPong project (for a while?). Reason you may ask. Because it grew into mess. Try writing project which gets bloated since you just write things you notice are handy, and forget to make small, compact TESTED things - and document them as you go on. Well, it may work if you can  work continuously, so that you can remember the big picture throughout the project. That's not the case with MazPong. I started writing it at 2005 (or so), and it has been completely redesigned three times while going on... And I have never worked 5 days in a row, more like two days of work - two - six months break and so on... Yet I never started from scratch...&lt;br /&gt;&lt;br /&gt;So it became a jungle of wery different pieces of code, some of which are dublicated (because I forgot I did something last year)...&lt;br /&gt;&lt;br /&gt;So it is on hold. I do not say it is totally forgotten - it is foreverlasting project for god's sake!&lt;br /&gt;&lt;br /&gt;Now.. I started another project, where I have a small motivator - a friend of mine might have use for it :D At this time it's not a game, it will be yet another IRC bot called MazBotV4 (working as an IRC client). I have always had obsession with IRC bots. First I wrote with mirc scripts, and it terrorized #oldgames channel related to old computer games. Then I wrote a bot using Eggdrop and TCL - with little success. TCL was not for me. V3 was written in C++, but I grew tired with it since I had no use for it. Now V4 will be pure plain C.&lt;br /&gt;&lt;br /&gt;This bot is meant to give easy interface for doing some tasks based on text file configurations - while it also offers almost unlimited possibilities to someone familiar with C - I plan writing a nice callback interface, where people with limited skills can add their own functions to be executed when an event occurs on IRC channel. And finally, I plan to write an interface, where bot user's can specify network addresses where bot connects on certain events. Idea is that this way one can send/retrieve information from web servers using the bot.&lt;br /&gt;&lt;br /&gt;- no. I am not going to write HTML parser in bot. period. It will be user's responcebility to write some scripts to web server - which can provide the data in simple format to bot. But of course, if someone wants to add html parser in the bot... ;) And other help will propably be appreciated (at least at some point - if I manage to keep this going. Oh yes, if anyone familiar with GNU Makefiles wants to improve the make scripts I have written [No autotools - I dislike them!!] and still keep them simple - welcome to take a peek and send suggestions!)&lt;br /&gt;&lt;br /&gt;Oh, the title of this post should link to source repository.&lt;br /&gt;And in case you want to see stable version, here:&lt;br /&gt;http://xp-dev.com/svn/Mazzie-mazbot/&lt;br /&gt;&lt;br /&gt;Oh, another bug found from Cexplode- put up a "correction release" v0.1-1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And finally, I have planned to use my Cexplode function set in IRC parser - and I have added some mysterious functions into it... So there's enchanced (and at the moment quite untested) version available. I just changed the file name to helpers.h and helpers.c (in generic/src folder). Also test/usage example is present in test/src folder. (This info is provided since according to my tracker, ~60% of people visiting this blog are looking for explode function for C)&lt;br /&gt;&lt;br /&gt;License terms are same as before - use/modify as pleases you - but let me know it by email or via a comment in this blog. But if you redistribute it, mention the original author (me) and this website (or the finnish equivalent: http://c-ohjelmoijanajatuksia.blogspot.com/ )&lt;br /&gt;&lt;br /&gt;All in all, happy summer, remember your caps - don't fry your brains :)&lt;br /&gt;&lt;br /&gt;-Matti&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-2865793800214472146?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D5jusrs2H-U1QeQ9r84-S6vBxGE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D5jusrs2H-U1QeQ9r84-S6vBxGE/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/D5jusrs2H-U1QeQ9r84-S6vBxGE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D5jusrs2H-U1QeQ9r84-S6vBxGE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/kb_2uWqgR7w" height="1" width="1"/&gt;</content><link rel="related" href="http://teotilcan.net/svn/MazBot/" title="New C project started..." /><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/2865793800214472146/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/07/new-c-project-started.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/2865793800214472146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/2865793800214472146?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/kb_2uWqgR7w/new-c-project-started.html" title="New C project started..." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/07/new-c-project-started.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYGRHk7cCp7ImA9WxJSFk8.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-6609612715488986289</id><published>2009-05-06T17:58:00.003+03:00</published><updated>2009-05-06T18:02:05.708+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T18:02:05.708+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="example" /><category scheme="http://www.blogger.com/atom/ns#" term="object oriented C" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>Example of object oriented C</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have previously written an entry stating that c can be used as object oriented language. Now I decided to write an example demostrating this. So here it is, a program drawing lottery numbers, written in ansi c, using object oriented approach.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I know the code looks horrible. It is. Object oriented code often is. And this example could have been written so much easier with plain procedural c. But this shows how basic requirements of object orientation are fullfilled. Lottery machine is (virtual) base class, and basic &amp; viking lottery are derived classes. If i had more enthusiasm, i would have written joker class too.-- &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And as an explanation, in finland we have two different types of lottery, viking lotto and regular lotto. Theres different amount of numbers drawn, but i cant remember the accurate amounts. Theres also so called joker, but i cant remember the amount of numbers in it either.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And as a final note, i know rand() is not perfect function to use, but since this was not meant to be real lottery machine, i could not care less :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So &lt;a href="http://www.student.oulu.fi/~mavaitti/lotto_en.zip"&gt;here's&lt;/a&gt; the lottery source. Compile with &lt;br /&gt;&lt;br /&gt;gcc -Wall -o lotteryExe lotto.c lottoTest.c regularlotto.c vikinglotto.c&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-6609612715488986289?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/grueMdlyU6xq1DIwZli2URyytGQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/grueMdlyU6xq1DIwZli2URyytGQ/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/grueMdlyU6xq1DIwZli2URyytGQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/grueMdlyU6xq1DIwZli2URyytGQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/0XlaqzWlt2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/6609612715488986289/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/05/example-of-object-oriented-c.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6609612715488986289?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6609612715488986289?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/0XlaqzWlt2s/example-of-object-oriented-c.html" title="Example of object oriented C" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/05/example-of-object-oriented-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8CQXg4eip7ImA9WxVbF00.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-6433596059852583248</id><published>2009-04-02T22:08:00.003+03:00</published><updated>2009-04-02T22:34:20.632+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-02T22:34:20.632+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>What I learned today.</title><content type="html">I've noticed that SW designer's job is constant learning. If you stop learning, tou stop advancing. For a newish guy on the field like me, most of the learning is related to existing systems - but even the old chaps need to keep making progress, new technologies keep coming, and falling back means giving advantage to others.&lt;br /&gt;&lt;br /&gt;So, I guess I'll start writing down this "What I learned today" post, in which I try to add new comments ehen I have learned something new. Just short sentences, with no long background, but with some information that was new to me.&lt;br /&gt;&lt;br /&gt;But since I started this now, not at my first day in the job, I'll write down a couple of things in this post too :)&lt;br /&gt;&lt;br /&gt;Last December.&lt;br /&gt;&lt;br /&gt;Untill the really latest glibc versions, there's a bug in glibc's timer_create() function implementation, which may cause a crash under certain conditions. (When timer expires, attempt to read the internal list where timers are kept in glibc, may access to invalid memory location)&lt;br /&gt;&lt;br /&gt;A few months ago.&lt;br /&gt;&lt;br /&gt;Helgrind is yet another great tool built on valgrind.&lt;br /&gt;(It can be used to detect synchronization issues in multithreaded applications - although it has it's limitations)&lt;br /&gt;&lt;br /&gt;A few weeks ago.&lt;br /&gt;&lt;br /&gt;In some glibc versions for powerpc have a bug, which makes valgrind yelling a lot of false alarms!&lt;br /&gt;&lt;br /&gt;A few days ago.&lt;br /&gt;&lt;br /&gt;pthread's stack size cannot be easily (or portably) changed after the thread is created.&lt;br /&gt;&lt;br /&gt;(It can be set during the thread initialization. It is not really common to have real need for changing the default stack size [actually this sounds like terribly failed design], but there may be cases where one needs to create many [read some hundreds of] threads with limited virtual address space [*shrugs*]. On linux at least, the real memory is not used more than really required, but virtual address space will be reserved for whole threads stack (no matter how much the thread really needs the stack).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today: (02.04.2009)&lt;br /&gt;&lt;br /&gt;In most linuxes, there's a program called "yes" included, which will repeatedly print the text given as argument. My co-worker told that to me today, and I used it to generate some CPU load when I needed to do some performance analysis. I used:&lt;br /&gt;&lt;br /&gt;yes Matti &gt; /dev/null&lt;br /&gt;renice -19 &lt;pid&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-6433596059852583248?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JEjnFkKxV090eOlGjM_IwlC2FMU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JEjnFkKxV090eOlGjM_IwlC2FMU/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/JEjnFkKxV090eOlGjM_IwlC2FMU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JEjnFkKxV090eOlGjM_IwlC2FMU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/-TM5XC1ZHRs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/6433596059852583248/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/04/what-i-learned-today.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6433596059852583248?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6433596059852583248?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/-TM5XC1ZHRs/what-i-learned-today.html" title="What I learned today." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/04/what-i-learned-today.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcMRH4_fyp7ImA9WxVbEEw.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-2637580176331273969</id><published>2009-03-25T22:08:00.003+02:00</published><updated>2009-03-25T22:14:45.047+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T22:14:45.047+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="shared memory" /><category scheme="http://www.blogger.com/atom/ns#" term="virtual memory" /><title>Linux virtuall address space.</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today I spotted a question about ability to read process data after process freeds the memory it has used.  (It was on a one of the best C programming related forums I know, at &lt;a href="http://www.cboard.com/"&gt;CBoard&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;So I started writing an answer, which accidentaly became lenghty. After I first read it I felt that there's no hope it could clarify a thing to anyone. But after a few beers, I started to feel pretty damn proud about that babbling. So I decided to copy it to here too. So enjoy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;About the reading memory after freeing it etc. I'll try to shed some light on this topic, and I hope if the more experienced guys spot a problem in my explanation, they will further teach both me and you &lt;img src="http://cboard.cprogramming.com/images/smilies/smile.gif" alt="" title="Smilie" class="inlineimg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;I will be talking in linux point of view, but I assume that most modern systems do it in somewhat similar manner. Of course there's some realtime systems (like OSE), in which all memory is available to all brogram blocks (Eg. processes), but I assume you're talking about some desktop system.&lt;br /&gt;&lt;br /&gt;So when we simplify enough we can say following. . Most modern OSes do map the real physical memory into virtual memory addresses, and give to each process their own virtual address space. Actually, in most modern computer systems, we have a hardware memory management unit which handles conversions from virtual addresses to physical memory and vice versa. So basically, at user space (which is basically all applications that aren't either part of the kernel, or a kernel module) it is not possible to access straight to hardware (memory or other hardware). Hardware is invisible for userspace processes, it can only be accessed via drivers written in kernel space. (drivers offer interface for user space applications). [[There is a workaround, but let's not mess with it now]].&lt;br /&gt;&lt;br /&gt;So process cannot directly access to RAM.&lt;br /&gt;&lt;br /&gt;When we launch a process, certain virtual address space is given to it (and certain physical ran corresponding to it, but the process has no means to get direct HW addresses). The process has no access outside of this sandbox. When we launch another process, it will have it's own virtual address space, and it's own corresponding physical ram. If process is running out of ram, kernel has means to increase it.&lt;br /&gt;&lt;br /&gt;If another process tries to access outside of it's sandbox, Eg. requests reading from / writing to location which is not in it's address space, MMU will wake up the kernel, which will check out what is happening. If request was illegal, kernel will generate signal SIGSEGV, and send it to your program. =&gt; segmentation fault.&lt;br /&gt;&lt;br /&gt;However physical ram is not cleaned, and the amount assigned to each process may change. There's also possibility of swapping, where some memory pages are written temporarily to hard disk, to free up some ram for other purposes.&lt;br /&gt;&lt;br /&gt;So basically, it indeed is possible that there is leftowers of data written by your program in the memory. But there should be no traces where in the physical ram your data was, so knowing which bytes belonged to what program - not to mention what were these bytes used for - is quite close to impossible. I say quite close because I've never considered that, and I do not have any accurate information how possible it could be.&lt;br /&gt;&lt;br /&gt;If I go a little further off topic to see if I have understood it correctly (I believe there is far more experienced fellows amongst us - who will correct me if I go wrong), there is at least following benefits of having physical addresses hidden:&lt;br /&gt;&lt;br /&gt;1. Security. No user space process has access to go and mess the HW as they want - they need to use drivers, which should be written in such a manner that hugest hazards are not possible...&lt;br /&gt;&lt;br /&gt;2. Per process memory mapping. If memory would be accessible between processes... Oh joy. If you have ever attempted to build huge and complicated multithreaded software you know what I mean. It really is a mess. Use of one uninitialized pointer may crash anything anywhere, or just make generally bizarre things to happen.&lt;br /&gt;&lt;br /&gt;I guess steps 1 and 2 could be implemented even if the applications could access ram directly - but I am not sure how easy / difficult it would be.&lt;br /&gt;&lt;br /&gt;3. Shared libraries. Shared libraries are loaded to memory during runtime. When each process has their own virtual address space, shared libraries can be downloaded to physical memory only once. The same physical memory block containing the library can then be mapped for each process' address space.&lt;br /&gt;&lt;br /&gt;Finally, the inter process communication often uses "creature" called shared memory. processes can request a shared memory block from kernel, which will then map some physical memory chunk to more than one process' virtual address space. Note however that virtual addresses in different processes need not to be the same, even though they point at same physical ram. Hence shared memory is usually accessed according to the offsets from the start of the memory pool.&lt;br /&gt;&lt;br /&gt;However, note that when you quit your program, the shared memory is not automatically freed. (thanks to brewbuck for confirmation &lt;img src="http://cboard.cprogramming.com/images/smilies/wink.gif" alt="" title="Wink" class="inlineimg" border="0" /&gt; ). It will stay accessible (if it was created to be accessible).&lt;br /&gt;&lt;br /&gt;And finally the [[]] which I wrote at the beginning. It is possible to write a driver, which can map some real hardware addresses to shared memory, which can then furthermore be mapped by a user space process. That way the HW can be accessed directly by a user space application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-2637580176331273969?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D_vtoR67ZbCaew2eile0vkx2KUw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D_vtoR67ZbCaew2eile0vkx2KUw/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/D_vtoR67ZbCaew2eile0vkx2KUw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D_vtoR67ZbCaew2eile0vkx2KUw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/cAjqLQPHYms" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/2637580176331273969/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/03/linux-virtuall-address-space.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/2637580176331273969?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/2637580176331273969?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/cAjqLQPHYms/linux-virtuall-address-space.html" title="Linux virtuall address space." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/03/linux-virtuall-address-space.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IER3o8fyp7ImA9WxVaGU0.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-881250822096750557</id><published>2009-03-24T10:27:00.007+02:00</published><updated>2009-04-16T22:18:26.477+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T22:18:26.477+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="OOP" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>C can be used as object oriented language!</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;I am sick of C++ coders, who tend to yell their OOP terms to the world, and claim that OOP is the only way, and C++ is the best... Actually they're wrong when they say that C is a bad language, because it is not object oriented. They're wrong in two things.&lt;br /&gt; &lt;br /&gt;1. C is far from bad language. Some of the most significant, most efficient, and most important things are still written in C. Linux, loads of embedded SW, (did you know that there is probably almost same amount of code in a modern car that there is in Windows XP? Scary thought.) and so on.&lt;br /&gt;&lt;br /&gt;2. C can be seen as object oriented language, and sometimes it actually benefits to use it as such.&lt;br /&gt;&lt;br /&gt;Actually, there is only a few things in C++, that you cannot do with C (not with same syntax of course, but with similar idea behind). The most important of those are probably destructors, templates, and overloading.&lt;br /&gt;&lt;br /&gt;Did I hear lil C++ coder screaming about classes, virtual classes and inheritance? Allright. Maybe I'll explain a little further.&lt;br /&gt;&lt;br /&gt;The most critical characters of object are:&lt;br /&gt;1. It binds the data, and functionality (note, I avoided the "method" word... ehh.. Obviously I didnt :D )&lt;br /&gt;2. It can be instantiated.&lt;br /&gt;&lt;br /&gt;Yeah, how do you do that with C - you rat. I heard you, and don't worry, I'll explain.&lt;br /&gt;&lt;br /&gt;I guess that even though you're so full of your fancy classes, you must've seen reserved word struct somewhere. At least when you did try to use it as a variable name last week. (Yes, the structs are in Cpp too). Then a bit more difficult thing, function pointer. If that's not a familiar concept to you (that exists in C++ too - although it is not as easy to use them there. Especially not for someone like me, who has not written C++ in... ... long time.) you can chek out my blog post &lt;a href="http://c-ohjelmoijanajatuksia.blogspot.com/2008/08/funktio-osoittimet-css.html"&gt;here (in Finnish though).&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;&lt;br /&gt;So how to do a C representative for&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;const int AGE_STOMACH_RATIO 5&lt;br /&gt;class dog&lt;br /&gt;{&lt;br /&gt;   private:&lt;br /&gt;   EColour furColour;&lt;br /&gt;   int age;&lt;br /&gt;   unsigned int stomach_state;&lt;br /&gt;   bool check_condition();&lt;br /&gt;   int calculateStomachCapacity();&lt;br /&gt;   void die();&lt;br /&gt;   public:&lt;br /&gt;   dog(EColour colour);&lt;br /&gt;   void feed(int food_amount);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;dog::dog(EColour colour)&lt;br /&gt;{&lt;br /&gt;   furColour=colour;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool dog::check_condition()&lt;br /&gt;{&lt;br /&gt;    if(calculateStomachCapacity() &lt; 0 ...&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Yeah, do that with C you say...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;struct Sdog;&lt;br /&gt;int dog_check_condition(Sdog *_this);&lt;br /&gt;&lt;br /&gt;typedef int (*check_conditionF)(Sdog *_this);&lt;br /&gt;typedef int (*calculateStomachCapacityF)(Sdog *_this);&lt;br /&gt;typedef void (*dieF)(void);&lt;br /&gt;typedef void (*dogF)(Sdog *_this, EColour colour);&lt;br /&gt;typedef void (*feedF)(Sdog *_this);&lt;br /&gt;typedef struct Sdog&lt;br /&gt;{&lt;br /&gt;   EColour furColour;&lt;br /&gt;   int age;&lt;br /&gt;   unsigned int stomach_state;&lt;br /&gt;   check_conditionF check_condition;&lt;br /&gt;   calculateStomachCapacityF calculateStomachCapacity;&lt;br /&gt;   dieF die;&lt;br /&gt;   dogF dog;&lt;br /&gt;   feedF feed;&lt;br /&gt;}Sdog;&lt;br /&gt;&lt;br /&gt;int dog_check_condition(Sdog *_this)&lt;br /&gt;{&lt;br /&gt;    //starvation                    //overeating&lt;br /&gt;    if(_this-&gt;stomach_state == 0 || _this-&gt;calculateStomachCapacity(_this) &lt;&gt;stomach_state )&lt;br /&gt;        return 0;&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;int dog_&lt;br /&gt;void initDog(Sdog *_this, EColour colour)&lt;br /&gt;{&lt;br /&gt;   _this-&gt;furColour=colour;&lt;br /&gt;   _this-&gt;age=1;&lt;br /&gt;   _this-&gt;stomach_state=3;&lt;br /&gt;   _this-&gt;check_condition=&amp;amp;dog_check_condition;&lt;br /&gt;   .&lt;br /&gt;   .&lt;br /&gt;   .&lt;br /&gt;   and so on..&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;I hope you can see the analogy.&lt;br /&gt;&lt;br /&gt;Okay okay. How about the second important thing in allmighty OOP:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;&lt;br /&gt;The instantiation. &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;There can be several instances of dog ... blaa blaa blaa...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;   Sdog *lassie;&lt;br /&gt;&lt;br /&gt;   lassie=malloc(sizeof(Sdog));&lt;br /&gt;   lassie-&gt;dog=&amp;initDog;&lt;br /&gt;   *(lassie-&gt;dog)(lassie,EColor_brown);&lt;br /&gt;   *(lassie-&gt;feed)(lasie,2);&lt;br /&gt;   .&lt;br /&gt;   .&lt;br /&gt;// or as a local variable:&lt;br /&gt;/*&lt;br /&gt;   Sdog lassie;&lt;br /&gt;   *lassie.dog=&amp;initDog;&lt;br /&gt;   *lassie.dog(&amp;amp;lassie,EColor_brown);&lt;br /&gt;   *lassie.feed(&amp;amp;lassie,2);&lt;br /&gt;   .&lt;br /&gt;   .&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;What's next? Data encapsulation? Allright.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;This requires some "cheating", but what was the point of this blog is - it is doable.&lt;br /&gt;&lt;br /&gt;Now we divide our Sdog into two different structs. Public Sdog, and private S_dog for example&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;typedef struct Sdog&lt;br /&gt;{&lt;br /&gt;   dogF dog;&lt;br /&gt;   feedF feed;&lt;br /&gt;   char internalData[1];&lt;br /&gt;}Sdog;&lt;br /&gt;&lt;br /&gt;typedef struct S_dog&lt;br /&gt;{&lt;br /&gt;//As abowe.&lt;br /&gt;}S_dog;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Now we place this struct Sdog and it's functions into a public header, but keep S_dog and private functions in private headers. The .c file (implementation of functions) then includes both headers, but only public one is given to dog users. When we initialize Sdog, we'll allocate space for S_dog too (in the placeholder)(by using realloc, or then we can make the struct allocation in dogInit() function, and change it to return the pointer to created object). And when we use internal functions, we'll just cast the placeholder (Eg. char internalData[1]) to S_dog * type.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;&lt;br /&gt;Inheritance you say&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Okay. This is rather simple. We can for example define structure Sdoberman, which has structure Sdog as it's first part, and append doberman specific data and functions at the end. Then when we wish to only use generic data, we'll handle the pointer to struct as Sdog, and when we want to use doberman features, we'll cast struct to Sdoberman.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;&lt;br /&gt;Virtual classes someone whispers...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Yeah. Now what? If we have virtual class representative Sdog, and "classes" Sdoberman, Schihuahua and Smixed derived from virtual class. Now we can use aforementioned idea, and place Sdog struct as first item. We can also add a "dogType" variable in Sdog struct, which is initialized correctly when doberman, chihuahua or mixed is created. Then in virtual functions we can simply check the dogType variable, perform correct cast to _this pointer, and call correct frunction from Sdobermann, Schihuahua or Smixed.&lt;br /&gt;&lt;br /&gt;Another approach (which also sounds more natural to C), is to have the "dogType" as first member in Sdog struct, use void * pointers, to the struct, dereference first sizeof(dogType) bytes and then perform the cast to correct dog struct.&lt;br /&gt;&lt;br /&gt;I know. All C++ coders are terrified. But when a C coder looks at this, he/she notices the idea (I hope), and when we look the interface this creates, we'll really see the basic OOP structures. &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;&lt;br /&gt;A note about destructors and C&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Furthermore, it is also possible to create a destructor type thing for your objects - when they're dynamically allocated with malloc() type call. It involves quite simple steps:&lt;br /&gt;&lt;br /&gt;1. build your own malloc() wrapper (MyAlloc() for example), which allocates the space user requested + some extra for some internal structures. Then return pointer to this "user data area". Allow registration of callback function, which will be executed when memory is freed (the destructor), and store pointer to that in the extra space (which is invisible for user) you allocated. You can also create some additional debug things, like add some space after the user requested block, and write somekind of "end mark" to it. End mark which will be destroyed, if user overwrites the reserved memory... (This naturally requires storing the allocated blocks size in internal "header" too)&lt;br /&gt;&lt;br /&gt;2. build your own free() wrapper, which executes the callback (destructor) and checks the endmark validity (if such was implemented), and frees the (internal + user) memory.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;"&gt;&lt;br /&gt;Final Words...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Okay. I think I have trolled enough now, and most of the C++ coders are so upset by now, that they have propably stopped reading ;) So I guess it is good time to tell what I really think. I think that C++ is great language, providing many things that are better than plain C. However C++ is not really usable in all environments, or at least C++'s best parts aren't. For example, in an embedded project where I was working I did one test using C++ and STL. Required stack size was tripled compared to C implementation. You may tell that it is because I used buggy compiler/buggy STL implementation. You can say this, you can say that. However fact is, that with C++, you'll easily get bloated code, larger executables, increased resource usage. You may be able to avoid these (partially), by limiting the C++ toolset you use - but then you cannot keep yapping how great the C++'s all cool features are, since you cannot really use all cool features. C++ is great for many purposes, but there is things where C is far better option.&lt;br /&gt;&lt;br /&gt;I'll see if I can later show you some simple implementation of C++ style C - I have really sometimes used it, and it may be a good approach to some problems. Actually, I described one such situation in my Finnish blog &lt;a href="http://c-ohjelmoijanajatuksia.blogspot.com/2009/03/cta-c-tyyliin.html"&gt;here&lt;/a&gt; (In finnish blog =&gt; it is written in Finnish.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-881250822096750557?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/anA4172CWF85AM97xqtLpQGe9jQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/anA4172CWF85AM97xqtLpQGe9jQ/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/anA4172CWF85AM97xqtLpQGe9jQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/anA4172CWF85AM97xqtLpQGe9jQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/Kb5uO3HqDho" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/881250822096750557/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/03/c-language-is-oop.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/881250822096750557?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/881250822096750557?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/Kb5uO3HqDho/c-language-is-oop.html" title="C can be used as object oriented language!" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/03/c-language-is-oop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUDQX46cCp7ImA9WxVUFUU.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-7256524625831475096</id><published>2009-03-20T21:51:00.005+02:00</published><updated>2009-03-20T22:17:50.018+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-20T22:17:50.018+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="porting" /><category scheme="http://www.blogger.com/atom/ns#" term="porting 32 bit to 64 bit" /><category scheme="http://www.blogger.com/atom/ns#" term="pitfall" /><category scheme="http://www.blogger.com/atom/ns#" term="portability" /><title>Answer to pitfall III (I forgot to post this earlier)</title><content type="html">The answer is simple. I bet the bells start ringing when I say this. Usually with 32 bit systems, memory address is 32 bit wide. With 64 bit systems it often is 64 bits wide...&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;...Now, look at the pitfall III again, and you'll see that we do pinter arithmetics by handling pointers as integers. This means that half of the address will be cropped, and remaining address is most propably something pointing at invalid locations. After you use it, MMU will detect your process accessing out of the virtual address space mapped for the process. It'll kick up kernel, which most propably decides to send SIGSEGV signal to your program. And if youre writing anything more critical than snake game, you haven't registered handler which forgives SIGSEGV. Eg. result is segmentation fault. Adios. Bye. Game over. Sommoro ja Soronoo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-7256524625831475096?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nIJC7_PiWsJnzWHHSpGcpQBbov4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nIJC7_PiWsJnzWHHSpGcpQBbov4/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/nIJC7_PiWsJnzWHHSpGcpQBbov4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nIJC7_PiWsJnzWHHSpGcpQBbov4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/2CxdUIzNNMk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/7256524625831475096/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/03/answer-to-pitfall-iii-i-forgot-to-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/7256524625831475096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/7256524625831475096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/2CxdUIzNNMk/answer-to-pitfall-iii-i-forgot-to-post.html" title="Answer to pitfall III (I forgot to post this earlier)" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/03/answer-to-pitfall-iii-i-forgot-to-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EFQXo5eip7ImA9WxJbFEs.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-4805085851387573394</id><published>2009-03-20T21:37:00.005+02:00</published><updated>2009-07-24T23:00:10.422+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-24T23:00:10.422+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="C quiz" /><category scheme="http://www.blogger.com/atom/ns#" term="pitfall" /><category scheme="http://www.blogger.com/atom/ns#" term="portability" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>My first C quiz at 2009</title><content type="html">Hi dee Ho peeps!&lt;br /&gt;&lt;br /&gt;It has been looong since I wrote last pitfall/quiz in here, so I guess it is about the time to continue :)&lt;br /&gt;&lt;br /&gt;So at this time I'll just remind you of one nastyish C specific bug - which is easy to avoid by reading the compilers warnings. I've tested it on gcc.&lt;br /&gt;&lt;br /&gt;So following code will work on 32 bit machine, but on 64 bit machine you are allowed to expect sudden death... What's the cause?&lt;br /&gt;&lt;br /&gt;And as always, you can use comment section to give answers :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;file main.c&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;   int data[32];&lt;br /&gt;   int i;&lt;br /&gt;   int *copydata;&lt;br /&gt;&lt;br /&gt;   for(i=0;i&amp;lt;32;i++)&lt;br /&gt;   {&lt;br /&gt;       data[i]=i;&lt;br /&gt;       printf("data[%d]=%d\n",i,data[i],i);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   copydata=allocateMyMate(sizeof(data));&lt;br /&gt;   if(copydata==NULL)&lt;br /&gt;   {&lt;br /&gt;      printf("Allocation Failed!!\n");&lt;br /&gt;      return -1;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;       printf("Allocation succeeded!\n");&lt;br /&gt;&lt;br /&gt;   memcpy(copydata,data,32*sizeof(int));&lt;br /&gt;   printf("Looks like you had 32bit machine :) \n");&lt;br /&gt;   for(i=0;i&amp;lt;32;i++)&lt;br /&gt;   {&lt;br /&gt;       printf("data %d == copydata %d",data[i],copydata[i]);&lt;br /&gt;   }&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;myalloc.c&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;void * allocateMyMate(size_t size)&lt;br /&gt;{&lt;br /&gt;   return malloc(size);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;file main.c&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So where's the bug?&lt;br /&gt;&lt;br /&gt;And even though the free() corresponding to malloc() is missing, do not consider it as a bug at this time. (Naturally it is a bug, but it was not the bug I wrote this question for).&lt;br /&gt;&lt;br /&gt;HINTS BELoW! Do Not Look YET ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. With c++ youre safe from this bug.&lt;br /&gt;2. Try compiling and check the compiler warnings!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-4805085851387573394?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zcUYRCbCHwaMEIhI8cD4e4ZAfgI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zcUYRCbCHwaMEIhI8cD4e4ZAfgI/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/zcUYRCbCHwaMEIhI8cD4e4ZAfgI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zcUYRCbCHwaMEIhI8cD4e4ZAfgI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/-n78IAB_Gfs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/4805085851387573394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2009/03/my-first-c-quiz-at-2009.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4805085851387573394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4805085851387573394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/-n78IAB_Gfs/my-first-c-quiz-at-2009.html" title="My first C quiz at 2009" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2009/03/my-first-c-quiz-at-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkADSX4-eyp7ImA9WhdVEEQ.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-3505227321777727608</id><published>2008-09-16T10:45:00.021+03:00</published><updated>2011-09-15T15:46:18.053+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-15T15:46:18.053+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="explode()" /><title>C - Explode.</title><content type="html">15.09.2011 Sources can be found from svn repository at&lt;br /&gt;&lt;a href="http://xp-dev.com/svn/MazBotV4/trunk/generic/src/"&gt;http://xp-dev.com/svn/MazBotV4/trunk/generic/src/&lt;/a&gt; CExplode functions are nowadays part of the helpers.c and helpers.h files.&lt;br /&gt;&lt;br /&gt;Some kind of an API doc can be found from&lt;br /&gt;&lt;a href="http://xp-dev.com/svn/MazBotV4/trunk/docs/html/helpers_8h.html"&gt;http://xp-dev.com/svn/MazBotV4/trunk/docs/html/helpers_8h.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://xp-dev.com/svn/MazBotV4/trunk/docs/"&gt; http://xp-dev.com/svn/MazBotV4/trunk/docs/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;06.08.2009 &lt;b&gt;NOTE:&lt;/b&gt; Another bug found, put up "correction release" v0.1-1&lt;br /&gt;(svn repository at &lt;a href="http://xp-dev.com/svn/Mazzie-mazbot/"&gt;here&lt;/a&gt; , full checkout can be done if svn client is installed with: "svn checkout http://xp-dev.com/svn/Mazzie-mazbot/" ), but if you only wish to get the Cexplode, you can simply go there with web browswe, and save files generic/src/helpers.h and generic/src/helpers.c There propably is also some other helper functions, which may be dependant to other bot project sources, If that is the case, just erase everything except the Cexplode related stuff, and files should be compilable. If you need help, leave me a comment, and I may do a separate zip with Cexplode and makefile only :)&lt;br /&gt;&lt;br /&gt;And please, if anyone uses the code and finds a bug, please file me a bugreport at  Mazziesaccount@gmail.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;27.07.2009 &lt;b&gt;NOTE:&lt;/b&gt; The code presented here is faulty. I found a bug which can cause the last character of last exploded piece to be random. (And possibly other errors). I have fixed this in code I have written for my MazBot project. (Look my comment below to find the updated version) I will not update code on this website because formatting C code to be displayed correctly on this blog is somewhat troublesome &amp;amp;&amp;amp; errorprone and when done manually. I am terribly sorry for inconvenience!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I decided to write also ANSI C version of php's explode() function. Why? Well, because  it seems to me that most of the visitors here have been searching for C/C++ implementation for php's explode() function. So here it is my loyal readers, cxplode() written in C. a.k.a Cexplode() by Maz :)&lt;br /&gt;&lt;br /&gt;(I'll also place it in downloadable Cexplode.tar.gz when I'll find the time.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Cexplode.h&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;/* ******************************************************** */&lt;br /&gt;/*                                                          *&lt;br /&gt;*      Implementation of php's explode written in C        *&lt;br /&gt;*      Written by  Maz (2008)                              *&lt;br /&gt;*      http://maz-programmersdiary.blogspot.com/           *&lt;br /&gt;*                                                          *&lt;br /&gt;*      You're free to use this piece of code.              *&lt;br /&gt;*      You can also modify it freely, but if you           *&lt;br /&gt;*      improve this, you must write the improved code      *&lt;br /&gt;*      in comments at:                                     *&lt;br /&gt;*      http://maz-programmersdiary.blogspot.com/           *&lt;br /&gt;*      or at:                                              *&lt;br /&gt;*      http://c-ohjelmoijanajatuksia.blogspot.com/         *&lt;br /&gt;*      or mail the corrected version to me at              *&lt;br /&gt;*      Mazziesaccount@gmail.com                            *&lt;br /&gt;*                                                          *&lt;br /&gt;*      Revision History:                                   *&lt;br /&gt;*                                                          *&lt;br /&gt;*      -v0.0.1 16.09.2008/Maz                              *&lt;br /&gt;*                                                          */&lt;br /&gt;/* ******************************************************** */&lt;br /&gt;&lt;br /&gt;#ifndef CEXPLODE_H&lt;br /&gt;#define CEXPLODE_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef struct CexplodeStrings&lt;br /&gt;{&lt;br /&gt;int amnt;&lt;br /&gt;char **strings;&lt;br /&gt;}CexplodeStrings;&lt;br /&gt;&lt;br /&gt;typedef enum ECexplodeRet&lt;br /&gt;{&lt;br /&gt;ECexplodeRet_InternalFailure    = -666,&lt;br /&gt;ECexplodeRet_InvalidParams         = -667&lt;br /&gt;}ECexplodeRet;&lt;br /&gt;&lt;br /&gt;int Cexplode&lt;br /&gt;(&lt;br /&gt;const char *string,&lt;br /&gt;const char *delim,&lt;br /&gt;CexplodeStrings *exp_obj&lt;br /&gt;);&lt;br /&gt;char *Cexplode_getNth(int index,CexplodeStrings exp_obj);&lt;br /&gt;char *Cexplode_getfirst(CexplodeStrings exp_obj);&lt;br /&gt;void Cexplode_free(CexplodeStrings exp_obj);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Cexplode.c&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* ******************************************************** */&lt;br /&gt;/*                                                          *&lt;br /&gt;*      Implementation of php's explode written in C        *&lt;br /&gt;*      Written by  Maz (2008)                              *&lt;br /&gt;*      http://maz-programmersdiary.blogspot.com/           *&lt;br /&gt;*                                                          *&lt;br /&gt;*      You're free to use this piece of code.              *&lt;br /&gt;*      You can also modify it freely, but if you           *&lt;br /&gt;*      improve this, you must write the improved code      *&lt;br /&gt;*      in comments at:                                     *&lt;br /&gt;*      http://maz-programmersdiary.blogspot.com/           *&lt;br /&gt;*      or at:                                              *&lt;br /&gt;*      http://c-ohjelmoijanajatuksia.blogspot.com/         *&lt;br /&gt;*      or mail the corrected version to me at              *&lt;br /&gt;*      Mazziesaccount@gmail.com                            *&lt;br /&gt;*                                                          *&lt;br /&gt;*      Revision History:                                   *&lt;br /&gt;*                                                          *&lt;br /&gt;*      -v0.0.1 16.09.2008/Maz                              *&lt;br /&gt;*                                                          */&lt;br /&gt;/* ******************************************************** */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include "Cexplode.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int Cexplode&lt;br /&gt;(&lt;br /&gt;const char *string,&lt;br /&gt;const char *delim,&lt;br /&gt;CexplodeStrings *exp_obj&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;int stringL = 0;&lt;br /&gt;int delimL  = 0;&lt;br /&gt;int index;&lt;br /&gt;int pieces=0;&lt;br /&gt;int string_start=0;&lt;br /&gt;&lt;br /&gt;char **tmp=NULL;&lt;br /&gt;&lt;br /&gt;//Sanity Checks:&lt;br /&gt;if(NULL==string || NULL==delim || NULL == exp_obj)&lt;br /&gt;{&lt;br /&gt;    printf("Invalid params given to Cexplode!\n");&lt;br /&gt;    return ECexplodeRet_InvalidParams;&lt;br /&gt;}&lt;br /&gt;stringL = strlen(string);&lt;br /&gt;delimL  = strlen(delim);&lt;br /&gt;if(delimL&amp;gt;=stringL)&lt;br /&gt;{&lt;br /&gt;    printf("Invalid params given to Cexplode!\n");&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;for(index=0;index&amp;lt;stringL-delimL;index++)&lt;br /&gt;{&lt;br /&gt;    if(string[index]==delim[0])&lt;br /&gt;    {&lt;br /&gt;        //Check if delim was actually found&lt;br /&gt;        if( !memcmp(&amp;amp;(string[index]),delim,delimL) )&lt;br /&gt;        {&lt;br /&gt;            //token found&lt;br /&gt;            //let's check if token was at the beginning:&lt;br /&gt;            if(index==string_start)&lt;br /&gt;            {&lt;br /&gt;                string_start+=delimL;&lt;br /&gt;                index+=delimL-1;&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;            /*&lt;br /&gt;               if token was not at start, then we&lt;br /&gt;               should add it in CexplodeStrings&lt;br /&gt;            */&lt;br /&gt;            pieces++;&lt;br /&gt;            if(NULL==tmp)&lt;br /&gt;                tmp=malloc(sizeof(char *));&lt;br /&gt;            else&lt;br /&gt;                tmp=realloc(tmp,sizeof(char *)*pieces);&lt;br /&gt;            if(NULL==tmp)&lt;br /&gt;            {&lt;br /&gt;                printf("Cexplode: Malloc failed!\n");&lt;br /&gt;                return ECexplodeRet_InternalFailure;&lt;br /&gt;            }&lt;br /&gt;            //alloc also for \0&lt;br /&gt;            tmp[pieces-1]=malloc&lt;br /&gt;            (&lt;br /&gt;              sizeof(char *)*(index-string_start+1)&lt;br /&gt;            );&lt;br /&gt;            if(NULL==tmp[pieces-1])&lt;br /&gt;            {&lt;br /&gt;                printf("Cexplode: Malloc failed!\n");&lt;br /&gt;                return ECexplodeRet_InternalFailure;&lt;br /&gt;            }&lt;br /&gt;            memcpy(&lt;br /&gt;              tmp[pieces-1],&lt;br /&gt;              &amp;amp;(string[string_start]),&lt;br /&gt;              index-string_start&lt;br /&gt;            );&lt;br /&gt;&lt;br /&gt;            tmp[pieces-1][index-string_start]='\0';&lt;br /&gt;            string_start=index+delimL;&lt;br /&gt;            index+=(delimL-1);&lt;br /&gt;        }//delim found&lt;br /&gt;    }//first letter in delim found from string&lt;br /&gt;}//for loop&lt;br /&gt;&lt;br /&gt;if(memcmp(&amp;amp;(string[index]),delim,delimL))&lt;br /&gt;    index+=delimL;&lt;br /&gt;if(index!=string_start)&lt;br /&gt;{&lt;br /&gt;    pieces++;&lt;br /&gt;    if(NULL==tmp)&lt;br /&gt;        tmp=malloc(sizeof(char *));&lt;br /&gt;    else&lt;br /&gt;        tmp=realloc(tmp,sizeof(char *)*pieces);&lt;br /&gt;    if(NULL==tmp)&lt;br /&gt;    {&lt;br /&gt;        printf("Cexplode: Malloc failed!\n");&lt;br /&gt;        return ECexplodeRet_InternalFailure;&lt;br /&gt;    }&lt;br /&gt;        tmp[pieces-1]=malloc&lt;br /&gt;       (&lt;br /&gt;          sizeof(char *)*(index-string_start+1)&lt;br /&gt;       );&lt;br /&gt;    if(NULL==tmp[pieces-1])&lt;br /&gt;    {&lt;br /&gt;        printf("Cexplode: Malloc failed!\n");&lt;br /&gt;        return ECexplodeRet_InternalFailure;&lt;br /&gt;    }&lt;br /&gt;    memcpy&lt;br /&gt;    (&lt;br /&gt;      tmp[pieces-1],&lt;br /&gt;      &amp;amp;(string[string_start]),&lt;br /&gt;      index-string_start&lt;br /&gt;    );&lt;br /&gt;    tmp[pieces-1][index-string_start+1]='\0';&lt;br /&gt;}&lt;br /&gt;exp_obj-&amp;gt;amnt=pieces;&lt;br /&gt;exp_obj-&amp;gt;strings=tmp;&lt;br /&gt;return pieces;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;char *Cexplode_getNth(int index,CexplodeStrings exp_obj)&lt;br /&gt;{&lt;br /&gt;if(exp_obj.amnt&amp;lt;index)&lt;br /&gt;{&lt;br /&gt;    return NULL;&lt;br /&gt;}&lt;br /&gt;return exp_obj.strings[index-1];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char *Cexplode_getfirst(CexplodeStrings exp_obj)&lt;br /&gt;{&lt;br /&gt;return Cexplode_getNth(1,exp_obj);&lt;br /&gt;}&lt;br /&gt;void Cexplode_free(CexplodeStrings exp_obj)&lt;br /&gt;{&lt;br /&gt;int i=0;&lt;br /&gt;for(;i&amp;lt;exp_obj.amnt;i++)&lt;br /&gt;    free(exp_obj.strings[i]);&lt;br /&gt;free(exp_obj.strings);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Cexplode_example.c&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* ******************************************************** */&lt;br /&gt;/*                                                          *&lt;br /&gt;*      Implementation of php's explode written in C        *&lt;br /&gt;*      Written by  Maz (2008)                              *&lt;br /&gt;*      http://maz-programmersdiary.blogspot.com/           *&lt;br /&gt;*                                                          *&lt;br /&gt;*      You're free to use this piece of code.              *&lt;br /&gt;*      You can also modify it freely, but if you           *&lt;br /&gt;*      improve this, you must write the improved code      *&lt;br /&gt;*      in comments at:                                     *&lt;br /&gt;*      http://maz-programmersdiary.blogspot.com/           *&lt;br /&gt;*      or at:                                              *&lt;br /&gt;*      http://c-ohjelmoijanajatuksia.blogspot.com/         *&lt;br /&gt;*      or mail the corrected version to me at              *&lt;br /&gt;*      Mazziesaccount@gmail.com                            *&lt;br /&gt;*                                                          *&lt;br /&gt;*      Revision History:                                   *&lt;br /&gt;*                                                          *&lt;br /&gt;*      -v0.0.1 16.09.2008/Maz                              *&lt;br /&gt;*                                                          */&lt;br /&gt;/* ******************************************************** */&lt;br /&gt;&lt;br /&gt;#include "stdio.h"&lt;br /&gt;#include "Cexplode.h"&lt;br /&gt;&lt;br /&gt;int main(int argc,char *argv[])&lt;br /&gt;{&lt;br /&gt;char *string;&lt;br /&gt;char *delim;&lt;br /&gt;int retval;&lt;br /&gt;int index=0;&lt;br /&gt;char *token;&lt;br /&gt;CexplodeStrings expString;&lt;br /&gt;if(argc!=3)&lt;br /&gt;{&lt;br /&gt;    printf("Test Command should be:\n");&lt;br /&gt;    printf&lt;br /&gt;    (&lt;br /&gt;      "&amp;lt;testExe&amp;gt; \"original string\" \"delimiter string\""&lt;br /&gt;    );&lt;br /&gt;    return -1;&lt;br /&gt;}&lt;br /&gt;string=argv[1];&lt;br /&gt;delim=argv[2];&lt;br /&gt;&lt;br /&gt;printf("TestString is \"%s\"\n",string);&lt;br /&gt;printf("Test Delimiter is \"%s\"\n",delim);&lt;br /&gt;if(0&amp;gt;(retval=Cexplode(string,delim,&amp;amp;expString)))&lt;br /&gt;{&lt;br /&gt;    printf("CexplodeFailed!\n");&lt;br /&gt;    return -1;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;    //Way 1, use expString straight away:&lt;br /&gt;    printf("Way 1, use expString straight away:\n");&lt;br /&gt;    for(index=0;index&amp;lt;expString.amnt;index++)&lt;br /&gt;    {&lt;br /&gt;        printf&lt;br /&gt;        (&lt;br /&gt;          "token %d = %s\n",&lt;br /&gt;          index+1,&lt;br /&gt;          expString.strings[index]&lt;br /&gt;        );&lt;br /&gt;    }&lt;br /&gt;    /*&lt;br /&gt;       Way 2, you can use Cexplode_getNth,&lt;br /&gt;       or Cexplode_getfirst()&lt;br /&gt;    */&lt;br /&gt;    printf(&lt;br /&gt;     "Way 2 use Cexplode_getNth, or Cexplode_getfirst():\n"&lt;br /&gt;    );&lt;br /&gt;    token=Cexplode_getfirst(expString);&lt;br /&gt;    printf("first token %s\n",token);&lt;br /&gt;    index=1;&lt;br /&gt;    while(NULL!=(token=Cexplode_getNth(++index,expString)))&lt;br /&gt;    {&lt;br /&gt;        printf("token %d = %s\n",index,token);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;Cexplode_free(expString);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-3505227321777727608?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ra3VINleNWPvAym2tR8wNr3jbVQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ra3VINleNWPvAym2tR8wNr3jbVQ/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/Ra3VINleNWPvAym2tR8wNr3jbVQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ra3VINleNWPvAym2tR8wNr3jbVQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/dCt44WkmiXw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/3505227321777727608/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/09/c-explode.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/3505227321777727608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/3505227321777727608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/dCt44WkmiXw/c-explode.html" title="C - Explode." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/09/c-explode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EDSX86eCp7ImA9WxRTEU8.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-5994881946624907375</id><published>2008-08-30T22:39:00.003+03:00</published><updated>2008-08-30T22:47:58.110+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-30T22:47:58.110+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="memory violation" /><category scheme="http://www.blogger.com/atom/ns#" term="memory allocation failure" /><category scheme="http://www.blogger.com/atom/ns#" term="malloc" /><category scheme="http://www.blogger.com/atom/ns#" term="answer" /><category scheme="http://www.blogger.com/atom/ns#" term="segmentation fault" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="overflow" /><title>Answer to pitfall IV</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I&amp;quot;m in hurry, hence just a short answer.&lt;br /&gt;This is where the problem lies:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;fbs=(foosNbars*)malloc(amount*sizeof(foosNbars));&lt;br /&gt;    if(NULL==fbs)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When user inputs big enough amount, the result of amount*sizeof(...) does not fit in 32 bit variable. Variable overflows. What does the overflow result? It results small positive number (since malloc takes arg as unsigned int). Hence malloc really allocates some space - but not the amount user originally requested. Thus the NULL check at next line does not detect the error, and later when user attempts to fill all structs he thinks is allocated... Yep, crash boom bang Segmentation Fault.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-5994881946624907375?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GCh3emCjH2WrXww7q2V_U41KT0I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GCh3emCjH2WrXww7q2V_U41KT0I/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/GCh3emCjH2WrXww7q2V_U41KT0I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GCh3emCjH2WrXww7q2V_U41KT0I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/gOrpesaHapE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/5994881946624907375/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/answer-to-pitfall-iv.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/5994881946624907375?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/5994881946624907375?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/gOrpesaHapE/answer-to-pitfall-iv.html" title="Answer to pitfall IV" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/answer-to-pitfall-iv.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFR3Y_fip7ImA9WxdaFU8.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-6323874897449774973</id><published>2008-08-23T23:06:00.006+03:00</published><updated>2008-08-24T00:05:16.846+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-24T00:05:16.846+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="trim" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><title>rtrim() in C</title><content type="html">Another nifty php funktion that C and C++ miss is rtrim(). trim is a function, which removes whitespaces from the end of a string.&lt;br /&gt;So here's my implementation of rtrim() for char arrays:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;\brief removes trailing whitespaces and tabs from a string.&lt;br /&gt;\returns number of characters removed&lt;br /&gt;*/&lt;br /&gt;int trim(char *text)&lt;br /&gt;{&lt;br /&gt;    int i;&lt;br /&gt;    int len;&lt;br /&gt;    int retval=0;&lt;br /&gt;    len=strlen(text);&lt;br /&gt;    for&lt;br /&gt;    (&lt;br /&gt;      i=len-1;&lt;br /&gt;      i&gt;=0&amp;&amp;( text[i]==' ' || text[i]=='\t' );&lt;br /&gt;      i--&lt;br /&gt;    )&lt;br /&gt;    {&lt;br /&gt;        text[i]=(char)0;&lt;br /&gt;        retval++;&lt;br /&gt;    }&lt;br /&gt;    return retval;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It would not be too difficult to implement the possibility to trim other characters. Actually just an edition to 2 of the lines ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-6323874897449774973?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ffYyWiVyWFL1h0WI4iKS8U7Mczg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ffYyWiVyWFL1h0WI4iKS8U7Mczg/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/ffYyWiVyWFL1h0WI4iKS8U7Mczg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ffYyWiVyWFL1h0WI4iKS8U7Mczg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/dLFLtszBDhI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/6323874897449774973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/trim-in-c.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6323874897449774973?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6323874897449774973?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/dLFLtszBDhI/trim-in-c.html" title="rtrim() in C" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/trim-in-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0INQHYzeSp7ImA9WxdbF0U.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-3897106267792103694</id><published>2008-08-15T10:30:00.002+03:00</published><updated>2008-08-15T10:33:11.881+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-15T10:33:11.881+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="poem" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><title>Thoughts.</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Life.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Dawn. Surrounded by loving smiles.&lt;br /&gt;By caring, strong, safe people.&lt;br /&gt;You learn to trust them to be always there.&lt;br /&gt;You learn to love, love so much it hurts.&lt;br /&gt;&lt;br /&gt;But dawn never lasts forever.&lt;br /&gt;You carry them away, one by one.&lt;br /&gt;Saying goodbye.&lt;br /&gt;Never again - cruel, ruthless words.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Summer/Autumn 2008&lt;br /&gt;-Maz&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-3897106267792103694?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sEulOr0id-ngqc6SFQR4hG2II-E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sEulOr0id-ngqc6SFQR4hG2II-E/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/sEulOr0id-ngqc6SFQR4hG2II-E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sEulOr0id-ngqc6SFQR4hG2II-E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/Wzy3TIylUwk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/3897106267792103694/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/thoughts.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/3897106267792103694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/3897106267792103694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/Wzy3TIylUwk/thoughts.html" title="Thoughts." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/thoughts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIHSXoyfip7ImA9WxdUFk8.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-652106369783767529</id><published>2008-08-01T23:26:00.004+03:00</published><updated>2008-08-01T23:28:58.496+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-01T23:28:58.496+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="portability" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>Answer to C - Pitfalls part II</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;P&lt;/span&gt;&lt;span style="font-size:130%;"&gt;orting/p&lt;/span&gt;&lt;span style="font-size:130%;"&gt;ortability&lt;/span&gt;&lt;span style="font-size:130%;"&gt; issues regarding C/C++&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Allright. one of the big things in the programming today is portability. Windows is still the most common operating system in PCs, but  finally one can see some ineterst in big companies to also build some linux support in their applications. Mac is still alive too, and it is far cheaper to write software so, that you can use at least some common parts of it for all platforms. Another portability issue is different hardware architectures. 64 bit systems are increasing, and soon they will propably be more popular than traditional 32 bit architectures.&lt;br /&gt;&lt;br /&gt;So how does one create portable code? What things to consider?&lt;br /&gt;&lt;br /&gt;It all begins from planning. First of all you need to carefullly estimate what kind of general requirements there will be for your program, supprted platforms amongst others. After these are somehow clear, you need to decide which language you will use for your program.&lt;br /&gt;&lt;br /&gt;Let's assume you ended up needing support for many platforms, and both 32 and 64 bit architectures. Lets further assume, that for some odd reason, you deducted that best language to use is C. After you have reshecked your calculations, and still failed to find the error which led you to using C, you need to decide what should you do all by yourself, and where you should/can use 3.rd party libraries...&lt;br /&gt;&lt;br /&gt;So first step is to choose portable libraries. Fortunately there's many good libraries which can be used on multiple platforms, via similar interface. There's openGL &amp;amp; co. for graphics, there's pthreads for windows and unix threads, there's PoSIX sockets and winsock (which have some differencies in basic usage, but those can be quite easily hidden)... Plenty of good stuff.&lt;br /&gt;&lt;br /&gt;And what do you need to take in consideration while writing actual implementation? First you need to decide what compilers to use for which platforms. In linux world I can only see one reasonable possibility - gcc. But on windows... Well, this is a bit thougher. There is mingw version of gcc for windows, but I am really not that familiar with it, nor am I sure about the libraries available for it. There's also M$ Visual XXXXX family of compilers, and I've heard some of them are quite ok. But with M$ products you will propably get the world's most standards breaking product... And naturally that's bad for portability.&lt;br /&gt;&lt;br /&gt;What ever do you decide, you must be carefull with the functions you use. ANSI C functions should all be quite similar on both M$ compiler and GCC, but the excellent features of PoSIX standard interface offers are often quite cribbled on M$ side. As a good example, I need to ask what was wrong with snprintf()? Honestly? Why did M$ have to do _snprintf? Just to be a pain??&lt;br /&gt;&lt;br /&gt;And naturally there's those fundamental differences in the princibles of operating systems. For example in mapping the virtual memory for processes. Linux kernel may hide same physical addresses behind different virtual addresses in each process. Eg. Your perfectly valid pointer in one process pointing at your cleverly built data storage will be pointing at invalid location in other process. Thus making it meaningless to pass raw address data from one process to other. Also shared memory, signals, scheduling... all of these are different. And your application needs to tackle each of these problems. Hopeless mess? No, there is projects which have succeeded in quest of portability. Errorprone? Sure as hell. You need to plan things c*a*r*e*f*u*l*l*y beforehand. Hard but doable.&lt;br /&gt;&lt;br /&gt;Now in the pitfall II I said I'll show you one portability problem. But it was not problem related to porting software from one system to other, instead it was a problem related to making software to work both on 32 and 64 bit systems. Remember following:&lt;br /&gt;&lt;br /&gt;In 64 bit systems, forcing pointer to transform itself into a integer leads thy to death and destruction. Well, at least to segmentation faults.&lt;br /&gt;&lt;br /&gt;At 64 bit systems, pointer is 64 bits wide, not 32 as it is in 32 bit systems. So when you place such a pointer in integer (by casting), you'll lose half of the address...&lt;br /&gt;&lt;br /&gt;other issues to consider are:&lt;br /&gt;&lt;br /&gt;Structures which contain pointers, and which are populated by believing in knowing their size / accessing members by using hardcoded offsets.&lt;br /&gt;Functions which might return pointer or integer depending on situation.&lt;br /&gt;hardcoded bit shifts.&lt;br /&gt;&lt;br /&gt;And so on.&lt;br /&gt;&lt;br /&gt;But once again the night is falling in Finland, and I'd better get my head on pillow...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-652106369783767529?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hLR2O3d6wzVas5c5s_itO7f_GUo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hLR2O3d6wzVas5c5s_itO7f_GUo/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/hLR2O3d6wzVas5c5s_itO7f_GUo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hLR2O3d6wzVas5c5s_itO7f_GUo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/Ghzhst9_92A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/652106369783767529/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/answer-to-c-pitfalls-part-ii_01.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/652106369783767529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/652106369783767529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/Ghzhst9_92A/answer-to-c-pitfalls-part-ii_01.html" title="Answer to C - Pitfalls part II" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/answer-to-c-pitfalls-part-ii_01.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YCRHc4cSp7ImA9WxVaGUk.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-9140034797220366212</id><published>2008-08-01T20:44:00.004+03:00</published><updated>2009-04-17T09:19:25.939+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T09:19:25.939+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="explode()" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>C++ explode() function.</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please see efnx's modified version in comments, it is way more efficient than the original. (it does not use temporary vector, and copy it to store - instead it modifies the store vector straight away - which is way more efficient &amp;&amp; elegant)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As I have somewhere sometimes stated, I have been writing some php as a hobby. The evidence is &lt;a href="http://www.curlysworldoffreeware.com/"&gt;CWF Freeware&lt;/a&gt;. There's some really handy php functions out there for string manipulation. And since I once needed this, and because I've heard many other's have needed this too, I'll share it with you my readers. (Yes, with both of you :D)&lt;br /&gt;&lt;br /&gt;Just a compulsory disclaimer before representing it:&lt;br /&gt;&lt;br /&gt;This is one of the functions which I did when I was still a beginner with STL. So there's propably hundred's of more efficient and elegant solutions, and those may be posted in comments here. I'll be glad to see them. But since I happened to find this function from my archives now, I'll give it now. It may be buggy, it may be flawed, but it sure is better than having no explode() in C++ at all. (And yes, standard libraries do not offer explode function in C or C++).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* This one 'explodes' a string (cuts it into pieces based on some matchstring) and puts pieces into a vector. arguments are the string to be cutted, matchstring and the vector where to store pieces. It returns amount of pieces, and if no matchstring is found it returns -1. */&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;&lt;br /&gt;using std::string;&lt;br /&gt;using std::vector;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int explode(string tear_me,string cut,vector&lt;string&gt; &amp;store)&lt;br /&gt;{&lt;br /&gt;        unsigned int start=0;&lt;br /&gt;        int len=0;&lt;br /&gt;        int i=0;&lt;br /&gt;        vector&amp;lt;string&amp;gt; temp;&lt;br /&gt;&lt;br /&gt;        len=cut.length();&lt;br /&gt;        if(tear_me.find(cut)==string::npos)&lt;br /&gt;        {&lt;br /&gt;                return -1;&lt;br /&gt;        }&lt;br /&gt;        while( (start=tear_me.find(cut))!=string::npos)&lt;br /&gt;        {&lt;br /&gt;                temp.push_back(tear_me.substr(0,start));&lt;br /&gt;                tear_me.erase(0,start+len);&lt;br /&gt;                i++;&lt;br /&gt;        }&lt;br /&gt;        temp.push_back(tear_me);&lt;br /&gt;        store=temp;&lt;br /&gt;        return i;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-9140034797220366212?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LfwfygGB44jNPhZNA4eA2FJrLzg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LfwfygGB44jNPhZNA4eA2FJrLzg/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/LfwfygGB44jNPhZNA4eA2FJrLzg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LfwfygGB44jNPhZNA4eA2FJrLzg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/czx917dIwns" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/9140034797220366212/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/c-explode-function.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/9140034797220366212?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/9140034797220366212?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/czx917dIwns/c-explode-function.html" title="C++ explode() function." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/c-explode-function.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCRHY_eSp7ImA9WxdUFk0.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-4608301094217187110</id><published>2008-08-01T18:59:00.003+03:00</published><updated>2008-08-01T19:32:45.841+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-01T19:32:45.841+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="overflow" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>C/C++ - Pitfalls - part IV</title><content type="html">overflow. Almost as terrible as overrun.&lt;br /&gt;&lt;br /&gt;Another C writer's nightmare is overflow. We must remember that C does have fixed lenghts assigned to variable types. For example, short integer is 16 bits wide, and integer is 32. When we consider what this means in terms of 10-base numbers... Well, 32 bits, each of which can be 1 or 0. So largest number one can have in such a field, is 2^32. And when we think of signed integers, then its half of that, because the other half of possibilities are reserved for negative numbers. It is quite a big number, but it can be exceeded. Especially this is a problem in mathematical calculations, which often involve calculating large series of powers, which may get really large values. There's also other issues with mathematical programming, like accuracy of real numbers (as accurcy what comes to results, but also as accuracy what comes to comparing numbers), but I won't get into that.&lt;br /&gt;&lt;br /&gt;Just remember that when you overflow an signed integer, it results really negative value, and when you overflow unsigned integer, it results really tiny positive value. Also casting really large unsigned value to signed, will cause negative value... So beware - C is full of pitfalls :)&lt;br /&gt;&lt;br /&gt;Well, I'll once again give you something to ponder for a while:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Example of a common - yet dirty and dangerous habit.&lt;/span&gt;&lt;br /&gt;(No, I am not talking about smoking!)&lt;br /&gt;&lt;br /&gt;often one sees things like following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;typedef struct foosNbars&lt;br /&gt;{&lt;br /&gt;    int foo[20];&lt;br /&gt;    char bar[200];&lt;br /&gt;}foosNbars;&lt;br /&gt;&lt;br /&gt;foosNbars * obtain_foosNbars(unsigned int amount)&lt;br /&gt;{&lt;br /&gt;    foosNbars *fbs;&lt;br /&gt;    fbs=(foosNbars*)malloc(amount*sizeof(foosNbars));&lt;br /&gt;    if(NULL==fbs)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_ERR("could neither allocate foos nor bars", ErrType_noMem);&lt;br /&gt;        return (foosNbars *) NULL;&lt;br /&gt;    }&lt;br /&gt;    return fbs;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;HANDLE_ERR() is here just some custom error handler, which gets the error type, and handles it. It is not really relevant in here. So question is, what happens? What is the issue? Where is the problem?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-4608301094217187110?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/p4DftRqJab-JqGP1EowXFQZj2ME/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p4DftRqJab-JqGP1EowXFQZj2ME/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/p4DftRqJab-JqGP1EowXFQZj2ME/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p4DftRqJab-JqGP1EowXFQZj2ME/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/Jkg7AwdPLzE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/4608301094217187110/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/cc-pitfalls-part-iv.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4608301094217187110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4608301094217187110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/Jkg7AwdPLzE/cc-pitfalls-part-iv.html" title="C/C++ - Pitfalls - part IV" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/cc-pitfalls-part-iv.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8FRnwyeyp7ImA9WxdUFUs.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-1045070656952948790</id><published>2008-08-01T06:39:00.003+03:00</published><updated>2008-08-01T06:53:37.293+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-01T06:53:37.293+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="answer" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>Answer to C - Pitfalls part II</title><content type="html">Okay. It's about a time to continue answering to my own questions. So let's see.&lt;br /&gt;&lt;br /&gt;Problem with the kind of vector class usage I showed is that when a new item is inserted in a vector, vector may need to relocate all items into some other address space. If the space reserved for vector's contents is full, and no more space can be allocated from the back of the vector, vector will transfer all of it's contents in some new memory position where it can allocate a continuous block.&lt;br /&gt;&lt;br /&gt;So, now when we hand the address of an object to new thread, and add items to the vector in other thread, the vector may suddenly need to move the object into new memory position. The other thread naturally knows nothing about this, and the address we use in new thread to access the object will no longer point to the object. Hence the new thread may suddenly crash in odd place.&lt;br /&gt;&lt;br /&gt;Some ways to overcome this problem...&lt;br /&gt;&lt;br /&gt;1. If you know the maximum amount of objects that will be placed in vector, you can reserve space in the vector to that lenght, so that it does not need to reallocate new space when items are added. Problem is, that often we use STL containers like vectors, exactly because we do not know the amount of items..&lt;br /&gt;&lt;br /&gt;2. You can give the address of the vector itself as an argument to the thread. Vector's address should not change (even if the location of vector's contents does), so when you use the same vector in both threads, the changes in vector's contents locations will be known in both threads.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-1045070656952948790?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AJqSEQ-tCmfEs4WK6nyCkRaqTEo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AJqSEQ-tCmfEs4WK6nyCkRaqTEo/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/AJqSEQ-tCmfEs4WK6nyCkRaqTEo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AJqSEQ-tCmfEs4WK6nyCkRaqTEo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/sShnGlKS7nM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/1045070656952948790/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/08/answer-to-c-pitfalls-part-ii.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/1045070656952948790?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/1045070656952948790?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/sShnGlKS7nM/answer-to-c-pitfalls-part-ii.html" title="Answer to C - Pitfalls part II" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/08/answer-to-c-pitfalls-part-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEACSHs_eip7ImA9WxdUFUs.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-4822828573063160604</id><published>2008-07-28T22:16:00.005+03:00</published><updated>2008-08-01T06:52:49.542+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-01T06:52:49.542+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="answer" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>Answer to C - Pitfalls part I</title><content type="html">The first bug is in here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*get the bits which are not changed&lt;br /&gt;(bit's value will be inverted when&lt;br /&gt;XORed with bit 1)*/ &lt;/span&gt;&lt;br /&gt;tmp=(changedbits^(unsigned int)0x11111111);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Now, as explained in comment, the purpose is to set tmp to contain a value, where all bits which should remain same as in original value are 1, and all bits that should be changed to 0. Reason is that when we at next line use this value and AND operation with original value, we'll manage to set all bits which will be changed to 0. However the value 0x11111111 is not a value, where all bits are set to 1. A number starting with 0x is interpreted as hexadecimal value, and when we want to have a 32 bit wide value where all bits are set to 1, it is 0xFFFFFFFF.&lt;br /&gt;&lt;br /&gt;Second bug is more of principal. The implementation shown in example will change all bits which are non zero in 'changeto' variable - regardless the changedbits variable. Correct implementation would be:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;unsigned int changebytes(unsigned int const &amp;amp;real, unsigned int const &amp;amp;changedbits, unsigned int &amp;amp;changeto)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;{&lt;br /&gt;   unsigned int tmp,tmp2;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*get the bits which are not changed&lt;br /&gt;&lt;br /&gt;   (bit's value will be inverted when&lt;br /&gt;&lt;br /&gt;   XORed with bit 1)*/&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;   tmp=(changedbits^(unsigned int)&lt;span style="font-weight: bold;"&gt;0xFFFFFFFF&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*null the bits which will be changed.&lt;br /&gt;   (AND will set result to zero, if one of the bits&lt;br /&gt;   'anded' is zero).*/&lt;/span&gt;&lt;br /&gt;   tmp2=(real &amp;amp; tmp);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*add th&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;e bits &lt;span style="font-weight: bold;"&gt;which sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;&lt;span style="color: rgb(0, 153, 0);"&gt;ould be changed&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; fr&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;om &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    changeto in the tmp&lt;br /&gt;&lt;br /&gt;   (OR will 'sum' the bytes).*/ &lt;/span&gt;&lt;br /&gt;   return (tmp2 | (&lt;span style="font-weight: bold;"&gt;changeto &amp;amp; changedbits&lt;/span&gt;));&lt;br /&gt;} &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-4822828573063160604?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gUiWttjYpw4TgqWoUE7_39-SNbI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gUiWttjYpw4TgqWoUE7_39-SNbI/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/gUiWttjYpw4TgqWoUE7_39-SNbI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gUiWttjYpw4TgqWoUE7_39-SNbI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/xykRw5u9svM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/4822828573063160604/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/answer-to-c-pitfalls-part-i.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4822828573063160604?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4822828573063160604?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/xykRw5u9svM/answer-to-c-pitfalls-part-i.html" title="Answer to C - Pitfalls part I" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/answer-to-c-pitfalls-part-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEMRX8-eip7ImA9WxdUEUU.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-7040068586686893608</id><published>2008-07-27T22:08:00.008+03:00</published><updated>2008-07-27T22:41:24.152+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-27T22:41:24.152+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="portability" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>C/C++ - Pitfalls - part III</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Make y&lt;span class="postbody"&gt;our c&lt;/span&gt;&lt;span class="postbody"&gt;ode t&lt;/span&gt;&lt;span class="postbody"&gt;o w&lt;/span&gt;&lt;span class="postbody"&gt;ork &lt;/span&gt;&lt;span class="postbody"&gt;on multiple machines, f&lt;/span&gt;&lt;span class="postbody"&gt;or as l&lt;/span&gt;&lt;span class="postbody"&gt;ong as p&lt;/span&gt;&lt;span class="postbody"&gt;ossible.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="postbody"&gt;Even th&lt;/span&gt;&lt;span class="postbody"&gt;ough the C-language is well standardized, there's still many pitfalls regarding c&lt;/span&gt;&lt;span class="postbody"&gt;ode p&lt;/span&gt;&lt;span class="postbody"&gt;ortability. First &lt;/span&gt;&lt;span class="postbody"&gt;of all, with pure ANSI C it is really hard t&lt;/span&gt;&lt;span class="postbody"&gt;o create any graphical applicati&lt;/span&gt;&lt;span class="postbody"&gt;ons. Real pr&lt;/span&gt;&lt;span class="postbody"&gt;ogram writing usually relies up&lt;/span&gt;&lt;span class="postbody"&gt;on s&lt;/span&gt;&lt;span class="postbody"&gt;ome extensi&lt;/span&gt;&lt;span class="postbody"&gt;ons, Eg. libraries n&lt;/span&gt;&lt;span class="postbody"&gt;ot  bel&lt;/span&gt;&lt;span class="postbody"&gt;onging in standard C. Luckily there's many libraries which are available f&lt;/span&gt;&lt;span class="postbody"&gt;or multiple platf&lt;/span&gt;&lt;span class="postbody"&gt;orms.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But even if we put that pr&lt;/span&gt;&lt;span class="postbody"&gt;oblem aside, we will find issues which may limit &lt;/span&gt;&lt;span class="postbody"&gt;our c&lt;/span&gt;&lt;span class="postbody"&gt;ode's p&lt;/span&gt;&lt;span class="postbody"&gt;ortability. I will n&lt;/span&gt;&lt;span class="postbody"&gt;ow represent &lt;/span&gt;&lt;span class="postbody"&gt;one such thing because this must be n&lt;/span&gt;&lt;span class="postbody"&gt;oticed when &lt;/span&gt;&lt;span class="postbody"&gt;one wishes his c&lt;/span&gt;&lt;span class="postbody"&gt;ode t&lt;/span&gt;&lt;span class="postbody"&gt;o be w&lt;/span&gt;&lt;span class="postbody"&gt;orking &lt;/span&gt;&lt;span class="postbody"&gt;o&lt;/span&gt;&lt;span class="postbody"&gt;n different machines.&lt;br /&gt;&lt;br /&gt;Back when things were simpler, I am&lt;/span&gt;&lt;span class="postbody"&gt;ongst many &lt;/span&gt;&lt;span class="postbody"&gt;others used this kind &lt;/span&gt;&lt;span class="postbody"&gt;of functi&lt;/span&gt;&lt;span class="postbody"&gt;ons f&lt;/span&gt;&lt;span class="postbody"&gt;or calculating mem&lt;/span&gt;&lt;span class="postbody"&gt;ory addresses.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt; void * get next_one(void **ptr, size_t sizeofobj)&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int address=(int)(*ptr); //store the address in integer &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address+=(int)sizeofobj; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (void *)address; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; }  &lt;/span&gt;&lt;span class="postbody"&gt;&lt;/span&gt;&lt;span class="postbody"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As we see, ab&lt;span class="postbody"&gt;owe functi&lt;/span&gt;&lt;span class="postbody"&gt;on simply calculates a s&lt;/span&gt;&lt;span class="postbody"&gt;pecific mem&lt;/span&gt;&lt;span class="postbody"&gt;ory&lt;/span&gt;&lt;span class="postbody"&gt; address. H&lt;/span&gt;&lt;span class="postbody"&gt;owever, since c&lt;/span&gt;&lt;span class="postbody"&gt;omputers are n&lt;/span&gt;&lt;span class="postbody"&gt;ot same as they used t&lt;/span&gt;&lt;span class="postbody"&gt;o be, this n&lt;/span&gt;&lt;span class="postbody"&gt;owadays intr&lt;/span&gt;&lt;span class="postbody"&gt;oduces p&lt;/span&gt;&lt;span class="postbody"&gt;ossible hazards... Can y&lt;/span&gt;&lt;span class="postbody"&gt;ou sp&lt;/span&gt;&lt;span class="postbody"&gt;ot the r&lt;/span&gt;&lt;span class="postbody"&gt;o&lt;/span&gt;&lt;span class="postbody"&gt;ot &lt;/span&gt;&lt;span class="postbody"&gt;of the pr&lt;/span&gt;&lt;span class="postbody"&gt;oblem?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-7040068586686893608?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CV3BKoo2-vBNlX9XXEkK0CFWkUY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CV3BKoo2-vBNlX9XXEkK0CFWkUY/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/CV3BKoo2-vBNlX9XXEkK0CFWkUY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CV3BKoo2-vBNlX9XXEkK0CFWkUY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/9hUp6SPQj5E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/7040068586686893608/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/cc-pitfalls-part-iii.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/7040068586686893608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/7040068586686893608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/9hUp6SPQj5E/cc-pitfalls-part-iii.html" title="C/C++ - Pitfalls - part III" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/cc-pitfalls-part-iii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8EQH8yeCp7ImA9WxdUEUg.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-543485960648483342</id><published>2008-07-27T11:46:00.010+03:00</published><updated>2008-07-27T13:00:01.190+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-27T13:00:01.190+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="vector" /><category scheme="http://www.blogger.com/atom/ns#" term="memory violation" /><category scheme="http://www.blogger.com/atom/ns#" term="segmentation fault" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>C/C++ - Pitfalls - part II</title><content type="html">&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Memory violations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;okay, let's now check a way to really mess things with bad design... Following bug actually demonstrates nastyness of C/C++, it is terribly easy to create numerous annoying bugs, which strike only occasionally. Memory violations. That's a word every C/C++ programmer should be afraid of. No, actually terrified.&lt;br /&gt;&lt;br /&gt;Nastynes of memory violations is in the way they emerge. A code can be successfully executed numerous of times, and then suddenly it once crashes. Reason for such behaviour is the way operating system protects memory areas.&lt;br /&gt;&lt;br /&gt;When a program is first launched, certain amount of memory is allocated for the process. It is perfectly ok to write/read anywhere inside that allocated memory chunck. Let's now assume we have somehow messed our code so that it writes in random memory location (There's really many ways to actually do this... And I bet every programmer has sometimes done such a bug.) It is fairly possible that our random location happens to be in memory chunck which was allocated for the process' use. So operating system think there was nothing wrong with the write. How ever it may be that we just overwritten some critical information, and that may cause a crash in arbitrary position in the code. Thus locating the real cause is not easy. It may as well be that we managed to write in allocated but unused space. Then it may be that our program completes flawlessly. It may also be that we just wrote in space which was protected by operating system. That will cause instant crash. Unfortunately even if we once can run the program flawlessly, it may well be that it missbehaves, or crashes next time we run it. When you create commercial program, it is not really appreciated amongst customers if your code crashes... And it may do that regardless of carefull testing.&lt;br /&gt;&lt;br /&gt;Hence, beware the memory violations.&lt;br /&gt;&lt;br /&gt;So let's now see one hideous way to create nasty memory violation...&lt;br /&gt;I once almost did this mistake, but then... A thought stroke my head. How does vector class internally operate? And there's a bug related to this issue in the principle presented in my example below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;vector&lt;/span&gt;&lt;object style="font-family: courier new;"&gt; objvector;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;objvector.push_back(obj A);&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;objvector.push_back(obj B);&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;//Create thread with entrypoint void * newthreadfunc(obj *);&lt;br /&gt;// give &amp;amp;objvector[N] as an argument.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;objvector.push_back(obj C)&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void * newthreadfunc(obj *)&lt;br /&gt;{&lt;br /&gt;  //do things&lt;br /&gt;  //do more things&lt;br /&gt;  //Do something with objvector&lt;br /&gt;  return something;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So what is the principal fault in this kind of approach?&lt;br /&gt;(Idea was of course to use the same object in both threads, which would have been perfectly ok when correct semaphore protection would have been used. This time it has something to do with vector class' internal operation...).&lt;br /&gt;&lt;/span&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-543485960648483342?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Tz5ISVEcmaaPJoir1ffCuS6BI3Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tz5ISVEcmaaPJoir1ffCuS6BI3Q/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/Tz5ISVEcmaaPJoir1ffCuS6BI3Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tz5ISVEcmaaPJoir1ffCuS6BI3Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/rLG75JkjcHU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/543485960648483342/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/cc-pitfalls-part-ii.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/543485960648483342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/543485960648483342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/rLG75JkjcHU/cc-pitfalls-part-ii.html" title="C/C++ - Pitfalls - part II" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/cc-pitfalls-part-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcCQH05eSp7ImA9WxdUEUg.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-6789527085570209015</id><published>2008-07-27T09:07:00.022+03:00</published><updated>2008-07-27T13:04:21.321+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-27T13:04:21.321+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="bitwise operations" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="Bit masking" /><title>C-pitfalls in which I have fallen.. Spot the Bug part I</title><content type="html">&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have been writing C/C++ code for my work for over 4 years now. Yet I tend to do simple mistakes. How is that possible? Well, because C is full of pitfalls...&lt;br /&gt;&lt;br /&gt;I will post some buggy codes here, as warning examples. I will not tell what the bugs are - yet. I will reveal that later in this blog, so you can try finding the problems yourself :) And naturally solutions can be posted in comments.&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 style="font-weight: normal;"&gt;So mistake 1. It was a simple bit masking in C.&lt;/h3&gt;&lt;br /&gt;I had an unsigned int coming in a function, and I wanted to replace certain bytes from it. So I decided that I'll write a function, which gets the original unsigned int, indication about which bytes should be changed, and what those bytes should be changed to.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;0xXXXXXXXX original value&lt;br /&gt;0x00FF0000 bits to change&lt;br /&gt;0x00AB0000 What to change the bits.&lt;br /&gt;Result: 0xXXABXXXX&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;unsigned int changebytes(unsigned int const &amp;amp;real, unsigned int const &amp;amp;changedbits, unsigned int &amp;amp;changeto)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;{&lt;br /&gt;unsigned int tmp,tmp2;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*get the bits which are not changed&lt;br /&gt;(bit's value will be inverted when&lt;br /&gt;XORed with bit 1)*/ &lt;/span&gt;&lt;br /&gt;tmp=(changedbits^(unsigned int)0x11111111);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*null the bits which will be changed.&lt;br /&gt;(AND will set result to zero, if one of the bits&lt;br /&gt;'anded' is zero).*/&lt;/span&gt;&lt;br /&gt;tmp2=(real &amp;amp; tmp);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    /*add changeto bits in the tmp&lt;br /&gt;(OR will 'sum' the bytes).*/ &lt;/span&gt;&lt;br /&gt;return (tmp2 | changeto);&lt;br /&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, this actually introduces (at least) 2 bugs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-6789527085570209015?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4bNRBYJ2uujZfGqX4clyuX1ABOE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4bNRBYJ2uujZfGqX4clyuX1ABOE/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/4bNRBYJ2uujZfGqX4clyuX1ABOE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4bNRBYJ2uujZfGqX4clyuX1ABOE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/oj4sPwgqC8Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/6789527085570209015/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/c-pitfalls-in-which-i-have-fallen-spot.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6789527085570209015?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/6789527085570209015?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/oj4sPwgqC8Q/c-pitfalls-in-which-i-have-fallen-spot.html" title="C-pitfalls in which I have fallen.. Spot the Bug part I" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/c-pitfalls-in-which-i-have-fallen-spot.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAHSXwzfip7ImA9WxdUEU0.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-7897584087360678953</id><published>2008-07-26T22:49:00.000+03:00</published><updated>2008-07-26T23:38:58.286+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-26T23:38:58.286+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fixing" /><category scheme="http://www.blogger.com/atom/ns#" term="car" /><category scheme="http://www.blogger.com/atom/ns#" term="MOT" /><category scheme="http://www.blogger.com/atom/ns#" term="Nissan Primera SLX P11 -99" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><title>Having nothing to do? Get a car...</title><content type="html">24-25.07.2008&lt;br /&gt;&lt;br /&gt;Thursday... It is wet. I am sitting in my car, driving back to home from work. Suddenly I notice the warning light telling there's something wrong with my ABS brakes. Damn. Occasionally I hate my life.&lt;br /&gt;&lt;br /&gt;I have cranky old Nissan Primera SLX, with 2 litres engine. Well oldness is of course subjective matter, as is crankyness.. A few years ago I was driving Mazda 323 from 1985.. This one is done at 1999.&lt;br /&gt;&lt;br /&gt;The ABS light itself did not really scare me. It had been acting up since last autumn, turning on when ever weather was humid. But the light had been silent almost a month, and I knew I had to drive my car for the compulsory annual inspection (is it MOT in english?) tomorrow...&lt;br /&gt;&lt;br /&gt;Actually, I was terrified. I had started fixing my Nissan 2 months ago, when I changed the exhaust system since there were a leak. It's strange how each simple sounding task with car always turns out to be complicated. The exhaust system change involved totally jammed bolt, drilling it out under the car, replacing it with bigger bolt, and generally spending a whole summer day with my uncle cursing the car. (Thank's god I have my uncle, not only is he friendly and caring and funny person, but he also has the knowledge, tools and nerves for fixing cars).&lt;br /&gt;&lt;br /&gt;Well, quite soon after changing the exhaust I tried to pass MOT (is it really called that??)... And naturally there were problems with everything else. Brake plates were too worn, handbrake did not work on other side, and the thing which is at the far end of the stick which turns the front wheels was loose... And naturally I had forgot to change pulbs so half of the lights were dark...&lt;br /&gt;&lt;br /&gt;So a week ago I found myself being under my car with my uncle once again.. (Did I remember to thank him already? He's really my saver). We changed the brake plates, and that steering related thing. And of course there were unexpected problems, like jammed part in brakes... (The one which allows the brake to squeeze the plate, I mean that ~2 inch long stick which is kinda floating on vaseline). Replacing it was not that straightforward wither, it involved standing at the yard of closed spare part shop (in which I had called a few days before and ensured it was open on saturdays...), calling to the shop's owner's wife and asking her to call someone to sell us the missing part .... pleeeaseeee...&lt;br /&gt;&lt;br /&gt;Well, I stared the ABS warning light shocked. Can't be I thought. I drove at home, did my daily things with kids, and get them to bed at 10.00 PM. Then I went out to take a look at the car. I started the engine, and after a little while the ABS light started burning... I shut down the engine and restarted.. No warning light. I decided to test the brakes just to be sure. Worked like charm. I decided to test the handbrake too, just to be sure... And right side did not work too well.&lt;br /&gt;&lt;br /&gt;I was ready to take the biggest hammer I own (which actually is not too big, I only own one :D )..&lt;br /&gt;&lt;br /&gt;Well, I took my jack, lifted the right rear and took the tire off. I checked the thing where the handbrake's wire is connected, and as I guessed, it was not moving too well... So oil and hammer, oil and hammer, oil and pulling and bushing the handbrake on and off like a maniac. Putting tyre back and lowering the car. Small test, and voila, handbrake worked...&lt;br /&gt;&lt;br /&gt;At the friday morning I drove back at work once again. The ABS light was dead as it should. I had decided to drive my car for inspection after the workday was off. I was a bit excited my whole work day. I tried to think what kind of requirements supporting multiple processes in Linux would cause in SW, which was previously designer to be run on a system which does map the memory addresses similarly for each process. Somehow I however ended up just doing little this and that, amongst other things I swapped couple of my co-workers screensavers with the&lt;br /&gt;"All work and no play makes Jack a dull boy" one... It's their own fault to have holidays when I am working. And moreover it's their own fault to have their .xscreensaver file unprotected...&lt;br /&gt;&lt;br /&gt;Finally it was time to leave from work. I walked down to the car, and started the engine... ABS light turned on instantly, and brakes locked when I tested them. I pumbed the brake, turned car on and off, turned all electrical devices off and on, and finally the ABS light turned off and did not turn on anymore.. I drowe to the inspection, and felt sick while waiting for the inspector to step in my car and drive it to brake tester... Finally a friendly man told me it was my car's turn, stepped in my car and drowe it to tester. I watched the meter when he tested the car, and thank god, the results looked good. The inspector drove out of the tester, and yelled me through the window that I had "excellent brakes". I was ready for bursting into hysterical laughter, but I managed to controll myself and just mumbled: "I have been working with them"...&lt;br /&gt;&lt;br /&gt;Then quick check for rest of the car, and papers out of the printer with comforting PASSED printed on them...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-7897584087360678953?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xbrcQjgt8OpAjeTchaqGg92gTd8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xbrcQjgt8OpAjeTchaqGg92gTd8/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/xbrcQjgt8OpAjeTchaqGg92gTd8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xbrcQjgt8OpAjeTchaqGg92gTd8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/69BgeczT-uk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/7897584087360678953/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/having-nothing-to-do-get-car.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/7897584087360678953?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/7897584087360678953?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/69BgeczT-uk/having-nothing-to-do-get-car.html" title="Having nothing to do? Get a car..." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/having-nothing-to-do-get-car.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4DSH8_fip7ImA9WxdUEU0.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-4618009671064375575</id><published>2008-07-26T22:10:00.001+03:00</published><updated>2008-07-27T00:49:39.146+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-27T00:49:39.146+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CWF Freeware" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><category scheme="http://www.blogger.com/atom/ns#" term="coding" /><title>A day with kiddos...</title><content type="html">26.07.2008&lt;br /&gt;&lt;br /&gt;It was heck of a good weather today. Just a weather you would hope there was whne you're having a bachelor parties. No, today was not a day when I have my bachelor parties, but at the 09.30 AM a motorbike rushed to our yard and took my wife-to-be to have her bachelor parties...&lt;br /&gt;&lt;br /&gt;It means I was having a day together with kids.&lt;br /&gt;&lt;br /&gt;I decided I'll try to write some code for the &lt;a href="http://www.curlysworldoffreeware.com/"&gt;CWF&lt;/a&gt; today. After all, I have a bugtracker full of bugs and feature requests there, and I had neglected CWF for far too long. I know I have all the excuses in the world to not spend time developing CWF (studies, work, kids, weddings approaching...), but even if those reasons were good enough for others to forgive me my absence, they are not good enough for me to accept unfinished task. So after spending some hours with kids at the yard, I put them to have their daily naps...&lt;br /&gt;&lt;br /&gt;I took the laptop, and started the notepad++. I was a bit annoyed because I could not use my desktop running linux and having all my real developing tools installed ( vi ). It is located in my older son's room, and I had just put him to sleep.&lt;br /&gt;&lt;br /&gt;Well Well Well. I checked the bug tracker, and decided I would next do the 'user comments' section for CWF's game info pages. Eg a section where users can leave comments about games.&lt;br /&gt;&lt;br /&gt;It hadbeen a few months since I last touched CWF's code, and I was a bit rusty. I sweated and sweared. Have I ever mentioned CWF's code is a horrible mess? The whole project started all wrong.&lt;br /&gt;&lt;br /&gt;CWF begun when group of members of an abandonware site, which was abandoned by the admin, decided to find a new place to hang out. Unfortunately the starter did a baddish choise by installling phpbb plus board... And later I did an horrendous error by starting to write the actual site on top of the heavily modified phpbb2 forums engine.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Hey phpbb2 guys (as if you would ever read this :rolleyes: ) do not take it wrong. I do respect the work you've done. The phpbb2 forum works, and it is easy to use even for totally computer illiterate persons, but you must admitt it is not designed to be a framework for developing wholly new website...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ok. I should not blame the phpbb2 only, there's far more critical things which lead the CWF code to be a mess. Main reason is, that CWF was my first real php project. And it still is. I have never read a single book about php, or had a single course about it. So I was (and in some sense I still am) a novise what comes to php or web publishing. &lt;i&gt;As I have stated, I work with WCDMA/WIMAX base station project, and write C &amp;amp;&amp;amp; C++.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, after a few cups of coffee, I was back on the track and started writing a class for handling comments. or actually 2 classes, one to act as a struct in C (having comment data in a srtuct), and the other to handle storing and fetching the comments from database to the 'struct'. I then also decided to add dumping the data to template in the class too. Then I added a few lines to the actual game info page, (include for class, class creation and comments fetching and displaying using the created object). Finally I added a php script which handles data sent when  sending new  comments/editing comments.&lt;br /&gt;&lt;br /&gt;So what is still lacking is the template files for editing comments, and displaying/sending new comments. But since I sincerely hate creating templates, it may take a few days-weeks to complete them... If only CWF could attarct some capable, freeware ebthusiast php coder who knows phpbb2... I would gladly split the work with someone...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-4618009671064375575?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yytUQGmx8c08tUHohZNX4GMxqFY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yytUQGmx8c08tUHohZNX4GMxqFY/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/yytUQGmx8c08tUHohZNX4GMxqFY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yytUQGmx8c08tUHohZNX4GMxqFY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/KR8Jdqwwac4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/4618009671064375575/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/day-with-kiddos.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4618009671064375575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/4618009671064375575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/KR8Jdqwwac4/day-with-kiddos.html" title="A day with kiddos..." /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/day-with-kiddos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ARHw6cSp7ImA9WxdUEU0.&quot;"><id>tag:blogger.com,1999:blog-7504511492363291122.post-3606913387733374360</id><published>2008-07-26T22:05:00.000+03:00</published><updated>2008-07-26T23:40:45.219+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-26T23:40:45.219+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="diary" /><category scheme="http://www.blogger.com/atom/ns#" term="Maz" /><title>About Me</title><content type="html">&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;/span&gt;Since this is going to be kind of a diary, I decided first tell who the heck am I...&lt;br /&gt;&lt;br /&gt;It all begun at 12.03.1979 in smallish town called Iisalmi in Finland. Around 03.00 AM I was born, and ever since I have loved doing things at night, and sleeping at day.. However since my first kid was born at 2005, I have not really managed to sleep at daytime, resulting me to sleep hardly at all. Well, sleeping is waste of time anyways ;)&lt;br /&gt;&lt;br /&gt;When I was 4 years, my parents decided to say farewell to Iisalmi, and moved to the most distant place in Finland - to Enontekiö. It is muncipality at the northern finland. A place with lot's of rough beauty and fresh air, and with lot's of nothing to do besides fishing and hunting. So inevitably I grew up doing both of them, and I still love those cold autumn mornings when I wake up at forest with snow on my nose...&lt;br /&gt;&lt;br /&gt;After serving the compulsory military service at 1999, I moved to Oulu, which is almost middle of the Finland considering north-south direction, but at the west coast. I started my physics studies here, and those are still unfinished... Hopefully not forever.&lt;br /&gt;&lt;br /&gt;When I add that I have always been facinated by computers and games, it propably explains my current interests - Nature, Science, Technology and Computers &amp;amp;&amp;amp; Programming.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;Unfortunately regardless my former cross-country skiing hobby never continued after army - all I got from it is a cabinet full of medals and spoons. I wish I could still run for a while, without feeling that if I take one step more, I'll die...&lt;br /&gt;&lt;br /&gt;However, that's quite a lot information about me, I guess far more than you cared to know...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7504511492363291122-3606913387733374360?l=maz-programmersdiary.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Rs8hgYDiZV75-WXiWhn4UKIXHGw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rs8hgYDiZV75-WXiWhn4UKIXHGw/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/Rs8hgYDiZV75-WXiWhn4UKIXHGw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rs8hgYDiZV75-WXiWhn4UKIXHGw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/aRiDj/~4/vMA3qNIkW1E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://maz-programmersdiary.blogspot.com/feeds/3606913387733374360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://maz-programmersdiary.blogspot.com/2008/07/about-me.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/3606913387733374360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7504511492363291122/posts/default/3606913387733374360?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/aRiDj/~3/vMA3qNIkW1E/about-me.html" title="About Me" /><author><name>Maz</name><uri>http://www.blogger.com/profile/03774313944609044806</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://maz-programmersdiary.blogspot.com/2008/07/about-me.html</feedburner:origLink></entry></feed>

