nsuncat 0.01b - Unix socket connectivity from the command line. (works just like netcat for tcp/udp sockets)
49088a575ee48d6c5401773d67d701fbde1b7fe01256a0d55e04ed9c19f06f5b
// (c) lcamtuf
#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 chuj, orig;
struct sockaddr_un x;
void termset(int i) {
if (!charmode) return;
if (i) {
tcgetattr(0,&chuj);
if (!saved) tcgetattr(0,&orig);
saved=1;
chuj.c_lflag=0;
tcsetattr(0,TCSANOW,&chuj);
} 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);
}
}