#include "client.h"
#include <ctype.h>
#include <varargs.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>

#define	IRCPATH		"etc/irc.path"

static int ircpid;

static void page_relay()
{
  extern int g_page_pending;
  extern int g_page_need_notify;

  signal(SIGUSR2, SIG_IGN);
  g_page_pending = 1;
  g_page_need_notify = 1;
  if (ircpid)
    kill (ircpid, SIGUSR2);
  signal(SIGUSR2, page_relay);
}

Irc()
{
  CHATID chatid;
  SHORT mode;
  int w, status;
  static char *arglist[] =
        {
        "/home/bbs/bin/irc",
        "-c",
        "#ÅÍ",
        "-z",
        NULL,
        NULL,
        "localhost",
        NULL
        };
  FILE *fp;
  char ircpath[PATHLEN+1];

  void (*func)();

  extern int lang;
  extern SHORT my_mode();

  if ((fp = fopen(IRCPATH, "r")) != NULL)
  {
	fgets(ircpath, PATHLEN, fp);
	fclose(fp);
	ircpath[strlen(ircpath)-1] = '\0';
	if (access(ircpath, X_OK) == 0)
	{
	  arglist[0] = ircpath;
	}
  }

  move(2, 0);
  clrtobot();

  if (lang) {
    if (getdata(2,0,"»ç¿ëÇÒ º°¸í: ",chatid,sizeof chatid,DOECHO,1)==-1)
      return FULLUPDATE;
  } else {
    if (getdata(2,0,"Enter chatid: ",chatid,sizeof chatid,DOECHO,1)==-1)
      return FULLUPDATE;
  }

  if (*chatid == '\0') {
    strncpy(chatid, myinfo.userid, CHATID_MAX);
    chatid[CHATID_MAX] = '\0';
  }

  arglist[4] = myinfo.userid;
  arglist[5] = chatid;

  bbs_set_mode (M_IRC);
  mode = my_mode();
  if ((mode & MODE_FLG_NOPAGE) == 0)
    func = signal(SIGUSR2, page_relay);
  else
    func = signal(SIGUSR2, SIG_IGN);

  if ((ircpid = fork()) == 0) {
    extern char *bbsenv[200];
    extern int numbbsenvs;

    if (numbbsenvs == 0)
        bbsenv[0] = NULL;

    signal(SIGUSR2, SIG_IGN);
    execve (arglist[0], arglist, bbsenv);
    fprintf(stderr, "EXECVE FAILED.... (%s)\n", arglist[0]);
    exit (-1);
  } else {
    extern int errno;

    errno = 0;
    while (wait(&status) == -1 && errno == EINTR)
    {
        if (WIFSIGNALED(status))
        {
          if (WTERMSIG(status) == SIGUSR2)
            continue;
          break;
        }
    }
    signal (SIGUSR2, func);
  }
  add_io(0, 0);
  bbs_set_mode(M_UNDEFINED);
  if (NewPagePending()) {
    chat_show_page_request();
  }      
  return FULLUPDATE;
}
