//  This program is copyright Russell Coker.  May be freely distributed and
//  used under the terms of the GPL.
//  It's designed to be run from inetd.  It takes 2 command line parameters,
//  the first is the TCP port, the second is the IPv4 address in dotted
//  decimal.
//
//  Version 1.4.  If you want to send me patches to this then I'll include them
//  and give you credit.

#include <sys/socket.h>
#include "pass.h"
#include <stdio.h>
#include <string.h>

#ifdef UNIXWARE
#define socklen_t size_t
#endif

void usage()
{
  printf("Must specify one or two \"host:port\" combinations.\n");
  exit(1);
}

int main(int argc, char *argv[])
{
  if(argc != 2 && argc != 3)
    usage();
  int sd = socket(AF_INET, SOCK_STREAM, 0);
  if( sd == -1)
  {
    printf("Socket creation failed.\n");
    return 2;
  }
  sockaddr_in sa;
  char *parm1 = argv[1], *parm2 = argv[2];
  if(strcmp(argv[1], "-f") == 0)
  {
    if(argc != 3)
      usage();
    FILE *fp = fopen(argv[2], "r");
    if(!fp)
    {
      printf("Can't open file.\n");
      return 3;
    }
    char buf[1024];
    if(!fgets(buf, sizeof(buf), fp))
      usage();
    buf[sizeof(buf) - 1] = '\0';
    strtok(buf, "\r\n");
    parm1 = strtok(buf, " \t");
    parm2 = strtok(NULL, " \t");
  }
  if(!text2num(sa, parm1))
  {
    printf("Can't parse param 1 \"%s\".\n", parm1);
    return 4;
  }

  sockaddr_in peer;
  int nNamelen = sizeof(peer);
  if(getpeername(0, (sockaddr *)&peer, (socklen_t *)&nNamelen) != 0)
  {
    printf("Can't get peer name.\n");
    return 5;
  }
  if(peer.sin_addr.s_addr == sa.sin_addr.s_addr)
  {
    if(!text2num(sa, parm2))
    {
      printf("Can't parse param 2 \"%s\".\n", parm2);
      return 4;
    }
  }
  if(connect(sd, (sockaddr *)&sa, sizeof(sockaddr_in)) == -1)
  {
    printf("Can't connect to server.\n");
    return 3;
  }
  return pass(sd, sd);
}


