#include <stdio.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <signal.h>
#include "pqsignal.h"

static void Usage(void) {
  printf("Usage: pgkill <signal> <pid>\n");
  printf("Signal must be uppercase..\n");
  exit(1);
}

static int
pgkill(int pid, int sig)
{
        char            pipename[128];
        BYTE            sigData = sig;
        BYTE            sigRet = 0;
        DWORD           bytes;

        wsprintf(pipename, "\\\\.\\pipe\\pgsignal_%i", pid);
        if (!CallNamedPipe(pipename, &sigData, 1, &sigRet, 1, &bytes, 1000))
        {
          printf("Failed in call: %ld\n",GetLastError());
                return -1;
        }
        if (bytes != 1 || sigRet != sig)
        {
          printf("Invalid return value!\n");
                return -1;
        }

        return 0;
}

int main(int argc, char *argv[]) {
  int sig = -1;
  int pid = 0;

  if (argc != 3) 
    Usage();
  
  if (!strcmp(argv[1],"HUP"))
    sig = SIGHUP;
  else if (!strcmp(argv[1],"INT"))
    sig = SIGINT;
  else if (!strcmp(argv[1],"QUIT"))
    sig = SIGQUIT;
  else if (!strcmp(argv[1],"ABRT"))
    sig = SIGABRT;
  else if (!strcmp(argv[1],"KILL"))
    sig = SIGKILL;
  else if (!strcmp(argv[1],"TERM"))
    sig = SIGTERM;
  else if (!strcmp(argv[1],"USR1"))
    sig = SIGUSR1;
  else if (!strcmp(argv[1],"USR2"))
    sig = SIGUSR2;

  if (sig == -1)
    Usage();


  pid = atoi(argv[2]);
  if (pid == 0)
    Usage();

  printf("Got: %i\n",pgkill(pid,sig));
  exit(0);
}
