Mercurial > libavformat.hg
comparison os_support.c @ 5588:866c497d9abd libavformat
Load the proper getaddrinfo functions from ws2_32.dll, if they're present.
Patch by Martin Storsj <martin at martin dot st>.
author | ramiro |
---|---|
date | Mon, 25 Jan 2010 01:28:01 +0000 |
parents | 8797851aeedb |
children | a3e321e7ca38 |
comparison
equal
deleted
inserted
replaced
5587:0ab98b4a3778 | 5588:866c497d9abd |
---|---|
66 { | 66 { |
67 struct hostent *h = NULL; | 67 struct hostent *h = NULL; |
68 struct addrinfo *ai; | 68 struct addrinfo *ai; |
69 struct sockaddr_in *sin; | 69 struct sockaddr_in *sin; |
70 | 70 |
71 #if HAVE_WINSOCK2_H | |
72 int (WSAAPI *win_getaddrinfo)(const char *node, const char *service, | |
73 const struct addrinfo *hints, | |
74 struct addrinfo **res); | |
75 HMODULE ws2mod = GetModuleHandle("ws2_32.dll"); | |
76 win_getaddrinfo = GetProcAddress(ws2mod, "getaddrinfo"); | |
77 if (win_getaddrinfo) | |
78 return win_getaddrinfo(node, service, hints, res); | |
79 #endif | |
80 | |
71 sin = av_mallocz(sizeof(struct sockaddr_in)); | 81 sin = av_mallocz(sizeof(struct sockaddr_in)); |
72 if (!sin) | 82 if (!sin) |
73 return EAI_FAIL; | 83 return EAI_FAIL; |
74 sin->sin_family = AF_INET; | 84 sin->sin_family = AF_INET; |
75 | 85 |
122 return 0; | 132 return 0; |
123 } | 133 } |
124 | 134 |
125 void ff_freeaddrinfo(struct addrinfo *res) | 135 void ff_freeaddrinfo(struct addrinfo *res) |
126 { | 136 { |
137 #if HAVE_WINSOCK2_H | |
138 void (WSAAPI *win_freeaddrinfo)(struct addrinfo *res); | |
139 HMODULE ws2mod = GetModuleHandle("ws2_32.dll"); | |
140 win_freeaddrinfo = (void (WSAAPI *)(struct addrinfo *res)) | |
141 GetProcAddress(ws2mod, "freeaddrinfo"); | |
142 if (win_freeaddrinfo) { | |
143 win_freeaddrinfo(res); | |
144 return; | |
145 } | |
146 #endif | |
147 | |
127 av_free(res->ai_canonname); | 148 av_free(res->ai_canonname); |
128 av_free(res->ai_addr); | 149 av_free(res->ai_addr); |
129 av_free(res); | 150 av_free(res); |
130 } | 151 } |
131 | 152 |
132 int ff_getnameinfo(const struct sockaddr *sa, int salen, | 153 int ff_getnameinfo(const struct sockaddr *sa, int salen, |
133 char *host, int hostlen, | 154 char *host, int hostlen, |
134 char *serv, int servlen, int flags) | 155 char *serv, int servlen, int flags) |
135 { | 156 { |
136 const struct sockaddr_in *sin = (const struct sockaddr_in *)sa; | 157 const struct sockaddr_in *sin = (const struct sockaddr_in *)sa; |
158 | |
159 #if HAVE_WINSOCK2_H | |
160 int (WSAAPI *win_getnameinfo)(const struct sockaddr *sa, socklen_t salen, | |
161 char *host, DWORD hostlen, | |
162 char *serv, DWORD servlen, int flags); | |
163 HMODULE ws2mod = GetModuleHandle("ws2_32.dll"); | |
164 win_getnameinfo = GetProcAddress(ws2mod, "getnameinfo"); | |
165 if (win_getnameinfo) | |
166 return win_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); | |
167 #endif | |
137 | 168 |
138 if (sa->sa_family != AF_INET) | 169 if (sa->sa_family != AF_INET) |
139 return EAI_FAMILY; | 170 return EAI_FAMILY; |
140 if (!host && !serv) | 171 if (!host && !serv) |
141 return EAI_NONAME; | 172 return EAI_NONAME; |