1
/* $Id: minissdpc.c,v 1.14 2010/11/25 09:57:25 nanard Exp $ */
3
* Author : Thomas BERNARD
4
* copyright (c) 2005-2009 Thomas Bernard
5
* This software is subjet to the conditions detailed in the
6
* provided LICENCE file. */
7
/*#include <syslog.h>*/
12
#include <sys/types.h>
13
#if defined(WIN32) || defined(__amigaos__) || defined(__amigaos4__)
21
#if defined(__amigaos__) || defined(__amigaos4__)
22
#include <sys/socket.h>
24
#if defined(__amigaos__)
25
#define uint16_t unsigned short
28
#define UNIX_PATH_LEN 108
31
char sun_path[UNIX_PATH_LEN];
34
#include <sys/socket.h>
38
#include "minissdpc.h"
39
#include "miniupnpc.h"
41
#include "codelength.h"
44
getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath)
47
struct UPNPDev * devlist = NULL;
48
unsigned char buffer[2048];
53
unsigned int urlsize, stsize, usnsize, l;
55
struct sockaddr_un addr;
57
s = socket(AF_UNIX, SOCK_STREAM, 0);
60
/*syslog(LOG_ERR, "socket(unix): %m");*/
61
perror("socket(unix)");
64
addr.sun_family = AF_UNIX;
65
strncpy(addr.sun_path, socketpath, sizeof(addr.sun_path));
66
/* TODO : check if we need to handle the EINTR */
67
if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0)
69
/*syslog(LOG_WARNING, "connect(\"%s\"): %m", socketpath);*/
73
stsize = strlen(devtype);
74
buffer[0] = 1; /* request type 1 : request devices/services by type */
76
l = stsize; CODELENGTH(l, p);
77
if(p + stsize > buffer + sizeof(buffer))
79
/* devtype is too long ! */
83
memcpy(p, devtype, stsize);
85
if(write(s, buffer, p - buffer) < 0)
87
/*syslog(LOG_ERR, "write(): %m");*/
88
perror("minissdpc.c: write()");
92
n = read(s, buffer, sizeof(buffer));
95
perror("minissdpc.c: read()");
100
for(i = 0; i < buffer[0]; i++)
102
if(p+2>=buffer+sizeof(buffer))
104
DECODELENGTH(urlsize, p);
105
if(p+urlsize+2>=buffer+sizeof(buffer))
109
DECODELENGTH(stsize, p);
110
if(p+stsize+2>=buffer+sizeof(buffer))
112
tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize);
113
tmp->pNext = devlist;
114
tmp->descURL = tmp->buffer;
115
tmp->st = tmp->buffer + 1 + urlsize;
116
memcpy(tmp->buffer, url, urlsize);
117
tmp->buffer[urlsize] = '\0';
118
memcpy(tmp->buffer + urlsize + 1, p, stsize);
120
tmp->buffer[urlsize+1+stsize] = '\0';
122
/* added for compatibility with recent versions of MiniSSDPd
124
DECODELENGTH(usnsize, p);
126
if(p>buffer + sizeof(buffer))