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