miniupnp/minissdpd/showminissdpdnotif.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;
}