ReactOS 0.4.17-dev-1190-g4c812f4
utility.c
Go to the documentation of this file.
1#ifdef __REACTOS__
2#include "precomp.h"
3#include "inet_ntop.c"
4#else
5/*
6 * Wininet - Utility functions
7 *
8 * Copyright 1999 Corel Corporation
9 * Copyright 2002 CodeWeavers Inc.
10 *
11 * Ulrich Czekalla
12 * Aric Stewart
13 *
14 * This library is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU Lesser General Public
16 * License as published by the Free Software Foundation; either
17 * version 2.1 of the License, or (at your option) any later version.
18 *
19 * This library is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * Lesser General Public License for more details.
23 *
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with this library; if not, write to the Free Software
26 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 */
28
29#include "ws2tcpip.h"
30
31#include <stdarg.h>
32#include <stdlib.h>
33#include <string.h>
34#include <time.h>
35
36#include "windef.h"
37#include "winbase.h"
38#include "wininet.h"
39#include "winnls.h"
40
41#include "wine/debug.h"
42#include "internet.h"
43#endif /* defined(__REACTOS__) */
44
46
47BOOL GetAddress(const WCHAR *name, INTERNET_PORT port, struct sockaddr *psa, int *sa_len, char *addr_str)
48{
50 void *addr = NULL;
51 int ret;
52
53 TRACE("%s\n", debugstr_w(name));
54
55 memset( &hints, 0, sizeof(hints) );
56 /* Prefer IPv4 to IPv6 addresses, since some servers do not listen on
57 * their IPv6 addresses even though they have IPv6 addresses in the DNS.
58 */
59 hints.ai_family = AF_INET;
60
62 if (ret != 0)
63 {
64 TRACE("failed to get IPv4 address of %s, retrying with IPv6\n", debugstr_w(name));
65 hints.ai_family = AF_INET6;
67 }
68 if (ret != 0)
69 {
70 TRACE("failed to get address of %s\n", debugstr_w(name));
71 return FALSE;
72 }
73 if (*sa_len < res->ai_addrlen)
74 {
75 WARN("address too small\n");
77 return FALSE;
78 }
79 *sa_len = res->ai_addrlen;
80 memcpy( psa, res->ai_addr, res->ai_addrlen );
81 /* Copy port */
82 switch (res->ai_family)
83 {
84 case AF_INET:
85 addr = &((struct sockaddr_in *)psa)->sin_addr;
86 ((struct sockaddr_in *)psa)->sin_port = htons(port);
87 break;
88 case AF_INET6:
89 addr = &((struct sockaddr_in6 *)psa)->sin6_addr;
90 ((struct sockaddr_in6 *)psa)->sin6_port = htons(port);
91 break;
92 }
93
94 if(addr_str)
95 inet_ntop(res->ai_family, addr, addr_str, INET6_ADDRSTRLEN);
97 return TRUE;
98}
99
100/*
101 * Helper function for sending async Callbacks
102 */
103
104static const char *get_callback_name(DWORD dwInternetStatus) {
105 static const wininet_flag_info internet_status[] = {
106#define FE(x) { x, #x }
132#undef FE
133 };
134 DWORD i;
135
136 for (i = 0; i < ARRAY_SIZE(internet_status); i++) {
137 if (internet_status[i].val == dwInternetStatus) return internet_status[i].name;
138 }
139 return "Unknown";
140}
141
142static const char *debugstr_status_info(DWORD status, void *info)
143{
144 switch(status) {
147 return wine_dbg_sprintf("{%s, %ld}", wine_dbgstr_longlong(iar->dwResult), iar->dwError);
148 }
149 default:
150 return wine_dbg_sprintf("%p", info);
151 }
152}
153
155{
156 void *new_info = info;
157
158 if( !hdr->lpfnStatusCB )
159 return;
160
161 /* the IE5 version of wininet does not
162 send callbacks if dwContext is zero */
163 if(!context)
164 return;
165
166 switch(status) {
170 new_info = malloc(info_len);
171 if(new_info)
172 memcpy(new_info, info, info_len);
173 break;
176 if(hdr->dwInternalFlags & INET_CALLBACKW) {
177 new_info = wcsdup(info);
178 break;
179 }else {
180 new_info = strdupWtoA(info);
181 info_len = strlen(new_info)+1;
182 break;
183 }
184 }
185
186 TRACE(" callback(%p) (%p (%p), %08Ix, %ld (%s), %s, %ld)\n",
187 hdr->lpfnStatusCB, hdr->hInternet, hdr, context, status, get_callback_name(status),
188 debugstr_status_info(status, new_info), info_len);
189
190 hdr->lpfnStatusCB(hdr->hInternet, context, status, new_info, info_len);
191
192 TRACE(" end callback().\n");
193
194 if(new_info != info)
195 free(new_info);
196}
#define FreeAddrInfoW(a)
Definition: addrinfo.c:21
INT WSAAPI GetAddrInfoW(IN PCWSTR pszNodeName, IN PCWSTR pszServiceName, IN const ADDRINFOW *ptHints, OUT PADDRINFOW *pptResult)
Definition: addrinfo.c:509
static char * strdupWtoA(const WCHAR *str)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
USHORT port
Definition: uri.c:210
void INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR context, DWORD status, void *info, DWORD info_len)
Definition: utility.c:154
static const char * debugstr_status_info(DWORD status, void *info)
Definition: utility.c:142
static const char * get_callback_name(DWORD dwInternetStatus)
Definition: utility.c:104
#define FE(x)
BOOL GetAddress(const WCHAR *name, INTERNET_PORT port, struct sockaddr *psa, int *sa_len, char *addr_str)
Definition: utility.c:47
return ret
Definition: mutex.c:147
#define AF_INET
Definition: tcpip.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLenum const GLvoid * addr
Definition: glext.h:9621
GLuint GLfloat * val
Definition: glext.h:7180
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define INET_CALLBACKW
Definition: internet.h:210
char hdr[14]
Definition: iptest.cpp:33
#define debugstr_w
Definition: kernel32.h:32
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define htons(x)
Definition: module.h:215
short WCHAR
Definition: pedump.c:58
#define memset(x, y, z)
Definition: compat.h:39
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
#define TRACE(s)
Definition: solgame.cpp:4
DWORD_PTR dwResult
Definition: wininet.h:155
Definition: http.c:7783
Definition: name.c:39
Definition: ps.c:97
const char * name
Definition: internet.h:436
uint32_t DWORD_PTR
Definition: typedefs.h:65
const char *WSAAPI inet_ntop(int af, const void *src, char *dst, size_t cnt)
Definition: unix_func.c:8
WORD INTERNET_PORT
Definition: winhttp.h:43
#define INTERNET_STATUS_RECEIVING_RESPONSE
Definition: wininet.h:889
#define INTERNET_STATUS_CONNECTION_CLOSED
Definition: wininet.h:894
#define INTERNET_STATUS_STATE_CHANGE
Definition: wininet.h:902
#define INTERNET_STATUS_REQUEST_SENT
Definition: wininet.h:888
#define INTERNET_STATUS_COOKIE_RECEIVED
Definition: wininet.h:904
#define INTERNET_STATUS_USER_INPUT_REQUIRED
Definition: wininet.h:901
#define INTERNET_STATUS_SENDING_REQUEST
Definition: wininet.h:887
#define INTERNET_STATUS_PREFETCH
Definition: wininet.h:892
#define INTERNET_STATUS_HANDLE_CLOSING
Definition: wininet.h:896
#define INTERNET_STATUS_RESOLVING_NAME
Definition: wininet.h:883
#define INTERNET_STATUS_INTERMEDIATE_RESPONSE
Definition: wininet.h:900
#define INTERNET_STATUS_RESPONSE_RECEIVED
Definition: wininet.h:890
#define INTERNET_STATUS_REDIRECT
Definition: wininet.h:899
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
#define INTERNET_STATUS_CONNECTING_TO_SERVER
Definition: wininet.h:885
#define INTERNET_STATUS_HANDLE_CREATED
Definition: wininet.h:895
#define INTERNET_STATUS_COOKIE_HISTORY
Definition: wininet.h:908
#define INTERNET_STATUS_COOKIE_SENT
Definition: wininet.h:903
#define INTERNET_STATUS_CONNECTED_TO_SERVER
Definition: wininet.h:886
#define INTERNET_STATUS_NAME_RESOLVED
Definition: wininet.h:884
#define INTERNET_STATUS_CTL_RESPONSE_RECEIVED
Definition: wininet.h:891
#define INTERNET_STATUS_P3P_HEADER
Definition: wininet.h:906
#define INTERNET_STATUS_CLOSING_CONNECTION
Definition: wininet.h:893
#define INTERNET_STATUS_PRIVACY_IMPACTED
Definition: wininet.h:905
#define INTERNET_STATUS_P3P_POLICYREF
Definition: wininet.h:907
#define AF_INET6
Definition: winsock.h:363
#define INET6_ADDRSTRLEN
Definition: ws2ipdef.h:132