

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

main()
{
        struct ripheader {
                char command;
                char version;
                short zero1;
                long famzero;           /* family plus zero, two shorts in one long */
                long ip1;
                long zero3;
                long zero4;
                long distance1;
                long fam2, ip2, z5, z6, d2;
                long fam3, ip3, z7, z8, d3;
                long fam4, ip4, z9, z10, d4;
        };
        int childpid;
        int sock;
        struct sockaddr_in sockaddr;    /* the setup socket for receiving */
        struct sockaddr_in dest;                        /* send to broadcast */
        int socklen = sizeof(struct sockaddr_in);
        int on=1;
        int onsize = sizeof(on);
        
        struct ripheader header={2, 1, 0, 
                        0x00020000, 0x83cc6a00, 0, 0, 1,
                        0x00020000, 0x83cc6b00, 0, 0, 1,
                        0x00020000, 0x83cc6c00, 0, 0, 1, 
                        0x00020000, 0x83cc5b00, 0, 0, 1};

        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
                perror("can't get socket");
                exit(-1);
        }
                
        if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *) &on, onsize) < 0) {
        perror("Couldn't set socket options");
        exit(1);
    }

        sockaddr.sin_family = AF_INET;
        sockaddr.sin_addr.s_addr = INADDR_ANY;
        sockaddr.sin_port = htons(520);

        if (bind(sock, (struct sockaddr *) &sockaddr, socklen) < 0) {
                perror("couldn't bind socket");
                exit(-3);
        }

        dest.sin_family = AF_INET;
        dest.sin_addr.s_addr = inet_addr("131.204.46.255");
        dest.sin_port = htons(520);

        if ((childpid = fork()) < 0) {
                printf("couldn't go to background");
                exit(1);
        } else if (childpid == 0) {
                setsid();
                while(1) {
                        sendto(sock, (char *) &header, sizeof(header), 0, 
                                                        (struct sockaddr *) &dest, sizeof(dest));
                        sleep(30);
                }
        } else {
                exit(0);
        }

}
