/*  main.c -- top level of ARMulator:  ARM6 Instruction Emulator.
    Copyright (C) 1994 Advanced RISC Machines Ltd.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

/**********************************************************************/
/* Forks the ARMulator and hangs on a socket passing on RDP messages  */
/* down a pipe to the ARMulator which translates them into RDI calls. */
/**********************************************************************/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <netdb.h>
#include <unistd.h>

#include "armdefs.h"
#include "dbg_rdi.h"
#include "dbg_conf.h"

#define MAXHOSTNAMELENGTH 64

/* Read and write routines down sockets and pipes */

void MYread_chars(int sock, void *p, int n);
unsigned char MYread_char(int sock);
ARMword MYread_word(int sock);
void MYread_FPword(int sock, char *putinhere);

void MYwrite_word(int sock, ARMword i);
void MYwrite_string(int sock, char *s);
void MYwrite_FPword(int sock, char *fromhere);
void MYwrite_char(int sock, unsigned char c);

void passon(int source, int dest, int n);


/* Mother and child processes */
void parent (void);
void kid(void);

/* The child process id. */
pid_t child;

/* The socket to the debugger */
int debugsock;

/* The pipes between the two processes */
int mumkid[2];
int kidmum[2];

/* A pipe for handling SWI return values that goes straight from the */
/* parent to the ARMulator host interface, bypassing the childs RDP */
/* to RDI interpreter */
int DebuggerARMul[2];

/* The maximum number of file descriptors */
int nfds;

/* The socket handle */
int sockethandle;

/* The machine name */
char localhost[MAXHOSTNAMELENGTH + 1];

/* The socket number */
unsigned int socketnumber;

/**************************************************************/
/* Takes one argument: the socket number.                     */
/* Opens a socket to the debugger, and once opened spawns the */
/* ARMulator and sets up a couple of pipes.                   */
/**************************************************************/
int main(int argc, char *argv[]) {
  int i;
  struct sockaddr_in devil, isa;
  struct hostent *hp;


  if (argc == 1) {
    fprintf(stderr, "No socket number\n");
    return 1;
  }

  sscanf(argv[1], "%d", &socketnumber);
  if (!socketnumber || socketnumber > 0xffff) {
    fprintf(stderr, "Invalid socket number: %d\n", socketnumber);
    return 1;
  }

  gethostname(localhost, MAXHOSTNAMELENGTH);
  hp = gethostbyname(localhost);
  if (!hp) {
    fprintf(stderr, "Cannot get local host info\n");
    return 1;
  }

  /* Open a socket */
  sockethandle = socket(hp->h_addrtype, SOCK_STREAM, 0);
  if (sockethandle < 0) {
    perror("socket");
    return 1;
  }

  devil.sin_family = hp->h_addrtype;
  devil.sin_port = htons(socketnumber);
  devil.sin_addr.s_addr = 0;
  for(i = 0; i < sizeof(devil.sin_zero); i++) devil.sin_zero[i] = '\000';
  memcpy(&devil.sin_addr, hp->h_addr_list[0], hp->h_length);

  if (bind(sockethandle, &devil, sizeof(devil)) < 0) {
    perror("bind");
    return 1;
  }

  /* May only accept one debugger at once */

  if (listen(sockethandle, 0)) {
    perror("listen");
    return 1;
  }

  fprintf(stderr, "Waiting for connection from debugger...");

  debugsock = accept(sockethandle, &isa, &i);
  if (debugsock < 0) {
    perror("accept");
    return 1;
  }
  
  fprintf(stderr, " done.\nConnection Established.\n");

  nfds = getdtablesize();

  if (pipe(mumkid)) {
    perror("pipe");
    return 1;
  }
  if (pipe(kidmum)) {
    perror("pipe");
    return 1;
  }
  
  if (pipe(DebuggerARMul)) {
    perror("pipe");
    return 1;
  }
  
#ifdef DEBUG
      fprintf(stderr, "Created pipes ok\n");
#endif

  child = fork();

#ifdef DEBUG
  fprintf(stderr, "fork() ok\n");
#endif

  if (child ==  0) kid ();
  if (child != -1) parent ();

  perror("fork");
  return 1;
}




