86 lines
2.0 KiB
C
86 lines
2.0 KiB
C
/* $Id: $ */
|
|
/* vim: shiftwidth=4 tabstop=4 noexpandtab
|
|
* MiniUPnP project
|
|
* (c) 2016 Thomas Bernard
|
|
* website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
* This software is subject to the conditions detailed
|
|
* in the LICENCE file provided within the distribution */
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <signal.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/un.h>
|
|
|
|
#include "codelength.h"
|
|
#include "printresponse.h"
|
|
|
|
static volatile sig_atomic_t quitting = 0;
|
|
|
|
static void sighandler(int sig)
|
|
{
|
|
(void)sig;
|
|
quitting = 1;
|
|
}
|
|
|
|
int main(int argc, char * * argv)
|
|
{
|
|
int i;
|
|
int s;
|
|
struct sockaddr_un addr;
|
|
const char * sockpath = "/var/run/minissdpd.sock";
|
|
unsigned char buffer[4096];
|
|
ssize_t n;
|
|
const char command5[] = { 0x05, 0x00 };
|
|
struct sigaction sa;
|
|
|
|
for(i=0; i<argc-1; i++) {
|
|
if(0==strcmp(argv[i], "-s"))
|
|
sockpath = argv[++i];
|
|
}
|
|
|
|
/* set signal handlers */
|
|
memset(&sa, 0, sizeof(struct sigaction));
|
|
sa.sa_handler = sighandler;
|
|
if(sigaction(SIGINT, &sa, NULL)) {
|
|
fprintf(stderr, "Failed to set SIGINT handler.\n");
|
|
}
|
|
sa.sa_handler = sighandler;
|
|
if(sigaction(SIGTERM, &sa, NULL)) {
|
|
fprintf(stderr, "Failed to set SIGTERM handler.\n");
|
|
}
|
|
|
|
s = socket(AF_UNIX, SOCK_STREAM, 0);
|
|
addr.sun_family = AF_UNIX;
|
|
strncpy(addr.sun_path, sockpath, sizeof(addr.sun_path));
|
|
if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) {
|
|
fprintf(stderr, "connecting to %s : ", addr.sun_path);
|
|
perror("connect");
|
|
return 1;
|
|
}
|
|
printf("connected to %s\n", addr.sun_path);
|
|
n = write(s, command5, sizeof(command5)); /* NOTIF command */
|
|
printf("%d bytes written\n", (int)n);
|
|
|
|
while(!quitting) {
|
|
n = read(s, buffer, sizeof(buffer));
|
|
if(n < 0) {
|
|
if(errno == EINTR) continue;
|
|
perror("read");
|
|
break;
|
|
} else if(n == 0) {
|
|
printf("Socket closed\n");
|
|
break;
|
|
}
|
|
printf("%d bytes read\n", (int)n);
|
|
printresponse(buffer, (int)n);
|
|
}
|
|
printf("Quit...\n");
|
|
close(s);
|
|
return 0;
|
|
}
|
|
|