亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? upnp.c

?? GNUnet是一個安全的點對點網絡框架
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**
 * @file upnp.c UPnP Implementation
 * @ingroup core
 *
 * gaim
 *
 * Gaim is the legal property of its developers, whose names are too numerous
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "platform.h"
#include "xmlnode.h"
#include "util.h"
#include "upnp.h"
#include "error.h"
#include "ip.h"

#include <curl/curl.h>

#define TRUE GNUNET_YES
#define FALSE GNUNET_NO
#define g_return_if_fail(a) if(!(a)) return;
#define g_return_val_if_fail(a, val) if(!(a)) return (val);

#define HTTP_OK "200 OK"
#define NUM_UDP_ATTEMPTS 2
#define HTTPMU_HOST_ADDRESS "239.255.255.250"
#define HTTPMU_HOST_PORT 1900
#define SEARCH_REQUEST_DEVICE "urn:schemas-upnp-org:service:%s"
#define SEARCH_REQUEST_STRING \
  "M-SEARCH * HTTP/1.1\r\n" \
  "MX: 2\r\n" \
  "HOST: 239.255.255.250:1900\r\n" \
  "MAN: \"ssdp:discover\"\r\n" \
  "ST: urn:schemas-upnp-org:service:%s\r\n" \
  "\r\n"
#define WAN_IP_CONN_SERVICE "WANIPConnection:1"
#define WAN_PPP_CONN_SERVICE "WANPPPConnection:1"
#define HTTP_POST_SOAP_HEADER \
        "SOAPACTION: \"urn:schemas-upnp-org:service:%s#%s\""
#define HTTP_POST_SIZE_HEADER "CONTENT-LENGTH: %u"
#define SOAP_ACTION \
  "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" \
  "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " \
  	"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" \
    "<s:Body>\r\n" \
      "<u:%s xmlns:u=\"urn:schemas-upnp-org:service:%s\">\r\n" \
        "%s" \
      "</u:%s>\r\n" \
    "</s:Body>\r\n" \
  "</s:Envelope>"
#define PORT_MAPPING_LEASE_TIME "0"
#define PORT_MAPPING_DESCRIPTION "GNUNET_UPNP_PORT_FORWARD"
#define ADD_PORT_MAPPING_PARAMS \
  "<NewRemoteHost></NewRemoteHost>\r\n" \
  "<NewExternalPort>%i</NewExternalPort>\r\n" \
  "<NewProtocol>%s</NewProtocol>\r\n" \
  "<NewInternalPort>%i</NewInternalPort>\r\n" \
  "<NewInternalClient>%s</NewInternalClient>\r\n" \
  "<NewEnabled>1</NewEnabled>\r\n" \
  "<NewPortMappingDescription>" \
  PORT_MAPPING_DESCRIPTION \
  "</NewPortMappingDescription>\r\n" \
  "<NewLeaseDuration>" \
  PORT_MAPPING_LEASE_TIME \
  "</NewLeaseDuration>\r\n"
#define DELETE_PORT_MAPPING_PARAMS \
  "<NewRemoteHost></NewRemoteHost>\r\n" \
  "<NewExternalPort>%i</NewExternalPort>\r\n" \
  "<NewProtocol>%s</NewProtocol>\r\n"

typedef enum
{
  GAIM_UPNP_STATUS_UNDISCOVERED = -1,
  GAIM_UPNP_STATUS_UNABLE_TO_DISCOVER,
  GAIM_UPNP_STATUS_DISCOVERING,
  GAIM_UPNP_STATUS_DISCOVERED
} GaimUPnPStatus;

typedef struct
{
  GaimUPnPStatus status;
  char *control_url;
  const char *service_type;
  char publicip[16];
} GaimUPnPControlInfo;

typedef struct
{
  const char *service_type;
  char *full_url;
  char *buf;
  unsigned int buf_len;
  int sock;
} UPnPDiscoveryData;

static GaimUPnPControlInfo control_info = {
  GAIM_UPNP_STATUS_UNDISCOVERED,
  NULL,
  NULL,
  "",
};

/**
 * This is the signature used for functions that act as a callback
 * to CURL.
 */
typedef size_t (*GaimUtilFetchUrlCallback) (void *url_data,
                                            size_t size,
                                            size_t nmemb, void *user_data);



static char *
g_strstr_len (const char *haystack, int haystack_len, const char *needle)
{
  int i;

  g_return_val_if_fail (haystack != NULL, NULL);
  g_return_val_if_fail (needle != NULL, NULL);

  if (haystack_len < 0)
    return strstr (haystack, needle);
  else
    {
      const char *p = haystack;
      int needle_len = strlen (needle);
      const char *end = haystack + haystack_len - needle_len;

      if (needle_len == 0)
        return (char *) haystack;

      while (*p && p <= end)
        {
          for (i = 0; i < needle_len; i++)
            if (p[i] != needle[i])
              goto next;

          return (char *) p;

        next:
          p++;
        }
    }

  return NULL;
}

static int
gaim_upnp_compare_device (const xmlnode * device, const char *deviceType)
{
  xmlnode *deviceTypeNode = xmlnode_get_child (device, "deviceType");
  char *tmp;
  int ret;

  if (deviceTypeNode == NULL)
    return FALSE;
  tmp = xmlnode_get_data (deviceTypeNode);
  ret = !strcasecmp (tmp, deviceType);
  GNUNET_free (tmp);
  return ret;
}

static int
gaim_upnp_compare_service (const xmlnode * service, const char *serviceType)
{
  xmlnode *serviceTypeNode;
  char *tmp;
  int ret;

  if (service == NULL)
    return FALSE;
  serviceTypeNode = xmlnode_get_child (service, "serviceType");
  if (serviceTypeNode == NULL)
    return FALSE;
  tmp = xmlnode_get_data (serviceTypeNode);
  ret = !strcasecmp (tmp, serviceType);
  GNUNET_free (tmp);
  return ret;
}

static char *
gaim_upnp_parse_description_response (const char *httpResponse,
                                      size_t len,
                                      const char *httpURL,
                                      const char *serviceType)
{
  char *xmlRoot, *baseURL, *controlURL, *service;
  xmlnode *xmlRootNode, *serviceTypeNode, *controlURLNode, *baseURLNode;
  char *tmp;

  /* find the root of the xml document */
  xmlRoot = g_strstr_len (httpResponse, len, "<root");
  if (xmlRoot == NULL)
    return NULL;
  if (g_strstr_len (httpResponse, len, "</root") == NULL)
    return NULL;

  /* create the xml root node */
  xmlRootNode = xmlnode_from_str (xmlRoot, len - (xmlRoot - httpResponse));
  if (xmlRootNode == NULL)
    return NULL;

  /* get the baseURL of the device */
  baseURLNode = xmlnode_get_child (xmlRootNode, "URLBase");
  if (baseURLNode != NULL)
    {
      baseURL = xmlnode_get_data (baseURLNode);
    }
  else
    {
      baseURL = GNUNET_strdup (httpURL);
    }

  /* get the serviceType child that has the service type as its data */
  /* get urn:schemas-upnp-org:device:InternetGatewayDevice:1 and its devicelist */
  serviceTypeNode = xmlnode_get_child (xmlRootNode, "device");
  while (!gaim_upnp_compare_device (serviceTypeNode,
                                    "urn:schemas-upnp-org:device:InternetGatewayDevice:1")
         && serviceTypeNode != NULL)
    {
      serviceTypeNode = xmlnode_get_next_twin (serviceTypeNode);
    }
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }
  serviceTypeNode = xmlnode_get_child (serviceTypeNode, "deviceList");
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }

  /* get urn:schemas-upnp-org:device:WANDevice:1 and its devicelist */
  serviceTypeNode = xmlnode_get_child (serviceTypeNode, "device");
  while (!gaim_upnp_compare_device (serviceTypeNode,
                                    "urn:schemas-upnp-org:device:WANDevice:1")
         && serviceTypeNode != NULL)
    {
      serviceTypeNode = xmlnode_get_next_twin (serviceTypeNode);
    }
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }
  serviceTypeNode = xmlnode_get_child (serviceTypeNode, "deviceList");
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }

  /* get urn:schemas-upnp-org:device:WANConnectionDevice:1 and its servicelist */
  serviceTypeNode = xmlnode_get_child (serviceTypeNode, "device");
  while (serviceTypeNode && !gaim_upnp_compare_device (serviceTypeNode,
                                                       "urn:schemas-upnp-org:device:WANConnectionDevice:1"))
    {
      serviceTypeNode = xmlnode_get_next_twin (serviceTypeNode);
    }
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }
  serviceTypeNode = xmlnode_get_child (serviceTypeNode, "serviceList");
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }

  /* get the serviceType variable passed to this function */
  service = g_strdup_printf (SEARCH_REQUEST_DEVICE, serviceType);
  serviceTypeNode = xmlnode_get_child (serviceTypeNode, "service");
  while (!gaim_upnp_compare_service (serviceTypeNode, service) &&
         serviceTypeNode != NULL)
    {
      serviceTypeNode = xmlnode_get_next_twin (serviceTypeNode);
    }

  GNUNET_free (service);
  if (serviceTypeNode == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }

  /* get the controlURL of the service */
  if ((controlURLNode = xmlnode_get_child (serviceTypeNode,
                                           "controlURL")) == NULL)
    {
      GNUNET_free (baseURL);
      xmlnode_free (xmlRootNode);
      return NULL;
    }

  tmp = xmlnode_get_data (controlURLNode);
  if (baseURL && !gaim_str_has_prefix (tmp, "http://") &&
      !gaim_str_has_prefix (tmp, "HTTP://"))
    {
      if (tmp[0] == '/')
        {
          size_t len;
          const char *end;
          /* absolute path */
          end = strstr (&baseURL[strlen ("http://")], "/");
          if (end == NULL)
            len = strlen (&baseURL[strlen ("http://")]);
          else
            len = end - &baseURL[strlen ("http://")];
          controlURL = g_strdup_printf ("http://%.*s%s",
                                        len,
                                        &baseURL[strlen ("http://")], tmp);
        }
      else
        {
          controlURL = g_strdup_printf ("%s%s", baseURL, tmp);
        }
      GNUNET_free (tmp);
    }
  else
    {
      controlURL = tmp;
    }
  GNUNET_free (baseURL);
  xmlnode_free (xmlRootNode);

  return controlURL;
}

#define CURL_EASY_SETOPT(c, a, b) do { ret = curl_easy_setopt(c, a, b); if (ret != CURLE_OK) GNUNET_GE_LOG(NULL, GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK, _("%s failed at %s:%d: `%s'\n"), "curl_easy_setopt", __FILE__, __LINE__, curl_easy_strerror(ret)); } while (0);

/**
 * Do the generic curl setup.
 */
static int
setup_curl (const char *proxy, CURL * curl)
{
  int ret;

  CURL_EASY_SETOPT (curl, CURLOPT_FAILONERROR, 1);
  if (strlen (proxy) > 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲另类激情小说| 2020国产精品| 欧美不卡一二三| 国产精品不卡一区二区三区| 亚洲第一福利视频在线| 国产一区中文字幕| 欧美日韩久久一区| 中文字幕一区二区三区色视频| 日本系列欧美系列| 91同城在线观看| 亚洲国产精品精华液2区45| 免费的成人av| 欧美人伦禁忌dvd放荡欲情| 1区2区3区欧美| 成人午夜激情片| 2023国产精品| 久久不见久久见免费视频1| 欧美日韩精品一区视频| 亚洲欧美福利一区二区| 国产69精品久久久久毛片| 精品日韩一区二区| 蜜桃视频一区二区| 91精品国产手机| 午夜一区二区三区视频| 色噜噜狠狠成人网p站| 自拍偷拍国产精品| av在线这里只有精品| 国产精品污污网站在线观看| 国产在线视频一区二区| 精品国产一二三| 精品在线观看视频| 欧美精品一区二区三区蜜臀| 久久99日本精品| 精品国产乱码久久| 精品一区二区在线播放| 精品国产乱码91久久久久久网站| 美女爽到高潮91| 久久蜜臀中文字幕| 丁香五精品蜜臀久久久久99网站 | av电影在线观看不卡| 国产精品美女久久福利网站| 不卡av在线网| 亚洲美女屁股眼交3| 欧日韩精品视频| 午夜精品久久久久久久99樱桃| 欧美日韩国产经典色站一区二区三区| 性欧美疯狂xxxxbbbb| 欧美一级日韩免费不卡| 国产综合久久久久久鬼色| 欧美国产日韩精品免费观看| 成人av先锋影音| 亚洲综合男人的天堂| 欧美一区二区精美| 国产高清精品网站| 亚洲精品欧美综合四区| 欧美日韩国产首页| 精品一区二区三区日韩| 国产精品国产三级国产有无不卡| 色综合网色综合| 美女www一区二区| 国产精品久久久久影院老司 | 日韩免费视频一区二区| 5858s免费视频成人| 麻豆国产精品官网| 久久精品人人爽人人爽| 在线免费不卡视频| 久久99精品国产麻豆婷婷| 综合久久久久久久| 欧美一区二区视频观看视频| 大胆亚洲人体视频| 日韩影院在线观看| 亚洲视频在线一区二区| 日韩一区二区三区电影在线观看| 懂色中文一区二区在线播放| 亚洲中国最大av网站| 久久久久久久久久电影| 欧美视频精品在线| 粉嫩嫩av羞羞动漫久久久| 亚洲一区二区中文在线| 国产网红主播福利一区二区| 精品视频1区2区3区| 成人av电影免费观看| 男女男精品视频| 亚洲免费色视频| 国产喂奶挤奶一区二区三区| 51久久夜色精品国产麻豆| 91麻豆精品视频| 国产精品一线二线三线精华| 午夜一区二区三区视频| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲女人****多毛耸耸8| 精品剧情v国产在线观看在线| 在线观看成人免费视频| 成人av网站在线观看免费| 久久成人av少妇免费| 日日夜夜精品视频天天综合网| 成人欧美一区二区三区小说| 国产欧美一二三区| 精品国免费一区二区三区| 欧美日韩高清影院| 欧美亚洲丝袜传媒另类| 日本丰满少妇一区二区三区| 成人精品gif动图一区| 国产精品白丝av| 国产精品自拍毛片| 精品一区二区成人精品| 免费观看在线色综合| 日韩在线一区二区| 婷婷成人激情在线网| 亚洲一级在线观看| 亚洲一区影音先锋| 亚洲第一成年网| 三级成人在线视频| 天堂成人国产精品一区| 午夜视频一区在线观看| 无码av免费一区二区三区试看| 亚洲一级二级三级在线免费观看| 亚洲激情图片一区| 亚洲综合一区二区| 天堂va蜜桃一区二区三区| 日韩成人一级片| 另类小说视频一区二区| 久久99精品国产麻豆不卡| 麻豆精品视频在线观看视频| 久久精品久久99精品久久| 精品一区二区三区在线观看 | 亚洲狼人国产精品| 亚洲精品国产精华液| 亚洲午夜精品在线| 男女视频一区二区| 国产老妇另类xxxxx| 99久久99精品久久久久久| 色综合久久综合中文综合网| 在线精品视频免费播放| 91精品国产综合久久香蕉麻豆| 日韩欧美一区中文| 国产欧美精品一区二区色综合朱莉| 国产欧美中文在线| 亚洲精品成人精品456| 日韩影视精彩在线| 国产馆精品极品| 在线一区二区视频| 日韩视频国产视频| 国产精品久线观看视频| 亚洲成人资源在线| 国产精品一区二区男女羞羞无遮挡| 大桥未久av一区二区三区中文| 在线一区二区观看| 精品欧美久久久| 亚洲欧美日韩人成在线播放| 日韩精品亚洲一区二区三区免费| 国产精品亚洲成人| 欧美性大战久久| 亚洲精品一区二区精华| 亚洲欧美日韩一区二区 | 高清免费成人av| 欧美性大战久久久久久久蜜臀| 精品国产网站在线观看| 久久黄色级2电影| 成人精品视频一区| 日韩亚洲欧美中文三级| 亚洲色图一区二区| 国产麻豆成人精品| 欧美日本视频在线| 亚洲欧美激情视频在线观看一区二区三区 | 国产精品天美传媒| 青青草91视频| 欧美在线视频不卡| 亚洲国产精品黑人久久久 | 亚洲一二三专区| 成人永久看片免费视频天堂| 欧美二区在线观看| 亚洲免费成人av| 粉嫩高潮美女一区二区三区| 在线91免费看| 亚洲亚洲人成综合网络| 不卡电影免费在线播放一区| 精品福利av导航| 青青草国产精品亚洲专区无| 欧美在线影院一区二区| 国产精品第13页| 国产精品性做久久久久久| 欧美一级免费观看| 视频一区二区欧美| 欧美视频精品在线观看| 一区二区三区四区激情| 97精品国产露脸对白| 国产精品视频线看| 国产ts人妖一区二区| 久久久久国色av免费看影院| 麻豆精品视频在线观看视频| 91精品一区二区三区久久久久久| 夜夜亚洲天天久久| 色成年激情久久综合| 亚洲欧美一区二区三区国产精品| a4yy欧美一区二区三区| 国产精品久久久久四虎| 成人午夜电影网站| 中文字幕在线观看一区二区| 成人午夜免费视频|