Annotation of researchv10no/ipc/mgrs/icmpmgr/ping.c, revision 1.1

1.1     ! root        1: #include <sys/param.h>
        !             2: #include <sys/inet/ip.h>
        !             3: #include <ipc.h>
        !             4: 
        !             5: /* Echo or Echo Reply Message
        !             6: 
        !             7:     0                   1                   2                   3
        !             8:     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        !             9:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        !            10:    |     Type      |     Code      |          Checksum             |
        !            11:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        !            12:    |           Identifier          |        Sequence Number        |
        !            13:    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        !            14:    |     Data ...
        !            15:    +-+-+-+-+-
        !            16: */
        !            17: 
        !            18: typedef struct {
        !            19:        struct ip ip;
        !            20:        u_char type;
        !            21:        u_char code;
        !            22:        u_char cksum[2];
        !            23:        u_char id[2];
        !            24:        u_char seqno[2];
        !            25:        u_char data[128];
        !            26: } EchoMsg;
        !            27: 
        !            28: main(ac, av)
        !            29:        int ac;
        !            30:        char *av[];
        !            31: {
        !            32:        long addr, myaddr;
        !            33:        int i, fd;
        !            34: 
        !            35:        if(ac!=2){
        !            36:                fprint(2, "usage: %s host\n", av[0]);
        !            37:                exit(1);
        !            38:        }
        !            39:        /*
        !            40:         *  translate his name into an address
        !            41:         */
        !            42:        addr = in_address(av[1]);
        !            43:        if(addr == 0){
        !            44:                fprint(2, "internet address for %s unknown\n", av[1]);
        !            45:                exit(1);
        !            46:        }
        !            47: 
        !            48:        /*
        !            49:         *  find out my own name and get an address for it.  preferably
        !            50:         *  use an address for his network (how do we handle subnets?).
        !            51:         */
        !            52:        myaddr = in_addronnet(me, addr, 0);
        !            53:        if(myaddr == 0){
        !            54:                addr = in_address(me);
        !            55:                if(addr == 0){
        !            56:                        fprint(2, "internet address for %s unknown\n", me);
        !            57:                        exit(1);
        !            58:                }
        !            59:        }
        !            60: 
        !            61:        /*
        !            62:         *  get a connection to the icmp manager
        !            63:         */
        !            64:        fd = ipcopen("/cs/icmp", "");
        !            65: 
        !            66:        /*
        !            67:         *  send 15 messages one second apart
        !            68:         */
        !            69:        for(i=0; i<15; i++){
        !            70:                switch(select(NOFILE, &fds, 0, 1000)){
        !            71:                }
        !            72:        }
        !            73: }
        !            74: 
        !            75: /*
        !            76:  * send an ip datagram
        !            77:  */
        !            78: ipsend(fd, mp, len, src, dst)
        !            79:        IcmpMsg *mp;
        !            80:        u_long src;
        !            81:        u_long dst;
        !            82: {
        !            83:        mp->ip.ip_dst = dst;
        !            84:        mp->ip.ip_src = src;
        !            85:        mp->ip.ip_len = len;
        !            86:        mp->ip.ip_hl = sizeof(struct ip)>>2;
        !            87:        mp->ip.ip_off = 0;
        !            88:        mp->ip.ip_ttl = 255;
        !            89:        cksum(mp, len);
        !            90:        return write(fd, mp, len)!=len ? -1 : 0;
        !            91: }
        !            92: 
        !            93: /*
        !            94:  * echo a datagram
        !            95:  */
        !            96: echo(fd, mp, len)
        !            97:        IcmpMsg *mp;
        !            98: {
        !            99:        mp->type = 0;
        !           100:        if(ipsend(fd, mp, len, mp->ip.ip_dst, mp->ip.ip_src) < 0)
        !           101:                perror("sending echo");
        !           102: }
        !           103: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.