1 /* $Id: minissdpc.c,v 1.13 2009/12/04 16:57:29 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__)
19 #if defined(__amigaos__) || defined(__amigaos4__)
20 #include <sys/socket.h>
22 #if defined(__amigaos__)
23 #define uint16_t unsigned short
26 #define UNIX_PATH_LEN 108
29 char sun_path
[UNIX_PATH_LEN
];
32 #include <sys/socket.h>
36 #include "minissdpc.h"
37 #include "miniupnpc.h"
39 #include "codelength.h"
42 getDevicesFromMiniSSDPD(const char * devtype
, const char * socketpath
)
45 struct UPNPDev
* devlist
= NULL
;
46 unsigned char buffer
[2048];
51 unsigned int urlsize
, stsize
, usnsize
, l
;
53 struct sockaddr_un addr
;
55 s
= socket(AF_UNIX
, SOCK_STREAM
, 0);
58 /*syslog(LOG_ERR, "socket(unix): %m");*/
59 perror("socket(unix)");
62 addr
.sun_family
= AF_UNIX
;
63 strncpy(addr
.sun_path
, socketpath
, sizeof(addr
.sun_path
));
64 /* TODO : check if we need to handle the EINTR */
65 if(connect(s
, (struct sockaddr
*)&addr
, sizeof(struct sockaddr_un
)) < 0)
67 /*syslog(LOG_WARNING, "connect(\"%s\"): %m", socketpath);*/
71 stsize
= strlen(devtype
);
72 buffer
[0] = 1; /* request type 1 : request devices/services by type */
74 l
= stsize
; CODELENGTH(l
, p
);
75 if(p
+ stsize
> buffer
+ sizeof(buffer
))
77 /* devtype is too long ! */
81 memcpy(p
, devtype
, stsize
);
83 if(write(s
, buffer
, p
- buffer
) < 0)
85 /*syslog(LOG_ERR, "write(): %m");*/
86 perror("minissdpc.c: write()");
90 n
= read(s
, buffer
, sizeof(buffer
));
93 perror("minissdpc.c: read()");
98 for(i
= 0; i
< buffer
[0]; i
++)
100 if(p
+2>=buffer
+sizeof(buffer
))
102 DECODELENGTH(urlsize
, p
);
103 if(p
+urlsize
+2>=buffer
+sizeof(buffer
))
107 DECODELENGTH(stsize
, p
);
108 if(p
+stsize
+2>=buffer
+sizeof(buffer
))
110 tmp
= (struct UPNPDev
*)malloc(sizeof(struct UPNPDev
)+urlsize
+stsize
);
111 tmp
->pNext
= devlist
;
112 tmp
->descURL
= tmp
->buffer
;
113 tmp
->st
= tmp
->buffer
+ 1 + urlsize
;
114 memcpy(tmp
->buffer
, url
, urlsize
);
115 tmp
->buffer
[urlsize
] = '\0';
116 memcpy(tmp
->buffer
+ urlsize
+ 1, p
, stsize
);
118 tmp
->buffer
[urlsize
+1+stsize
] = '\0';
120 /* added for compatibility with recent versions of MiniSSDPd
122 DECODELENGTH(usnsize
, p
);
124 if(p
>buffer
+ sizeof(buffer
))