//
// Copyright(C) Simon Howard
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
//
// a small ident server
//

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

#define IDENT_USER "user"

#define IDENT_PORT 113
#define IDENT_RESPONSE " : USERID : UNIX : " IDENT_USER

int main()
{
  struct sockaddr_in in;
  int listensock;             // listening socket

  // set up port, listen for connections

  memset(&in, 0, sizeof (struct sockaddr_in));

  listensock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

  in.sin_family = AF_INET;
  in.sin_addr.s_addr = INADDR_ANY;
  in.sin_port = htons(IDENT_PORT);

  if (bind(listensock, (struct sockaddr *) &in,
	   sizeof (struct sockaddr_in)) < 0)
    exit(-1);

  if(listen(listensock, 1) == -1)
    exit(-1);

  // loop
  // wait for connections and send responses to ident requests
  // we can only handle one connection at a time this way but
  // its not too much of a problem

  while(1)
    {
      int socket;
      char buf[256];

      if((socket = accept(listensock, NULL, NULL)) < 0)
	  exit(-1);

      // get data from port
      // we dont send a reply until we're asked, duh

      recv(socket, buf, 256, 0 );

      send(socket, IDENT_RESPONSE, strlen(IDENT_RESPONSE) + 1, 0);

      close(socket);
    }
}
