Ignore:
Timestamp:
May 1, 2010, 4:21:41 AM (11 years ago)
Author:
charles
Message:

(1.9x third-party) upgrade our miniupnp snapshot for #3125 "UPnP fails on Linksys AM300 modem/router"

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/1.9x/third-party/miniupnp/miniwget.c

    r10285 r10578  
    1 /* $Id: miniwget.c,v 1.31 2009/12/04 11:29:19 nanard Exp $ */
     1/* $Id: miniwget.c,v 1.37 2010/04/12 20:39:42 nanard Exp $ */
    22/* Project : miniupnp
    33 * Author : Thomas Bernard
    4  * Copyright (c) 2005-2009 Thomas Bernard
     4 * Copyright (c) 2005-2010 Thomas Bernard
    55 * This software is subject to the conditions detailed in the
    6  * LICENCE file provided in this distribution.
    7  * */
     6 * LICENCE file provided in this distribution. */
     7 
    88#include <stdio.h>
    99#include <stdlib.h>
     
    1212#ifdef WIN32
    1313#include <winsock2.h>
     14#include <ws2tcpip.h>
    1415#include <io.h>
    1516#define MAXHOSTNAMELEN 64
    1617#define MIN(x,y) (((x)<(y))?(x):(y))
    1718#define snprintf _snprintf
    18 #define herror
    1919#define socklen_t int
    20 #else
     20#else /* #ifdef WIN32 */
    2121#include <unistd.h>
    2222#include <sys/param.h>
    2323#if defined(__amigaos__) && !defined(__amigaos4__)
    2424#define socklen_t int
    25 #else
     25#else /* #if defined(__amigaos__) && !defined(__amigaos4__) */
    2626#include <sys/select.h>
    27 #endif
     27#endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */
    2828#include <sys/socket.h>
     29#include <arpa/inet.h>
    2930#include <netdb.h>
    30 #include <netinet/in.h>
    31 #include <arpa/inet.h>
    32 #include <errno.h>
    33 #include <time.h>
    3431#define closesocket close
     32/* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions
     33 * during the connect() call */
    3534#define MINIUPNPC_IGNORE_EINTR
    36 #endif
     35#endif /* #else WIN32 */
    3736#if defined(__sun) || defined(sun)
    3837#define MIN(x,y) (((x)<(y))?(x):(y))
    3938#endif
    40 #if defined(__amigaos__) || defined(__amigaos4__)
    41 #define herror(A) printf("%s\n", A)
    42 #endif
    4339
    4440#include "miniupnpcstrings.h"
    4541#include "miniwget.h"
    46 
    47 /* miniwget2() :
    48  * */
     42#include "connecthostport.h"
     43
     44/* miniwget3() :
     45 * do all the work.
     46 * Return NULL if something failed. */
    4947static void *
    50 miniwget2(const char * url, const char * host,
     48miniwget3(const char * url, const char * host,
    5149                  unsigned short port, const char * path,
    52                   int * size, char * addr_str, int addr_str_len)
     50                  int * size, char * addr_str, int addr_str_len, const char * httpversion)
    5351{
    5452        char buf[2048];
    5553    int s;
    56         struct sockaddr_in dest;
    57         struct hostent *hp;
    5854        int n;
    5955        int len;
    6056        int sent;
    61 #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
    62         struct timeval timeout;
    63 #endif
     57
    6458        *size = 0;
    65         hp = gethostbyname(host);
    66         if(hp==NULL)
    67         {
    68                 herror(host);
     59        s = connecthostport(host, port);
     60        if(s < 0)
    6961                return NULL;
    70         }
    71         /*  memcpy((char *)&dest.sin_addr, hp->h_addr, hp->h_length);  */
    72         memcpy(&dest.sin_addr, hp->h_addr, sizeof(dest.sin_addr));
    73         memset(dest.sin_zero, 0, sizeof(dest.sin_zero));
    74         s = socket(PF_INET, SOCK_STREAM, 0);
    75         if(s < 0)
    76         {
    77                 perror("socket");
    78                 return NULL;
    79         }
    80 #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
    81         /* setting a 3 seconds timeout for the connect() call */
    82         timeout.tv_sec = 3;
    83         timeout.tv_usec = 0;
    84         if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
    85         {
    86                 perror("setsockopt");
    87         }
    88         timeout.tv_sec = 3;
    89         timeout.tv_usec = 0;
    90         if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
    91         {
    92                 perror("setsockopt");
    93         }
    94 #endif
    95         dest.sin_family = AF_INET;
    96         dest.sin_port = htons(port);
    97         n = connect(s, (struct sockaddr *)&dest, sizeof(struct sockaddr_in));
    98 #ifdef MINIUPNPC_IGNORE_EINTR
    99         while(n < 0 && errno == EINTR)
    100         {
    101                 socklen_t len;
    102                 fd_set wset;
    103                 int err;
    104                 FD_ZERO(&wset);
    105                 FD_SET(s, &wset);
    106                 if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR)
    107                         continue;
    108                 /*len = 0;*/
    109                 /*n = getpeername(s, NULL, &len);*/
    110                 len = sizeof(err);
    111                 if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
    112                         perror("getsockopt");
    113                         closesocket(s);
    114                         return NULL;
    115                 }
    116                 if(err != 0) {
    117                         errno = err;
    118                         n = -1;
    119                 }
    120         }
    121 #endif
    122         if(n<0)
    123         {
    124                 perror("connect");
    125                 closesocket(s);
    126                 return NULL;
    127         }
    12862
    12963        /* get address for caller ! */
    13064        if(addr_str)
    13165        {
    132                 struct sockaddr_in saddr;
     66                struct sockaddr saddr;
    13367                socklen_t saddrlen;
    13468
    13569                saddrlen = sizeof(saddr);
    136                 if(getsockname(s, (struct sockaddr *)&saddr, &saddrlen) < 0)
     70                if(getsockname(s, &saddr, &saddrlen) < 0)
    13771                {
    13872                        perror("getsockname");
     
    14074                else
    14175                {
    142 #if defined(WIN32) || (defined(__amigaos__) && !defined(__amigaos4__))
     76#if defined(__amigaos__) && !defined(__amigaos4__)
    14377        /* using INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
    14478     * But his function make a string with the port :  nn.nn.nn.nn:port */
     
    14882                    printf("WSAAddressToStringA() failed : %d\n", WSAGetLastError());
    14983                }*/
    150                         strncpy(addr_str, inet_ntoa(saddr.sin_addr), addr_str_len);
     84                        strncpy(addr_str, inet_ntoa(((struct sockaddr_in *)&saddr)->sin_addr), addr_str_len);
    15185#else
    152                         inet_ntop(AF_INET, &saddr.sin_addr, addr_str, addr_str_len);
     86                        /*inet_ntop(AF_INET, &saddr.sin_addr, addr_str, addr_str_len);*/
     87                        n = getnameinfo(&saddr, saddrlen,
     88                                        addr_str, addr_str_len,
     89                                        NULL, 0,
     90                                        NI_NUMERICHOST | NI_NUMERICSERV);
     91                        if(n != 0) {
     92#ifdef WIN32
     93                                fprintf(stderr, "getnameinfo() failed : %d\n", n);
     94#else
     95                                fprintf(stderr, "getnameinfo() failed : %s\n", gai_strerror(n));
     96#endif
     97                        }
    15398#endif
    15499                }
     
    159104
    160105        len = snprintf(buf, sizeof(buf),
    161                  "GET %s HTTP/1.0\r\n"
     106                 "GET %s HTTP/%s\r\n"
    162107                             "Host: %s:%d\r\n"
    163108                                 "Connection: Close\r\n"
     
    165110
    166111                                 "\r\n",
    167                     path, host, port);
     112                           path, httpversion, host, port);
    168113        sent = 0;
    169114        /* sending the HTTP request */
     
    232177}
    233178
     179/* miniwget2() :
     180 * Call miniwget3(); retry with HTTP/1.1 if 1.0 fails. */
     181static void *
     182miniwget2(const char * url, const char * host,
     183                  unsigned short port, const char * path,
     184                  int * size, char * addr_str, int addr_str_len)
     185{
     186        char * respbuffer;
     187
     188        respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.0");
     189        if (*size == 0)
     190        {
     191#ifdef DEBUG
     192                printf("Retrying with HTTP/1.1\n");
     193#endif
     194                free(respbuffer);
     195                respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.1");
     196        }
     197        return respbuffer;
     198}
     199
     200
     201
     202
    234203/* parseURL()
    235204 * arguments :
Note: See TracChangeset for help on using the changeset viewer.