Pages

Monday, November 19, 2012

துப்பாக்கி

நெடுநாட்கள் கழித்து விசய் நடித்த திரைப்படம் ஒன்றை பார்த்தேன். அந்த அனுபவத்தை உங்களுடன் பகிர விழைகிறேன். திருமலை மற்றும் அதன் பிறகு அதே போன்று அல்லது அதே திரைப்படம் வேறு பெயர்களில் வெளிவந்த பொது அவற்றை பார்த்து மனமுடைந்து மீண்டும் தற்கொலைக்கு முயலக்கூடாது என்று சபதமெடுத்து இதுநாள் வரை விசய் நடித்த திரைப்படங்களை தவிர்த்து வந்தேன். சமீபத்தில் வெளிவந்த நண்பன் திரைப்படத்தை அது விசய் படமல்ல சங்கரது படம் என்று என் நண்பர்கள் பலமுறை தைரியம் கூறியும், அதனை இந்தியிலேயே சப்-டைட்டிலுடன் பார்த்து திருப்திகொண்டேன். அப்படிப்பட்ட நான் இந்த துப்பாக்கி படம் பார்க்க சென்றதுக்கு ஒரே காரணம் அம்மாவின் நூறாண்டு சாதனை ஆட்சி. எங்கள் வீட்டில் இன்வெர்ட்ர் இருந்தும் கேபிள் நிலையத்தில் இன்வெர்டர் இல்லாத காரணத்தால் வேறுவழியின்றி துப்பாக்கி படத்திற்கு சென்றேன்.

திரையரங்கிற்கு சென்ற எனக்கு டிக்கெட் விலை ஏனோ சிறு தடுமாற்றத்தை ஏற்படுத்தியது. ஆனாலும் பெங்களூரில் முன்னூறு ரூபாய்க்கு skyfall படம் பார்த்ததை நினைத்து சுதாரித்துக்கொண்டு டிக்கெட் வாங்கினேன். நான் உள்ளே செல்லும் பொது ஏற்கனவே படம் தொடங்கியிருந்தது. "இளைய தளபதி டாக்டர் விசய் நடிக்கும்" என்ற வார்த்தைகளின் ஒருங்கிணைந்த அழகை கண்டுரசிக்கும் பாக்கியத்தை இழந்து டிக்கெட் விலையில் பாதியில் வீணடிதிருந்தது அப்பொழுதான் புரிந்தது.


முதல் காட்சியிலேயே விசய் யாரையோ குத்திக்கொண்டு இருந்தார். தவறாக நினைக்க வேண்டாம், யாருடனோ சண்டை போட்டுக்கொண்டிருந்தார். திருப்பி அடித்தால் படத்தின் இதர காட்சிகளை படமாக்க விசய் இருக்கமாட்டார் என்ற காரணத்தினாலோ என்னவோ அந்த நபர் கடைசிவரை அடி வாங்கிக்கொண்டே இருந்தார். அந்த காட்சிகளில் விசயின் பராக்கிரமத்தை விட ஒளிப்பதிவும் கலையும் அதிகம் பேசியிருந்தன. மற்றும் எ.ஆர்.முருகதாஸ் என்ற பெயர் திரைகதை  மீது நம்பிக்கை ஏற்படுத்தியது. ஆதலால் நான் பயந்த ஒரே விசயம் விசய் தான்.

ஆரம்ப பெண்பார்க்கும் காட்சிகளில் விசய் சற்று ஓவர் ஆக்டிங் செய்திருந்தாலும் காஜல் அகர்வால் மேலும் அதிகமாக நடித்து விசய்க்கு மதிப்பெண் வாங்கிக்கொடுத்திருக்கிறார். காஜல் அகர்வாலிடம் இருப்பது ஒன்றே ஒன்றுதான். அந்த ஒன்றும்  ஒன்றில் இரண்டானது. புரிந்திருக்கும் என்று நினைக்கிறேன். அதனை தேவையான அளவிற்கு பயன்படுத்தியிருந்தார் அல்லது காட்டியிருக்கிறார் என்று கூறலாம். ஒளிப்பதிவாளரும் அதற்க்கு மிகவும் துணைபுரிந்திருந்தார். மற்றபடி காஜலுக்கு வேறு சிறப்பான பணிகள் எதுவும் வழங்கப்படவில்லை.

நண்பன் படத்தில் கலக்கிய சத்யனுக்கு இந்த படத்தில் முக்கியத்துவம் சற்று குறைவாகவே இருந்தது. விசய்க்கு அதிக ரியாக்சன்கள் வராது என்ற காரணத்தினால், விசயின் முக பாவங்களை சத்யன் முகத்தை கடன் வாங்கி காட்டியிருந்தார் இயக்குனர். துப்பாக்கி படத்தில் காவல் உதவி ஆய்வாளராக வரும் சத்தியனுக்கு கடைசி வரை ஒருமுறை கூட துப்பாக்கி கொடுக்கப்படவில்லை என்பது கண்டனத்திற்குரியது. மேலும் மும்பையில் இருந்தாலும் தமிழ் போலீஸ் என்றால் தொப்பை இருக்கும் என்பதை சத்யன் மூலமாக இயக்குனர் தைரியமாக எடுத்துரைக்கிறார்.

கிளைமாக்ஸ் காட்சிகளை கில்லி படத்திலிருந்து உருவியிருப்பது வெட்ட வெளிச்சமாக தெரிகிறது. கிளைமாக்ஸ் காட்சிகளை மாற்றும்பொழுது 'காரசிங்கம் A/C' திரையரங்கில் மிகுந்த வரவேற்பை பெறகூடும். ஆனால் இந்த முறை வில்லனை உசுப்பேற்றுவதற்கு கதாநாயகி பயன்படுத்தப்படவில்லை. கதாநாயகி ரசிகர்களை உசுப்பேற்ற மட்டுமே பயன்பட்டுள்ளர் என்பது வேறு விஷயம். கில்லி படத்தை ஒப்பிடுகையில் துப்பாக்கியில் விசய் நுடவைதியத்தில் சற்று தேர்ச்சிபெற்று தெரிகிறார். டாக்டர் பட்டம் பெற்ற பிறகு ஏற்பட்ட அனுபவத்தின் காரணமாக இருக்கலாம்.

மட்ட்றபடி லோடு ஆன துப்பாக்கியை மீண்டும் மீண்டும் லோடு செய்வதால் துப்பாக்கிக்கு ஸ்டார்டிங் டிரபுள், ஞாபக மறதி போன்ற வியாதிகள் இருக்குமோ என்று சந்தேகிக்க தோன்றுகிறது. டி.ஐ.எ, சிலீப்பர் செல்ஸ், பிளாஸ்டிக் எக்ஸ்புளோசிவ், மைக்ரோசிப் போன்ற வார்த்தைகளை அதிகமாக பிரயோகப்படுதியிருப்பது viva எக்சாம்களை ஞாபப்படுதுகிறது. பன்ச் டயலாக் வேண்டும் என்று விசய் அடம்பிடித்து கேட்டதால் கொடுக்கப்பட்ட "ஆயிரம் பேரை கொல்ல நினைக்கும்..." என்ற வசனம் கைதட்டல்களுக்கு உரித்தானது.

கடைசிவரை இங்கு ஜெயராம் பற்றி பேசவே தோன்றவில்லை. படத்தில் அவருடைய பகுதியும் அவ்வாறே இருந்தது.

இறுதியில் இந்த விமர்சனத்தை எழுதும் அளவிற்கு நான் நல்ல மனநிலையில் இருப்பதால் மற்ற விசய் படங்களை விட துப்பாக்கி சிறப்பாகவே இருக்கிறது என்ற முடிவுக்கு வரவேண்டியுள்ளது.

நாள்: 17-Nov-2012
இடம்: பட்டுக்கோட்டை அன்னபூர்ணா திரையரங்கம்

Wednesday, September 5, 2012

GUI developed for B's sudoku

     Earlier in the previous month I have written a post about simple brute algorithm for sudoku. Even that was a working one, using that will be little tedious. Because you have to enter elements one by one. And if it went wrong somewhere, you have to start from the beginning. So I made a gui for that. It is a fully functional implementation. But it is not up to the level of a commercial application.

     Download the application here. Or download the source here and build it yourself.

Custom Kernel with CentOS

     Custom kernel in CentoOS is highly unrecommended by the CentOS team. I don't know the reason. They may want you to rely on them all the day or may be because of some security issues. But Linux is not an End User Operation System. And Linux users (can be called as Hackers sometimes) don't always following rules and recommendations. Sometimes won't even read them.

     I am using CentOS-5.8, which is running Linux-2.6.18 kernel. I want to install 2.6.35 kernel in that. I downloaded the source and did make menuconfig, make and make install. Everything went well and entry has been added in /boot/grub/menu.lst. But when I was booting with that kernel, it showed an error mount: could not find filesystem like this. The solution is very simple. Just enable CONFIG_SYSFS_DEPRECATED_V2.

#make menuconfig
Set "General Setup —> enable deprecated sysfs features". Or after doing make menuconfig, open .config file and grep for CONFIG_SYSFS_DEPRECATED_V2. Then replace that line with CONFIG_SYSFS_DEPRECATED_V2=y. And now build the kernel as usual.

#make
#make modules
#make modules_install
#make install
 Reboot with the newly installed kernel.

Friday, August 31, 2012

DNS setup in BSD machine

     Earlier I have written a blog about setting up DNS server in CentOS. You can find that here. And today I was given a task to do the same in BSD machine. wtf! Even BSD is an UNIX variant, it is not Linux. So the problem it will not have much different but a little. We have find that little one. Like earlier, I didn't find any simple method to setup dns.

     The concept is same as we did in Linux. Need to install bind. Then edit named.conf. And write a database file. I am not going to explain every steps. So just spend some 10 minutes with the page I mentioned above. Of course 10 minutes is enough to finish that article.

Install bind:
     If you have connected your BSD machine with Internet, It will be much easy. I didn't connected. If you have connected,
#cd /usr/ports/dns/bind94/
#make configure
select the options you want in the menu shown. Ans click ok. Thats all you have done.

     In case you are not having Internet like me(poor guy right?), download bind-9.4-ESV.tar.gz and bind-9.4-ESV.tar.gz.asc and copy that to your BSD machine on the location /usr/ports/distfiles. Now run the above two commands. Thats all. You thought of more complex steps. You are not supposed to expect complex things from this blog. Because basically I am a somberi.

Edit named.config
     Just copy and paste the following in the file /etc/namedb/named.conf

zone "example.org" {
     type master;
     file "/etc/namedb/master/example.org.db";
};
    Change the name and file path as per your requirement. Atleast read that above mentioned article now. You can have a little understanding of this file. Anyway you wish :@

Edit database file
       Copy and paste the following /etc/namedb/master/example.org.db"
$TTL    3600
example.org.  IN  SOA  example.org  hostmaster.example.org. ( 
    200
      112000
      15000
      312000
      22000 )

example.org.  IN  NS  ns1.example.org.

ns1.example.org.  IN  A  10.0.0.1

example.org.  IN  A  10.10.10.10
one.example.org.  IN  A  5.3.3.3
six.example.org.  IN  AAAA  3fff::e
six.example.org.  IN  AAAA  fe80::10

Alter this as per you requirement. Now you have no chance. You should read that article if you want to really alter anything here.

Some touch things and start the engine
     Now open /etc/rc.conf and the line named_enable="YES" at the end.


     Set your DNS server to the local host. Open /etc/resolv.conf and add nameserver 127.0.0.1. Or the IP may be any IP you assigned to your machine. It also can be an IPv6 address.
#echo "nameserver <ip_addr>" >/etc/resolv.conf
Okey. Steps are over. start it.
#service named start
 Whatever error it throws, don't care. Just check it by doing a look-up. You want to know the command to do a look-up? Then I am so rude I won't help you.

Troubleshooting
     If it is not working, try after rebooting the machine.
     If you make any change in the configuration file or the database file, you need to restart the dns server. you can simply use #service named restart. But in my case, it doesn't work. So #killall named and once again start the dns server with #service named start
 
    And you really want more and you have time and patience, read this. I referred this page to set up DNS server in my machine and write this article ;). I said I referred not read!

Thursday, August 23, 2012

IPv6 network commands for Free BSD

I am using a Free BSD machine in my office to run some test scripts. BSD is similar to Linux but not Linux. The commands to use in BSD interface is little different from commands being used in Linux. Many times I spent hours just find the correct syntax. So here I have given some commands' syntax.


Add IPv6 address
syntax: ifconfig <interface_name> inet6 <ipv6_address>/<prefix_len>
example: ifconfig vr0 inet6 3fff::2/64
des: Assigning ipv6 address 3fff::2 with prefix length 64 to the interface vr0

Delete IPv6 address
syntax: ifconfig <interface_name> inet6 <ipv6_address>/<prefix_len> delete
example: ifconfig vr0 inet6 3fff::2/64 delete
des: Removing ipv6 address 3fff::2 with prefix length 64 from the interface vr0

Add route in routing table
syntax: route add -inet6 <subnet> <gateway>
example: route add -inet6 ::/0 fe80::2
des: Adding default route to gateway fe80::2

Remove route from routing table
syntax: route del -inet6 <subnet> <gateway>
example: route del -inet6 ::/0 fe80::2
des: Removing default route to gateway fe80::2 from routing table

Show routing table
#netstat -nr

IPv6 address look-up (nslookup for ipv6)
syntax: nslookup -q=AAAA <domain_name>
example: nslookup -q=AAAA six.example.org
des: look up for ipv6 address to the domain six.example.org

ping ipv6 address
syntax: ping6 [-I <interface>] [-c <count>] <ipv6_address or domain having ipv6_address>
example: ping6 -I vr0 fe80::4
                 ping6 -I vr0 -c 4 six.example.org
des: first line pings to the ipv6 address fe80::4 via the interface vr0. Second line pings to the domain six.example.org which is having at-least an ipv6 address via interface vr0 four times. The second line first does DNS lookup for the name six.example.org

Wednesday, August 22, 2012

simple ipv4 and ipv6 dns server setup in linux (centos)

Here I have explained the steps to setup a simple dns server for some small experiments. My operation system is CentOS. But the configuration files will be same in other operating systems also. I used bind for dns deamon. There are other options too. But bind is popular and fully documented.
  • Install bind (#yum install bind). In some case bind may be already installed by default (in my machine it is already installed).
  • The configuration file, named.conf should be placed in /etc/. If bind-chroot is installed, the configuration file should be placed in /var/named/chroot/etc/.
  • /var/named will be bind's working directory. If bind-chroot is installed /var/named/chroot will be the working directory. (place .db files in corresponding directory)
 /etc/named.conf (/var/named/chroot/etc/named.conf incase bind-chroot)
zone "example.org" {
        type master;
        file "example.org.db";
};
/etc/named/example.org.db (var/named/chroot/example.org.db incase bind-chroot)
 @       IN      SOA     example.org.    hostmaster.example.org. (
                     2008051200      ; serial
                     1d12h                ; refresh
                     15M                   ; update
                     3W12h               ; expiry
                     2h20M   )          ; minimum

  @       IN     NS      ns1.example.org.

  one     IN     A        56.89.90.2
  @       IN     A        89.89.89.89
  six     IN     AAAA     fe80::2
  six     IN     AAAA     3fff::2
  six     IN     AAAA     fec0::15
  • Replace example.org with the name you want to use.
  • In example.org.db file, the line "one IN A 56.89.90.2" matches the name one.example.org with the IPv4 address 56.89.90.2
  • The line "@ IN A 89.89.89.89" matches the name example.org('@' refers current domain) with ipv4 address 89.89.89.89
  • And the last three lines adds three AAAA IPv6 records for the name six.example.org.
Configure dns server ip address to local machine's address. Now restart the named demon (bind dns server demon)
# service named restart
Check the functioning of dns server by issuing nslookup command.

  • Resolve one.example.org
# nslookup one.example.org
Server:         10.5.1.1
Address:        10.5.1.1#53

Name:   one.example.org
Address: 56.89.90.2

  • Resolve example.org
# nslookup example.org
Server:         10.5.1.1
Address:        10.5.1.1#53

Name:   example.org
Address: 89.89.89.89

  • Reslove six.example.org (IPv6)
# nslookup
> set q=AAAA
> six.example.org
six.example.org has AAAA address fec0::15
six.example.org has AAAA address 3fff::2
six.example.org has AAAA address fe80::2
 If you want better understanding please visit http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html

Monday, August 13, 2012

tahi tests RFC 3315 test cases 13 14 15 16 17 18 failure

     These test cases tests the 'DHCP Unique IDentifier' (DUID) sent in the solicitation message. This DUID is defined in RFC3315 section 9. There are three types of DUIDs (DUID-LLT, DUID-EN, DUID-LL). The device is free to choose its DUID format. Among the six test cases only two are supported by any kind of device. So other four will be always 'not yet supported'. You have choose which DUID should be used for your device. Find your device's DUID and set this in the 'config.pl' file.

     To find the type of DUID used by your device, capture DHCPv6 solicitation message sent by your device in wireshark. In that expand the DHCPv6 payload. There will be a section 'client identifier'. In that 'option type' and 'option length' are generic. Leave them and compare other elements with the DUID definitions given in RFC 3315. You will identify the type.

Sunday, August 12, 2012

very simple brute force sudoku solve program in C

     In my college first year, I heard Sivakumar telling about his friend's brother who created a c program to solve sudoku. At that time I was thinking it was very hard and that guy who created that program is very intelligent. Because I never solved even a single sudoku puzzle. Sometimes I sat for hours and it will go wrong in at last.

     Till yesterday I never thought that I am able write a program to solve a sudoku puzzle. But this bike accident made me to sit alone in room and I had nothing to do. Siva came into mind as well as the puzzle program. I just gave a thought. Viola the concept is very simple. Brute-force! the all time success methodology will solve this puzz in minutes even in worst case.

    Here I have attached my code which is less than 200 lines.

    Also read the code here. And please update me if it is having any issues.

sudoku.h
#ifndef SUDOKU_H
#define SUDOKU_H 1
#define ZERO 0
#define MAX 9
#define PASS 0
#define FAIL 1
#define FIXED 0
#define WORKING 1
#define TOWORK 2
typedef struct element {
    int val;
    int status;
} element;
extern element elm[MAX][MAX];
void get_input();
int next_elm();
int check(int, int);
void show();
#endif

main.c
#include <stdio.h>
#include "sudoku.h"
element elm[MAX][MAX];
int main() {
    printf("SUDOKU PROGRAM BY theB\n");
    get_input();
    int ret = next_elm();
    if (ret == PASS) {
        show();
    }
    else {
        printf("INPUT ERROR\n");
    }
    return 0;
}

get_input.c
#include <stdio.h>
#include "sudoku.h"
void get_input() {
    int i, j;
    for (i = 0; i < MAX ; i++) {
        for (j = 0; j < MAX; j++) {
            printf("ENTER elm[%d][%d]: ", i, j);
            scanf("%d", &elm[i][j].val);

            if (elm[i][j].val)
                elm[i][j].status = FIXED;
            else
                elm[i][j].status = TOWORK;
        }
    }
}

check.c
#include <stdio.h>
#include "sudoku.h"
int check(int x, int y) {
    int i, j;
    //CHECK HORIZONTAL
    for (i = 0; i < MAX; i++) {
        if ((elm[x][y].val == elm[i][y].val) && (x != i))
            return FAIL;
    }
    //CHECK VERTICAL
    for (i = 0; i < MAX; i++) {
        if ((elm[x][y].val == elm[x][i].val) && (y != i))
            return FAIL;
    }
    //CHECK BOXES
    int startx = (x / 3) * 3;
    int starty = (y / 3) * 3;
    for (i = startx; i < startx + 3; i++) {
        for (j = starty; j < starty + 3; j++) {
            if ((elm[x][y].val == elm[i][j].val) && (x != i) && (y != j)) {
                return FAIL;
            }
        }
    }
    return PASS;
}

next_elm.c
#include <stdio.h>
#include "sudoku.h"
int next_elm() {
    int i, j, k;
    for (i = 0; i < MAX; i++) {
        for (j = 0; j < MAX; j++) {
            if (elm[i][j].status == TOWORK)
                goto L;
        }
    }
    return PASS;
    L:
    for (k = 1; k <= MAX; k++) {
        elm[i][j].val = k;
        elm[i][j].status = WORKING;
        int ret = check(i, j);
        if (ret == FAIL)
            continue;
        else if (ret == PASS) {
            ret = next_elm();
            if (ret == PASS)
                return PASS;
            else
                continue;
        }
    }
    elm[i][j].val = 0;
    elm[i][j].status = TOWORK;
    return FAIL;
}

Tuesday, August 7, 2012

Hack google hurdle race

     Today morning when I opened google, I saw the hurdles. I tried it. I am not so good with games. I can't even come within 20 seconds. But my friends are doing good and my office's best record is 10.6 seconds with two medels. So the crowd is at the top runners' desk.

     I decided to pull the crowd towards me. I am a programmer than a gammer. I did it in my way. Here is my result.
    It is very simple. Do the following.
  • Use firefox installed with firebug addon or chrome.
  • Play the game and finish it. (you take your own time. Don't hurry. Slow and study wins the race ;-)
  • In chrome open settings -> Tools -> Developer tools. In firefox open firebut by Tools -> firebug or clicking the bug image at the right bottom cornor of your firefox.
  • Now  you can edit the page code in realtime.
  • Everything is under the div with id hplogo_sb
  • Under that div, you can see four elements. hplogo_sbt is for the score and three hplogo_sm are for the medels.
  • Change hplogo_sbt's value to whatever you want. Even negetive as I do.
  • And change the class value of all hplogo_sm to hplogo_smg. If the hplogo_sm's class value is hplogo_smh, the medel is not granted. If you change it to hplogo_smg, it will be granted.
  • Now call your friends and get popular
Now the entire crowd is at my desk ;-)

Saturday, June 9, 2012

forge ping (send forged icmp ping request)

     Linux is providing a wonderful platform for programmers also hackers ( better programmers). The one that admired me recently is the RAW-SOCKET. It allows you to send any packet yourself into your network. A well written network packet can do many things. Here in this post I shared a code to send a forged ping request.

     Ping, we all know, a regular network command. We (or else me) always use this command to check whether our computer is connected with the network. Nothing else. But also the ping does one important job of updating the ARP cache. So with a forged ping request we can easily poison the cache of all the host in the network. [Read more about ARP cache poisoning to get better understanding. May be in future I will write a blog entry on ARP cache, if I write a working example.]

Here is the code.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <linux/icmp.h>
#include <arpa/inet.h>
#include <errno.h>

#define SOURCE_ADDR "43.88.80.34"
#define DEST_ADDR "43.88.80.135"

int write_ip_header (void *);
void write_icmp_header (void *);
unsigned short calculate_checksum (unsigned short *, int len);

int main () {
    int sockfd;
    sockfd = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (socket < 0) {
        perror ("socket failed");
        return -1;
    }

    char *packet = malloc (4096);
    if (!packet) {
        perror ("malloc failed");
        return -1;
    }

    memset (packet, 0, 4096);

    struct sockaddr_in to_addr;
    to_addr.sin_family = AF_INET;
    to_addr.sin_port = htons (23);
    inet_pton (AF_INET, DEST_ADDR, &to_addr.sin_addr);
   
    write_icmp_header (packet);
    int tot_len = write_ip_header (packet);

    int one = 1;
    if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, &one, sizeof (one)) < 0) {
        perror ("setsockopt faild: ");
        return -1;
    }

    if (sendto(sockfd, packet, tot_len, 0, (struct sockaddr *) &to_addr, sizeof (to_addr)) == -1) {
        perror ("sendto failed");
        return -1;
    }

    return 0;
}

int write_ip_header (void *packet) {

    struct iphdr *iph = (struct iphdr *) packet;

    iph->ihl = 0x5;
    iph->version = 0x4;
    iph->tos = 0;
    iph->tot_len = htons (sizeof (struct iphdr) + sizeof (struct icmphdr));
    iph->id = htons (1234);
    iph->frag_off = 0;
    iph->ttl = htons (16);
    iph->protocol = 1; //ICMP
    iph->check = 0;
    iph->saddr = inet_addr (SOURCE_ADDR);
    iph->daddr = inet_addr (DEST_ADDR);

    iph->check = calculate_checksum ((unsigned short *) packet, ntohs (iph->tot_len));
    printf ("ip checksum: %x\n", iph->check);

    return ntohs (iph->tot_len);
}

void write_icmp_header (void *packet) {

    struct icmphdr *icmph = (struct icmphdr *) ((char *)packet + sizeof (struct iphdr));

    icmph->type = 8;
    icmph->code = 0;
    icmph->checksum = 0;
    icmph->un.echo.id = htons (123);
    icmph->un.echo.sequence = 0;

    icmph->checksum = calculate_checksum ((unsigned short *) icmph, sizeof (struct iphdr));
    printf ("icmp checksum: %x\n", icmph->checksum);
}

unsigned short calculate_checksum (unsigned short *buf, int len) {
    unsigned long int sum;

    for (sum = 0; len > 1; len -= 2) {
        sum += *buf++;
    }

    if (len) {
        sum += (unsigned char) *buf;
    }

    while (sum >> 16) {
        sum = (sum >> 16) + (sum & 0xffff);
    }

    return (unsigned short) ~sum;
}


     Just edit the macros SOURCE_ADDR and DEST_ADDR to any valid IP address you like.

     I tried this code. It is perfectly working on my CentOS maching. I think it will work on all Linux distribution. But I didn't test. Sorry I just wrote this program for fun. So I didn't add any comment lines. Feel free to ask any questions.