Changeset 4251
- Timestamp:
- Dec 20, 2007, 8:18:22 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/upnp.c
r4175 r4251 88 88 struct UPNPDev * devlist; 89 89 errno = 0; 90 devlist = upnpDiscover( 2000, NULL );90 devlist = upnpDiscover( 2000, NULL, NULL ); 91 91 if( devlist == NULL ) { 92 92 tr_err( KEY "upnpDiscover returned NULL (errno %d - %s)", errno, strerror(errno) ); -
trunk/third-party/miniupnp/README
r3731 r4251 1 1 MiniUPnP is written by Thomas Bernard. 2 2 Its homepage is http://miniupnp.free.fr/ 3 This code is from the miniupnpc-20071 103 snapshot3 This code is from the miniupnpc-20071213 snapshot -
trunk/third-party/miniupnp/minisoap.c
r3731 r4251 1 /* $Id: minisoap.c,v 1.1 1 2007/05/19 13:13:08nanard Exp $ */1 /* $Id: minisoap.c,v 1.12 2007/12/13 17:09:03 nanard Exp $ */ 2 2 /* Project : miniupnp 3 3 * Author : Thomas Bernard … … 63 63 int headerssize; 64 64 bodysize = (int)strlen(body); 65 /* We are not using keep-alive HTTP connections. 66 * HTTP/1.1 needs the header Connection: close to do that. 67 * This is the default with HTTP/1.0 */ 65 68 headerssize = snprintf(headerbuf, sizeof(headerbuf), 66 "POST %s HTTP/1.1\r\n" 67 "HOST: %s:%d\r\n" 68 "Content-length: %d\r\n" 69 /* "POST %s HTTP/1.1\r\n"*/ 70 "POST %s HTTP/1.0\r\n" 71 "Host: %s:%d\r\n" 72 "User-Agent: POSIX, UPnP/1.0, miniUPnPc/1.0\r\n" 73 "Content-Length: %d\r\n" 69 74 "Content-Type: text/xml\r\n" 70 75 "SOAPAction: \"%s\"\r\n" 71 "Connection: Close\r\n" 76 /* "Connection: Close\r\n" */ 72 77 "\r\n", 73 78 url, host, port, bodysize, action); -
trunk/third-party/miniupnp/minissdpc.c
r3731 r4251 1 /* $Id: minissdpc.c,v 1. 3 2007/09/01 23:34:12nanard Exp $ */1 /* $Id: minissdpc.c,v 1.4 2007/12/19 14:56:58 nanard Exp $ */ 2 2 /* Project : miniupnp 3 3 * Author : Thomas BERNARD … … 17 17 #include "miniupnpc.h" 18 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 19 25 struct UPNPDev * 20 26 getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath) … … 22 28 struct UPNPDev * tmp; 23 29 struct UPNPDev * devlist = NULL; 24 unsigned char buffer[ 512];30 unsigned char buffer[2048]; 25 31 ssize_t n; 26 32 unsigned char * p; 33 unsigned char * url; 27 34 unsigned int i; 28 unsigned int urlsize, stsize ;35 unsigned int urlsize, stsize, usnsize, l; 29 36 int s; 30 37 struct sockaddr_un addr; … … 47 54 stsize = strlen(devtype); 48 55 buffer[0] = 1; 49 buffer[1] = stsize; 50 memcpy(buffer + 2, devtype, (int)buffer[1]); 51 if(write(s, buffer, (int)buffer[1] + 2) < 0) 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) 52 61 { 53 62 /*syslog(LOG_ERR, "write(): %m");*/ 54 perror(" write()");63 perror("minissdpc.c: write()"); 55 64 close(s); 56 65 return NULL; … … 59 68 if(n<=0) 60 69 { 70 perror("minissdpc.c: read()"); 61 71 close(s); 62 72 return NULL; … … 65 75 for(i = 0; i < buffer[0]; i++) 66 76 { 67 urlsize = *(p++); 68 stsize = p[urlsize]; 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; 69 87 tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize); 70 88 tmp->pNext = devlist; 71 89 tmp->descURL = tmp->buffer; 72 90 tmp->st = tmp->buffer + 1 + urlsize; 73 memcpy(tmp->buffer, p, urlsize);91 memcpy(tmp->buffer, url, urlsize); 74 92 tmp->buffer[urlsize] = '\0'; 75 p += urlsize;76 p++;77 93 memcpy(tmp->buffer + urlsize + 1, p, stsize); 94 p += stsize; 78 95 tmp->buffer[urlsize+1+stsize] = '\0'; 79 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; 80 103 } 81 104 close(s); -
trunk/third-party/miniupnp/miniupnpc.c
r3731 r4251 1 /* $Id: miniupnpc.c,v 1.4 5 2007/10/16 15:23:44 nanard Exp $ */1 /* $Id: miniupnpc.c,v 1.49 2007/12/19 14:58:54 nanard Exp $ */ 2 2 /* Project : miniupnp 3 3 * Author : Thomas BERNARD … … 129 129 /* simpleUPnPcommand : 130 130 * not so simple ! 131 * */131 * TODO: return some error codes */ 132 132 int simpleUPnPcommand(int s, const char * url, const char * service, 133 133 const char * action, struct UPNParg * args, … … 148 148 if(args==NULL) 149 149 { 150 soapbodylen = snprintf(soapbody, sizeof(soapbody),150 /*soapbodylen = snprintf(soapbody, sizeof(soapbody), 151 151 "<?xml version=\"1.0\"?>\r\n" 152 152 "<SOAP-ENV:Envelope " … … 156 156 "<m:%s xmlns:m=\"%s\"/>" 157 157 "</SOAP-ENV:Body></SOAP-ENV:Envelope>" 158 "\r\n", action, service); 158 "\r\n", action, service);*/ 159 soapbodylen = snprintf(soapbody, sizeof(soapbody), 160 "<?xml version=\"1.0\"?>\r\n" 161 "<s:Envelope " 162 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " 163 "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" 164 "<s:Body>" 165 "<m:%s xmlns:m=\"%s\">" 166 "</m:%s>" 167 "</s:Body></s:Envelope>" 168 "\r\n", action, service, action); 159 169 } 160 170 else … … 317 327 * It is up to the caller to free the chained list 318 328 * delay is in millisecond (poll) */ 319 struct UPNPDev * upnpDiscover(int delay, const char * multicastif) 329 struct UPNPDev * upnpDiscover(int delay, const char * multicastif, 330 const char * minissdpdsock) 320 331 { 321 332 struct UPNPDev * tmp; … … 344 355 #ifndef WIN32 345 356 /* first try to get infos from minissdpd ! */ 346 devlist = getDevicesFromMiniSSDPD(deviceList[0], "/var/run/minissdpd.sock"); 347 if(devlist) 348 return devlist; 357 if(!minissdpdsock) 358 minissdpdsock = "/var/run/minissdpd.sock"; 359 while(!devlist && deviceList[deviceIndex]) { 360 devlist = getDevicesFromMiniSSDPD(deviceList[deviceIndex], 361 minissdpdsock); 362 /* We return what we have found if it was not only a rootdevice */ 363 if(devlist && !strstr(deviceList[deviceIndex], "rootdevice")) 364 return devlist; 365 deviceIndex++; 366 } 367 deviceIndex = 0; 349 368 #endif 350 369 /* fallback to direct discovery */ … … 575 594 timeval.tv_sec = timeout / 1000; 576 595 timeval.tv_usec = (timeout % 1000) * 1000; 577 n = select(0, &socketSet, NULL, NULL, &timeval); 596 /*n = select(0, &socketSet, NULL, NULL, &timeval);*/ 597 n = select(FD_SETSIZE, &socketSet, NULL, NULL, &timeval); 578 598 if(n < 0) 579 599 { -
trunk/third-party/miniupnp/miniupnpc.h
r3731 r4251 1 /* $Id: miniupnpc.h,v 1.1 5 2007/10/16 15:07:32nanard Exp $ */1 /* $Id: miniupnpc.h,v 1.17 2007/12/19 14:58:54 nanard Exp $ */ 2 2 /* Project: miniupnp 3 3 * http://miniupnp.free.fr/ … … 16 16 #endif 17 17 18 /* Structures definitions : */ 18 19 struct UPNParg { const char * elt; const char * val; }; 19 20 … … 29 30 }; 30 31 31 /* discover UPnP devices on the network */ 32 LIBSPEC struct UPNPDev * upnpDiscover(int delay, const char * multicastif); 33 /* free returned list from above function */ 32 /* upnpDiscover() 33 * discover UPnP devices on the network. 34 * The discovered devices are returned as a chained list. 35 * It is up to the caller to free the list with freeUPNPDevlist(). 36 * delay (in millisecond) is the maximum time for waiting any device 37 * response. 38 * If available, device list will be obtained from MiniSSDPd. 39 * Default path for minissdpd socket will be used if minissdpdsock argument 40 * is NULL. 41 * If multicastif is not NULL, it will be used instead of the default 42 * multicast interface for sending SSDP discover packets. */ 43 LIBSPEC struct UPNPDev * upnpDiscover(int delay, const char * multicastif, 44 const char * minissdpdsock); 45 /* freeUPNPDevlist() 46 * free list returned by upnpDiscover() */ 34 47 LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist); 35 48 49 /* parserootdesc() : 50 * parse root XML description of a UPnP device and fill the IGDdatas 51 * structure. */ 36 52 LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *); 37 53 … … 39 55 * controlURL: controlURL of the WANIPConnection 40 56 * ipcondescURL: url of the description of the WANIPConnection 41 * controlURL_CIF: controlURL of the WANC OmmonInterfaceConfig57 * controlURL_CIF: controlURL of the WANCommonInterfaceConfig 42 58 */ 43 59 struct UPNPUrls { -
trunk/third-party/miniupnp/upnpcommands.c
r3731 r4251 1 /* $Id: upnpcommands.c,v 1.1 6 2007/08/03 14:11:42nanard Exp $ */1 /* $Id: upnpcommands.c,v 1.18 2007/12/19 14:56:14 nanard Exp $ */ 2 2 /* Project : miniupnp 3 3 * Author : Thomas Bernard … … 225 225 /* UPNP_GetExternalIPAddress() call the corresponding UPNP method. 226 226 * if the third arg is not null the value is copied to it. 227 * at least 16 bytes must be available */ 228 void UPNP_GetExternalIPAddress(const char * controlURL, const char * servicetype, char * extIpAdd) 229 { 230 struct NameValueParserData pdata; 231 char buffer[4096]; 232 int bufsize = 4096; 233 char * p; 234 235 if(!extIpAdd) 236 return; 227 * at least 16 bytes must be available 228 * 229 * Return values : 230 * 0 : SUCCESS 231 * NON ZERO : ERROR Either an UPnP error code or an unknown error. 232 * 233 * 402 Invalid Args - See UPnP Device Architecture section on Control. 234 * 501 Action Failed - See UPnP Device Architecture section on Control. 235 */ 236 int UPNP_GetExternalIPAddress(const char * controlURL, 237 const char * servicetype, 238 char * extIpAdd) 239 { 240 struct NameValueParserData pdata; 241 char buffer[4096]; 242 int bufsize = 4096; 243 char * p; 244 int ret = UPNPCOMMAND_UNKNOWN_ERROR; 245 246 if(!extIpAdd || !controlURL || !servicetype) 247 return UPNPCOMMAND_INVALID_ARGS; 237 248 238 249 simpleUPnPcommand(-1, controlURL, servicetype, "GetExternalIPAddress", 0, buffer, &bufsize); … … 242 253 /*printf("external ip = %s\n", GetValueFromNameValueList(&pdata, "NewExternalIPAddress") );*/ 243 254 p = GetValueFromNameValueList(&pdata, "NewExternalIPAddress"); 244 245 if(p){ 255 if(p) { 246 256 strncpy(extIpAdd, p, 16 ); 247 257 extIpAdd[15] = '\0'; 248 }else 258 ret = UPNPCOMMAND_SUCCESS; 259 } else 249 260 extIpAdd[0] = '\0'; 250 261 251 ClearNameValueList(&pdata); 262 p = GetValueFromNameValueList(&pdata, "errorCode"); 263 if(p) { 264 ret = UPNPCOMMAND_UNKNOWN_ERROR; 265 sscanf(p, "%d", &ret); 266 } 267 268 ClearNameValueList(&pdata); 269 return ret; 252 270 } 253 271 … … 267 285 int ret; 268 286 269 if(!inPort || !inClient )270 return 0;287 if(!inPort || !inClient || !proto || !extPort) 288 return UPNPCOMMAND_INVALID_ARGS; 271 289 272 290 AddPortMappingArgs = calloc(9, sizeof(struct UPNParg)); … … 293 311 ParseNameValue(buffer, bufsize, &pdata); 294 312 resVal = GetValueFromNameValueList(&pdata, "errorCode"); 295 ret = resVal?0:1; 296 /* Do something with resVal if not null ! */ 297 /*printf("AddPortMapping errorCode = '%s'\n", resVal); */ 313 if(resVal) { 314 /*printf("AddPortMapping errorCode = '%s'\n", resVal); */ 315 ret = UPNPCOMMAND_UNKNOWN_ERROR; 316 sscanf(resVal, "%d", &ret); 317 } else { 318 ret = UPNPCOMMAND_SUCCESS; 319 } 298 320 ClearNameValueList(&pdata); 299 321 free(AddPortMappingArgs); … … 301 323 } 302 324 303 void UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, 304 const char * extPort, const char * proto) 325 int 326 UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, 327 const char * extPort, const char * proto) 305 328 { 306 329 /*struct NameValueParserData pdata;*/ … … 308 331 char buffer[4096]; 309 332 int bufsize = 4096; 310 311 if(!extPort) 312 return; 333 struct NameValueParserData pdata; 334 const char * resVal; 335 int ret; 336 337 if(!extPort || !proto) 338 return UPNPCOMMAND_INVALID_ARGS; 313 339 314 340 DeletePortMappingArgs = calloc(4, sizeof(struct UPNParg)); … … 322 348 DeletePortMappingArgs, buffer, &bufsize); 323 349 /*DisplayNameValueList(buffer, bufsize);*/ 350 ParseNameValue(buffer, bufsize, &pdata); 351 resVal = GetValueFromNameValueList(&pdata, "errorCode"); 352 if(resVal) { 353 ret = UPNPCOMMAND_UNKNOWN_ERROR; 354 sscanf(resVal, "%d", &ret); 355 } else { 356 ret = UPNPCOMMAND_SUCCESS; 357 } 358 ClearNameValueList(&pdata); 324 359 free(DeletePortMappingArgs); 360 return ret; 325 361 } 326 362 … … 342 378 int bufsize = 4096; 343 379 char * p; 344 int r = -1; 380 int r = UPNPCOMMAND_UNKNOWN_ERROR; 381 if(!index) 382 return UPNPCOMMAND_INVALID_ARGS; 345 383 intClient[0] = '\0'; 346 384 intPort[0] = '\0'; … … 363 401 strncpy(extPort, p, 6); 364 402 extPort[5] = '\0'; 365 r = 0;403 r = UPNPCOMMAND_SUCCESS; 366 404 } 367 405 p = GetValueFromNameValueList(&pdata, "NewProtocol"); … … 402 440 duration[15] = '\0'; 403 441 } 442 p = GetValueFromNameValueList(&pdata, "errorCode"); 443 if(p) { 444 r = UPNPCOMMAND_UNKNOWN_ERROR; 445 sscanf(p, "%d", &r); 446 } 404 447 ClearNameValueList(&pdata); 405 448 free(GetPortMappingArgs); … … 407 450 } 408 451 409 voidUPNP_GetPortMappingNumberOfEntries(const char * controlURL, const char * servicetype, unsigned int * numEntries)452 int UPNP_GetPortMappingNumberOfEntries(const char * controlURL, const char * servicetype, unsigned int * numEntries) 410 453 { 411 454 struct NameValueParserData pdata; … … 413 456 int bufsize = 4096; 414 457 char* p; 458 int ret = UPNPCOMMAND_UNKNOWN_ERROR; 415 459 simpleUPnPcommand(-1, controlURL, servicetype, "GetPortMappingNumberOfEntries", 0, buffer, &bufsize); 416 460 #ifndef NDEBUG … … 418 462 #endif 419 463 ParseNameValue(buffer, bufsize, &pdata); 464 420 465 p = GetValueFromNameValueList(&pdata, "NewPortMappingNumberOfEntries"); 421 422 if(numEntries && p) 423 {424 sscanf(p,"%u",numEntries);466 if(numEntries && p) { 467 *numEntries = 0; 468 sscanf(p, "%u", numEntries); 469 ret = UPNPCOMMAND_SUCCESS; 425 470 } 471 472 p = GetValueFromNameValueList(&pdata, "errorCode"); 473 if(p) { 474 ret = UPNPCOMMAND_UNKNOWN_ERROR; 475 sscanf(p, "%d", &ret); 476 } 477 426 478 ClearNameValueList(&pdata); 479 return ret; 427 480 } 428 481 … … 430 483 * the result is returned in the intClient and intPort strings 431 484 * please provide 16 and 6 bytes of data */ 432 void 485 int 433 486 UPNP_GetSpecificPortMappingEntry(const char * controlURL, 434 487 const char * servicetype, … … 443 496 int bufsize = 4096; 444 497 char * p; 445 446 if(!intPort && !intClient && !extPort) 447 return; 498 int ret = UPNPCOMMAND_UNKNOWN_ERROR; 499 500 if(!intPort || !intClient || !extPort || !proto) 501 return UPNPCOMMAND_INVALID_ARGS; 448 502 449 503 GetPortMappingArgs = calloc(4, sizeof(struct UPNParg)); … … 459 513 /*DisplayNameValueList(buffer, bufsize);*/ 460 514 ParseNameValue(buffer, bufsize, &pdata); 515 461 516 p = GetValueFromNameValueList(&pdata, "NewInternalClient"); 462 463 if(intClient) 464 { 465 if(p){ 466 strncpy(intClient, p, 16); 467 intClient[15] = '\0'; 468 }else 469 intClient[0] = '\0'; 470 } 517 if(p) { 518 strncpy(intClient, p, 16); 519 intClient[15] = '\0'; 520 ret = UPNPCOMMAND_SUCCESS; 521 } else 522 intClient[0] = '\0'; 471 523 472 524 p = GetValueFromNameValueList(&pdata, "NewInternalPort"); 473 if(intPort) 474 { 475 if(p){ 476 strncpy(intPort, p, 6); 477 intPort[5] = '\0'; 478 }else 479 intPort[0] = '\0'; 525 if(p) { 526 strncpy(intPort, p, 6); 527 intPort[5] = '\0'; 528 } else 529 intPort[0] = '\0'; 530 531 p = GetValueFromNameValueList(&pdata, "errorCode"); 532 if(p) { 533 ret = UPNPCOMMAND_UNKNOWN_ERROR; 534 sscanf(p, "%d", &ret); 480 535 } 481 536 482 537 ClearNameValueList(&pdata); 483 538 free(GetPortMappingArgs); 484 } 485 486 539 return ret; 540 } 541 542 -
trunk/third-party/miniupnp/upnpcommands.h
r3731 r4251 1 /* $Id: upnpcommands.h,v 1.1 0 2007/01/29 20:27:24nanard Exp $ */1 /* $Id: upnpcommands.h,v 1.12 2007/12/19 14:56:15 nanard Exp $ */ 2 2 /* Miniupnp project : http://miniupnp.free.fr/ 3 3 * Author : Thomas Bernard … … 10 10 #include "upnpreplyparse.h" 11 11 #include "declspec.h" 12 13 /* MiniUPnPc return codes : */ 14 #define UPNPCOMMAND_SUCCESS (0) 15 #define UPNPCOMMAND_UNKNOWN_ERROR (-1) 16 #define UPNPCOMMAND_INVALID_ARGS (-2) 12 17 13 18 #ifdef __cplusplus … … 44 49 /* UPNP_GetExternalIPAddress() call the corresponding UPNP method. 45 50 * if the third arg is not null the value is copied to it. 46 * at least 16 bytes must be available */ 47 LIBSPEC void 51 * at least 16 bytes must be available 52 * 53 * Return values : 54 * 0 : SUCCESS 55 * NON ZERO : ERROR Either an UPnP error code or an unknown error. 56 * 57 * possible UPnP Errors : 58 * 402 Invalid Args - See UPnP Device Architecture section on Control. 59 * 501 Action Failed - See UPnP Device Architecture section on Control. */ 60 LIBSPEC int 48 61 UPNP_GetExternalIPAddress(const char * controlURL, 49 62 const char * servicetype, … … 56 69 unsigned int * bitrateUp); 57 70 58 /* Returns zero if unable to add the port mapping, otherwise non-zero 59 * to indicate success */ 71 /* UPNP_AddPortMapping() 72 * 73 * Return values : 74 * 0 : SUCCESS 75 * NON ZERO : ERROR. Either an UPnP error code or an unknown error. 76 * 77 * List of possible UPnP errors for AddPortMapping : 78 * errorCode errorDescription (short) - Description (long) 79 * 402 Invalid Args - See UPnP Device Architecture section on Control. 80 * 501 Action Failed - See UPnP Device Architecture section on Control. 81 * 715 WildCardNotPermittedInSrcIP - The source IP address cannot be 82 * wild-carded 83 * 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded 84 * 718 ConflictInMappingEntry - The port mapping entry specified conflicts 85 * with a mapping assigned previously to another client 86 * 724 SamePortValuesRequired - Internal and External port values 87 * must be the same 88 * 725 OnlyPermanentLeasesSupported - The NAT implementation only supports 89 * permanent lease times on port mappings 90 * 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard 91 * and cannot be a specific IP address or DNS name 92 * 727 ExternalPortOnlySupportsWildcard - ExternalPort must be a wildcard and 93 * cannot be a specific port value */ 60 94 LIBSPEC int 61 95 UPNP_AddPortMapping(const char * controlURL, const char * servicetype, … … 66 100 const char * proto); 67 101 68 LIBSPEC void 102 /* UPNP_DeletePortMapping() 103 * Return Values : 104 * 0 : SUCCESS 105 * NON ZERO : error. Either an UPnP error code or an undefined error. 106 * 107 * List of possible UPnP errors for DeletePortMapping : 108 * 402 Invalid Args - See UPnP Device Architecture section on Control. 109 * 714 NoSuchEntryInArray - The specified value does not exist in the array */ 110 LIBSPEC int 69 111 UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, 70 112 const char * extPort, const char * proto); 71 113 72 LIBSPEC void114 LIBSPEC int 73 115 UPNP_GetPortMappingNumberOfEntries(const char* controlURL, const char* servicetype, unsigned int * num); 74 116 … … 76 118 * the result is returned in the intClient and intPort strings 77 119 * please provide 16 and 6 bytes of data */ 78 LIBSPEC void120 LIBSPEC int 79 121 UPNP_GetSpecificPortMappingEntry(const char * controlURL, 80 122 const char * servicetype, … … 84 126 char * intPort); 85 127 128 /* UPNP_GetGenericPortMappingEntry() 129 * 130 * Possible UPNP Error codes : 131 * 402 Invalid Args - See UPnP Device Architecture section on Control. 132 * 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds 133 */ 86 134 LIBSPEC int 87 135 UPNP_GetGenericPortMappingEntry(const char * controlURL,
Note: See TracChangeset
for help on using the changeset viewer.