/*
  Written by Konstantin Welke
  No rights reserved, I mean come on, its a bunch of syscalls.
*/

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  if (argc < 2)
    {
      puts("please enter a phone number to call\n");
      exit(1);
    }

  if (strlen(argv[1]) > 52)
    {
      puts("phone number too long! (max 52 bytes)\n");
      exit(1);
    }
  
  char *tapiname = "/tmp/tapisock";
  struct sockaddr *addr;
  char buf[100] = { 0 };
  ssize_t socksize = sizeof(addr->sa_family) + strlen(tapiname) + 1;

  int fd = socket(PF_FILE, SOCK_STREAM, 0);
  if (fd < 0)
    {
      perror("Could not open socket");
      exit(1);
    }
  addr = (struct sockaddr*) malloc(socksize);
  addr->sa_family = AF_FILE;
  strcpy(addr->sa_data, tapiname);

  memset(buf, 0, 100);
  memcpy(buf, "\2\201 \0\0\0\0\0\244\2\0\0\n\0\0\0\0\0\0\0\0\2\0\4\0\6\0\7\0\10\0\t\0\n\0\r\0\16\0\21\1\2024\0\0\0\0\0", 48);
  memcpy(buf+48, argv[1], strlen(argv[1]));
 
  int ret = connect(fd, addr, socksize-1); //no trailing \0
  if (ret)
    {
      perror("connect() to tapisock failed");
      exit(1);
    }
  
  ret = write(fd, buf, 100);
  if (ret < 0)
    {
      perror("could not write to tapisock");
      exit(1);
    }

  return 0;
}
