#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <signal.h>
#include <string.h>
#include <sys/un.h>

int saved,charmode,s,a;
struct termios cuj, orig;
struct sockaddr_un x;

void termset(int i) {
  if (!charmode) return;
  if (i) {
    tcgetattr(0,&cuj);
    if (!saved) tcgetattr(0,&orig);
    saved=1;
    cuj.c_lflag=0;
    tcsetattr(0,TCSANOW,&cuj);
  } else if (saved) tcsetattr(0,TCSANOW,&orig);
}

void sig(int x) {
  shutdown(s,2);
  close(s);
  termset(0);
  fprintf(stderr,"\npoink?! signal %d, aiee...\n",x);
  exit(0);
}

char buf[1000];

int main(int argc,char* argv[]) {
  if (argc-2) {
    fprintf(stderr,"\nsuncat 0.01b - unix socket connectivity\n");
    fprintf(stderr,"(c) 1999/2000 <lcamtuf@ids.pl>\n");
    fprintf(stderr,"  usage: %s [%%]/socket/path\n",argv[0]);
    fprintf(stderr,"  ('%%' enables charmode, full 8bit input)\n\n");
    exit(1);
  }
  signal(SIGINT,sig); signal(SIGTERM,sig); signal(SIGPIPE,sig);
  s=socket(PF_UNIX,SOCK_STREAM,0);
  x.sun_family=AF_UNIX;
  strncpy(buf,argv[1],100);
  charmode=(buf[0]=='%');
  termset(1);
  strcpy(x.sun_path,&buf[charmode]);
  if (connect(s,&x,sizeof(x))) { perror(&buf[charmode]); exit(1); }
  fcntl(0,F_SETFL,O_NONBLOCK);
  fcntl(s,F_SETFL,O_NONBLOCK);
  while (1) {
    usleep(10000);
    a=read(0,buf,1000);
    if (a<0 && errno!=EAGAIN) exit(3);
    if (a>0) write(s,buf,a);
    a=read(s,buf,1000);
    if (a<0 && errno!=EAGAIN) exit(3);
    if (a>0) write(0,buf,a);
  }
}
