source: trunk/third-party/miniupnp/minissdpc.c @ 6848

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

updated to miniupnpc-20081002

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