minissdpd: added command 0 (version)
This commit is contained in:
parent
1c84e560ac
commit
aefeada189
|
@ -1,4 +1,7 @@
|
||||||
$Id: Changelog.txt,v 1.41 2015/07/21 15:39:36 nanard Exp $
|
$Id: Changelog.txt,v 1.42 2015/08/06 13:16:58 nanard Exp $
|
||||||
|
|
||||||
|
2015/08/06:
|
||||||
|
added command 0 (version)
|
||||||
|
|
||||||
2015/07/21:
|
2015/07/21:
|
||||||
set multicast TTL to 2 by default and configurable
|
set multicast TTL to 2 by default and configurable
|
||||||
|
|
|
@ -24,15 +24,22 @@ close unix socket connection.
|
||||||
|
|
||||||
* Request format :
|
* Request format :
|
||||||
1st byte : request type
|
1st byte : request type
|
||||||
1 - type
|
0 - version
|
||||||
2 - USN (unique id)
|
1 - type
|
||||||
3 - everything
|
2 - USN (unique id)
|
||||||
4 - submit service (see below)
|
3 - everything
|
||||||
|
4 - submit service (see below)
|
||||||
n bytes : string length : 1 byte if < 128 else the upper bit indicate that
|
n bytes : string length : 1 byte if < 128 else the upper bit indicate that
|
||||||
one additional byte should be read, etc. (see codelength.h)
|
one additional byte should be read, etc. (see codelength.h)
|
||||||
n bytes = string
|
n bytes = string
|
||||||
|
|
||||||
Response format :
|
Response format :
|
||||||
|
|
||||||
|
request type 0 (version) :
|
||||||
|
n bytes string length
|
||||||
|
n bytes = version string
|
||||||
|
|
||||||
|
request type 1 / 2 / 3 :
|
||||||
1st byte : number of services/devices
|
1st byte : number of services/devices
|
||||||
For each service/device :
|
For each service/device :
|
||||||
URL :
|
URL :
|
||||||
|
|
|
@ -6,6 +6,7 @@ fermeture de la connexion.
|
||||||
|
|
||||||
format de requete :
|
format de requete :
|
||||||
1 octet : type de la requete
|
1 octet : type de la requete
|
||||||
|
0 - version
|
||||||
1 - type
|
1 - type
|
||||||
2 - USN (id unique)
|
2 - USN (id unique)
|
||||||
3 - tout
|
3 - tout
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
/* $Id: config.h,v 1.6 2012/09/27 15:40:29 nanard Exp $ */
|
/* $Id: config.h,v 1.9 2015/08/06 13:16:58 nanard Exp $ */
|
||||||
/* MiniUPnP project
|
/* MiniUPnP project
|
||||||
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
||||||
* (c) 2006-2011 Thomas Bernard
|
* (c) 2006-2015 Thomas Bernard
|
||||||
* This software is subject to the conditions detailed
|
* This software is subject to the conditions detailed
|
||||||
* in the LICENCE file provided within the distribution */
|
* in the LICENCE file provided within the distribution */
|
||||||
#ifndef CONFIG_H_INCLUDED
|
#ifndef CONFIG_H_INCLUDED
|
||||||
#define CONFIG_H_INCLUDED
|
#define CONFIG_H_INCLUDED
|
||||||
|
|
||||||
|
#define MINISSDPD_VERSION "1.3"
|
||||||
|
|
||||||
/* use BSD daemon() ? */
|
/* use BSD daemon() ? */
|
||||||
#define USE_DAEMON
|
#define USE_DAEMON
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: minissdpd.c,v 1.48 2015/07/21 15:39:36 nanard Exp $ */
|
/* $Id: minissdpd.c,v 1.49 2015/08/06 13:16:58 nanard Exp $ */
|
||||||
/* MiniUPnP project
|
/* MiniUPnP project
|
||||||
* (c) 2007-2015 Thomas Bernard
|
* (c) 2007-2015 Thomas Bernard
|
||||||
* website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
* website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
||||||
|
@ -27,8 +27,10 @@
|
||||||
/* unix sockets */
|
/* unix sockets */
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
/* for getpwnam() and getgrnam() */
|
/* for getpwnam() and getgrnam() */
|
||||||
|
#if 0
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "getifaddr.h"
|
#include "getifaddr.h"
|
||||||
#include "upnputils.h"
|
#include "upnputils.h"
|
||||||
|
@ -727,7 +729,7 @@ void processRequest(struct reqelem * req)
|
||||||
int type;
|
int type;
|
||||||
struct device * d = devlist;
|
struct device * d = devlist;
|
||||||
unsigned char rbuf[RESPONSE_BUFFER_SIZE];
|
unsigned char rbuf[RESPONSE_BUFFER_SIZE];
|
||||||
unsigned char * rp = rbuf+1;
|
unsigned char * rp;
|
||||||
unsigned char nrep = 0;
|
unsigned char nrep = 0;
|
||||||
time_t t;
|
time_t t;
|
||||||
struct service * newserv = NULL;
|
struct service * newserv = NULL;
|
||||||
|
@ -749,19 +751,31 @@ void processRequest(struct reqelem * req)
|
||||||
p = buf + 1;
|
p = buf + 1;
|
||||||
DECODELENGTH_CHECKLIMIT(l, p, buf + n);
|
DECODELENGTH_CHECKLIMIT(l, p, buf + n);
|
||||||
if(p+l > buf+n) {
|
if(p+l > buf+n) {
|
||||||
syslog(LOG_WARNING, "bad request (length encoding)");
|
syslog(LOG_WARNING, "bad request (length encoding l=%u n=%u)",
|
||||||
|
l, (unsigned)n);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if(l == 0 && type != 3) {
|
if(l == 0 && type != 3 && type != 0) {
|
||||||
syslog(LOG_WARNING, "bad request (length=0)");
|
syslog(LOG_WARNING, "bad request (length=0)");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
syslog(LOG_INFO, "(s=%d) request type=%d str='%.*s'",
|
syslog(LOG_INFO, "(s=%d) request type=%d str='%.*s'",
|
||||||
req->socket, type, l, p);
|
req->socket, type, l, p);
|
||||||
switch(type) {
|
switch(type) {
|
||||||
|
case 0: /* version */
|
||||||
|
rp = rbuf;
|
||||||
|
CODELENGTH((sizeof(MINISSDPD_VERSION) - 1), rp);
|
||||||
|
memcpy(rp, MINISSDPD_VERSION, sizeof(MINISSDPD_VERSION) - 1);
|
||||||
|
rp += (sizeof(MINISSDPD_VERSION) - 1);
|
||||||
|
if(write_or_buffer(req, rbuf, rp - rbuf) < 0) {
|
||||||
|
syslog(LOG_ERR, "(s=%d) write: %m", req->socket);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 1: /* request by type */
|
case 1: /* request by type */
|
||||||
case 2: /* request by USN (unique id) */
|
case 2: /* request by USN (unique id) */
|
||||||
case 3: /* everything */
|
case 3: /* everything */
|
||||||
|
rp = rbuf+1;
|
||||||
while(d && (nrep < 255)) {
|
while(d && (nrep < 255)) {
|
||||||
if(d->t < t) {
|
if(d->t < t) {
|
||||||
syslog(LOG_INFO, "outdated device");
|
syslog(LOG_INFO, "outdated device");
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: testminissdpd.c,v 1.11 2015/05/27 20:03:21 nanard Exp $ */
|
/* $Id: testminissdpd.c,v 1.12 2015/08/06 13:16:59 nanard Exp $ */
|
||||||
/* Project : miniupnp
|
/* Project : miniupnp
|
||||||
* website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
* website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
||||||
* Author : Thomas BERNARD
|
* Author : Thomas BERNARD
|
||||||
|
@ -18,6 +18,19 @@
|
||||||
do { n = (n << 7) | (*p & 0x7f); } \
|
do { n = (n << 7) | (*p & 0x7f); } \
|
||||||
while(*(p++)&0x80);
|
while(*(p++)&0x80);
|
||||||
|
|
||||||
|
void printversion(const unsigned char * resp, int n)
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
const unsigned char * p;
|
||||||
|
|
||||||
|
p = resp;
|
||||||
|
DECODELENGTH(l, p);
|
||||||
|
if(resp + n < p + l) {
|
||||||
|
printf("get version error\n");
|
||||||
|
}
|
||||||
|
printf("MiniSSDPd version : %.*s\n", l, p);
|
||||||
|
}
|
||||||
|
|
||||||
void printresponse(const unsigned char * resp, int n)
|
void printresponse(const unsigned char * resp, int n)
|
||||||
{
|
{
|
||||||
int i, l;
|
int i, l;
|
||||||
|
@ -97,6 +110,7 @@ int connect_unix_socket(const char * sockpath)
|
||||||
int
|
int
|
||||||
main(int argc, char * * argv)
|
main(int argc, char * * argv)
|
||||||
{
|
{
|
||||||
|
char command0[] = { 0x00, 0x00 };
|
||||||
char command1[] = "\x01\x00urn:schemas-upnp-org:device:InternetGatewayDevice";
|
char command1[] = "\x01\x00urn:schemas-upnp-org:device:InternetGatewayDevice";
|
||||||
char command2[] = "\x02\x00uuid:fc4ec57e-b051-11db-88f8-0060085db3f6::upnp:rootdevice";
|
char command2[] = "\x02\x00uuid:fc4ec57e-b051-11db-88f8-0060085db3f6::upnp:rootdevice";
|
||||||
char command3[] = { 0x03, 0x00 };
|
char command3[] = { 0x03, 0x00 };
|
||||||
|
@ -126,6 +140,17 @@ main(int argc, char * * argv)
|
||||||
command4[1] = sizeof(command4) - 3;
|
command4[1] = sizeof(command4) - 3;
|
||||||
s = connect_unix_socket(sockpath);
|
s = connect_unix_socket(sockpath);
|
||||||
|
|
||||||
|
n = SENDCOMMAND(command0, sizeof(command0));
|
||||||
|
n = read(s, buf, sizeof(buf));
|
||||||
|
printf("Response received %d bytes\n", (int)n);
|
||||||
|
if(n > 0) {
|
||||||
|
printversion(buf, n);
|
||||||
|
} else {
|
||||||
|
printf("Command 0 (get version) not supported\n");
|
||||||
|
close(s);
|
||||||
|
s = connect_unix_socket(sockpath);
|
||||||
|
}
|
||||||
|
|
||||||
n = SENDCOMMAND(command1, sizeof(command1) - 1);
|
n = SENDCOMMAND(command1, sizeof(command1) - 1);
|
||||||
n = read(s, buf, sizeof(buf));
|
n = read(s, buf, sizeof(buf));
|
||||||
printf("Response received %d bytes\n", (int)n);
|
printf("Response received %d bytes\n", (int)n);
|
||||||
|
|
Loading…
Reference in New Issue