/*
 *  net_server.c
 *
 *    Server process for time accounting system, network version.  
 *    This should be run as a daemon or in the background.
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include "time_entry.h"

main()
{

    int skt_id,    /* Socket descriptor */
        msg_sock,  /* Socket that will accept messages */
        length,
        i,j;

    EVENT_TYPE event;    /* An event from one of the client processes */

    struct sockaddr_in sa;  /* Socket address structure   */
    char buff[80];
    FILE *time_file;

        /* Open the output file in append mode */
        if(!(time_file = fopen(TIME_FILE, "a+"))){
            perror("Opening time file");
            exit(1);
        }

        fprintf(time_file, "\n***STARTUP***\n");

        /*
         *  Create a stream type socket in the INTERNET domain, with the 
         *  default protocol.
        */
        skt_id = socket(AF_INET, SOCK_STREAM, 0);
        if(skt_id == -1){
            /* Error.  Cleanup & leave */
            perror("Can't create socket");
            exit(1);
        }

        /*
         *  Now that the socket exists, set up the address structure
         *  and bind an address to the socket.
        */
        sa.sin_family = AF_UNIX;
        sa.sin_addr.s_addr = INADDR_ANY;   /* Any available address */
        sa.sin_port=0;                     /* Any port              */

        if(bind(skt_id, &sa, sizeof(sa)) == -1){
            perror("Can't bind address");
            exit(1);
        }

        /*
         *  Find out the port number, since we asked for any available
        */

        length=sizeof(sa);
        if(getsockname(skt_id, &sa, &length)){
            perror("Can't find name");
            exit(1);
        }
        printf("Port: %d\n", ntohs(sa.sin_port));

        listen(skt_id, 5);  /* Set up the queue for requests */


        /*
         *  Main loop is here.  Accept a connection, read the message,
         *  and write the time record...
        */

        do{
            /*
             * Accept a connection.  Accept will return a new socket
             * descriptor with the same properties as the original.  This
             * new socket is used for read and write
            */

        msg_sock = accept(skt_id, 0, 0);
        if(msg_sock == -1){
            perror("Can't accept connections");
            exit(1);
        }
            if(read(msg_sock, &event, sizeof(event)) < 0){
                perror("Read");
                exit(1);
            }
            if(event.event_cd != SHUT_DOWN){
                if (fwrite(&event, sizeof(event),1,time_file) != 1){
                    perror("Write");
                    exit(1);
                }
            }
            close(msg_sock);  /* Close the socket retruned by accept... */
        }while(event.event_cd != SHUT_DOWN);

        /* Cleanup */
        unlink(SOCKET_NAME);
        fprintf(time_file, "\n***SHUTDOWN***\n");
        fclose(time_file);
        exit(0);
}
