Listing 2 (server.c)

/*
 *   Server process for time accounting system, non-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 */
      i,j;

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

   struct sockaddr 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 UNIX domain, with the
       * default protocol.
      */
      skt_id = socket(AF_UNlX, 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.sa_family = AF_UNIX;
      strcpy(sa.sa_data, SOCKET_NAME);

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

      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);
}