source: branches/1.5x/third-party/miniupnp/minissdpc.c @ 7869

Last change on this file since 7869 was 7869, checked in by charles, 13 years ago

(1.5x) update to Jan 2009 versions of libnatpmp and miniupnpc

File size: 2.5 KB
Line 
1/* $Id: minissdpc.c,v 1.7 2008/12/18 17:45:48 nanard Exp $ */
2/* Project : miniupnp
3 * Author : Thomas BERNARD
4 * copyright (c) 2005-2008 Thomas Bernard
5 * This software is subjet to the conditions detailed in the
6 * provided LICENCE file. */
7/*#include <syslog.h>*/
8#include <stdio.h>
9#include <string.h>
10#include <stdlib.h>
11#include <unistd.h>
12#include <sys/types.h>
13#ifdef WIN32
14#include <winsock2.h>
15#include <Ws2tcpip.h>
16#include <io.h>
17#else
18#include <sys/socket.h>
19#include <sys/un.h>
20#endif
21
22#include "minissdpc.h"
23#include "miniupnpc.h"
24
25#include "codelength.h"
26
27struct UPNPDev *
28getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath)
29{
30        struct UPNPDev * tmp;
31        struct UPNPDev * devlist = NULL;
32        unsigned char buffer[2048];
33        ssize_t n;
34        unsigned char * p;
35        unsigned char * url;
36        unsigned int i;
37        unsigned int urlsize, stsize, usnsize, l;
38        int s;
39        struct sockaddr_un addr;
40
41        s = socket(AF_UNIX, SOCK_STREAM, 0);
42        if(s < 0)
43        {
44                /*syslog(LOG_ERR, "socket(unix): %m");*/
45                perror("socket(unix)");
46                return NULL;
47        }
48        addr.sun_family = AF_UNIX;
49        strncpy(addr.sun_path, socketpath, sizeof(addr.sun_path));
50        if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0)
51        {
52                /*syslog(LOG_WARNING, "connect(\"%s\"): %m", socketpath);*/
53                close(s);
54                return NULL;
55        }
56        stsize = strlen(devtype);
57        buffer[0] = 1; /* request type 1 : request devices/services by type */
58        p = buffer + 1;
59        l = stsize;     CODELENGTH(l, p);
60        memcpy(p, devtype, stsize);
61        p += stsize;
62        if(write(s, buffer, p - buffer) < 0)
63        {
64                /*syslog(LOG_ERR, "write(): %m");*/
65                perror("minissdpc.c: write()");
66                close(s);
67                return NULL;
68        }
69        n = read(s, buffer, sizeof(buffer));
70        if(n<=0)
71        {
72                perror("minissdpc.c: read()");
73                close(s);
74                return NULL;
75        }
76        p = buffer + 1;
77        for(i = 0; i < buffer[0]; i++)
78        {
79                if(p+2>=buffer+sizeof(buffer))
80                        break;
81                DECODELENGTH(urlsize, p);
82                if(p+urlsize+2>=buffer+sizeof(buffer))
83                        break;
84                url = p;
85                p += urlsize;
86                DECODELENGTH(stsize, p);
87                if(p+stsize+2>=buffer+sizeof(buffer))
88                        break;
89                tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize);
90                tmp->pNext = devlist;
91                tmp->descURL = tmp->buffer;
92                tmp->st = tmp->buffer + 1 + urlsize;
93                memcpy(tmp->buffer, url, urlsize);
94                tmp->buffer[urlsize] = '\0';
95                memcpy(tmp->buffer + urlsize + 1, p, stsize);
96                p += stsize;
97                tmp->buffer[urlsize+1+stsize] = '\0';
98                devlist = tmp;
99                /* added for compatibility with recent versions of MiniSSDPd
100                 * >= 2007/12/19 */
101                DECODELENGTH(usnsize, p);
102                p += usnsize;
103                if(p>buffer + sizeof(buffer))
104                        break;
105        }
106        close(s);
107        return devlist;
108}
109
Note: See TracBrowser for help on using the repository browser.