# CURL and DNS resolver
The common question in curl is
why my browser, dig and wget work except curl.
the error message looks like this
```
$ curl https://github.com
curl: (6) Could not resolve host: github.com
```
## Possilbe file and function
curl_resolver_getaddrinfo
https://github.com/curl/curl/blob/fe7b64228d553274f780ebc98a05a9ae266df828/lib/asyn-thread.c
## Build curl from source
Use autoconf, then got an error
```
# apt install autoconf
curl# autoconf
configure.ac:22: error: possibly undefined macro: dnl
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:41: error: possibly undefined macro: AM_MAINTAINER_MODE
configure.ac:93: error: possibly undefined macro: AC_MSG_RESULT
configure.ac:316: error: possibly undefined macro: AM_CONDITIONAL
configure.ac:522: error: possibly undefined macro: AC_DEFINE
```
intall automake libtool
reference:
* https://unix.stackexchange.com/questions/18673/some-m4-macros-dont-seem-to-be-defined/18680?ssl_
```
apt install automake libtool
$ autoconf # pass
$ ls configure
configure
```
After configuring, I got following errors:
```
# ./configure
./configure: line 2604: XC_OVR_ZZ50: command not found
./configure: line 2605: XC_OVR_ZZ60: command not found
./configure: line 2606: CURL_OVERRIDE_AUTOCONF: command not found
./configure: line 2614: AM_MAINTAINER_MODE: command not found
./configure: line 2617: CURL_CHECK_OPTION_DEBUG: command not found
./configure: line 2618: CURL_CHECK_OPTION_OPTIMIZE: command not found
./configure: line 2619: CURL_CHECK_OPTION_WARNINGS: command not found
./configure: line 2620: CURL_CHECK_OPTION_WERROR: command not found
./configure: line 2621: CURL_CHECK_OPTION_CURLDEBUG: command not found
./configure: line 2622: CURL_CHECK_OPTION_SYMBOL_HIDING: command not found
./configure: line 2623: CURL_CHECK_OPTION_ARES: command not found
./configure: line 2624: CURL_CHECK_OPTION_RT: command not found
./configure: line 2625: CURL_CHECK_OPTION_ECH: command not found
./configure: line 2627: XC_CHECK_PATH_SEPARATOR: command not found
checking for sed... /usr/bin/sed
checking for grep... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ar... /usr/bin/ar
./configure: line 2900: XC_CHECK_PROG_CC: command not found
./configure: line 2902: CURL_COVERAGE: command not found
./configure: line 2904: XC_AUTOMAKE: command not found
checking curl version... 7.80.0-DEV
configure: error: select TLS backend(s) or disable TLS with --without-ssl.
```
run configure with --without-ssl, then got another error
```
# ./configure --without-ssl
./configure: line 2604: XC_OVR_ZZ50: command not found
./configure: line 2605: XC_OVR_ZZ60: command not found
./configure: line 2606: CURL_OVERRIDE_AUTOCONF: command not found
./configure: line 2614: AM_MAINTAINER_MODE: command not found
./configure: line 2617: CURL_CHECK_OPTION_DEBUG: command not found
./configure: line 2618: CURL_CHECK_OPTION_OPTIMIZE: command not found
./configure: line 2619: CURL_CHECK_OPTION_WARNINGS: command not found
./configure: line 2620: CURL_CHECK_OPTION_WERROR: command not found
./configure: line 2621: CURL_CHECK_OPTION_CURLDEBUG: command not found
./configure: line 2622: CURL_CHECK_OPTION_SYMBOL_HIDING: command not found
./configure: line 2623: CURL_CHECK_OPTION_ARES: command not found
./configure: line 2624: CURL_CHECK_OPTION_RT: command not found
./configure: line 2625: CURL_CHECK_OPTION_ECH: command not found
./configure: line 2627: XC_CHECK_PATH_SEPARATOR: command not found
checking for sed... /usr/bin/sed
checking for grep... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ar... /usr/bin/ar
./configure: line 2900: XC_CHECK_PROG_CC: command not found
./configure: line 2902: CURL_COVERAGE: command not found
./configure: line 2904: XC_AUTOMAKE: command not found
checking curl version... 7.80.0-DEV
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."
```
Found answer here
https://askubuntu.com/questions/27677/cannot-find-install-sh-install-sh-or-shtool-in-ac-aux?ssl_
let autoreconf install package for you
```
$ autoconf -i
$ configure
...
... processing
$ make
```
re-run with debug symbol
```
./configure --without-ssl --enable-debug
make
make install
```
run gdb with curl
```
~/curl# gdb -q /usr/local/bin/curl
Reading symbols from /usr/local/bin/curl...
(gdb)
```
curl loads lib after running it, so set the first breakpoint on curl_easy_init.
After running it, you're able to set breakpoint in any function in curl .
```
(gdb) info breakpoint
Num Type Disp Enb Address What
1 breakpoint keep y 0x00007ffff7f03fa8 in curl_easy_init at easy.c:290
breakpoint already hit 4 times
2 breakpoint keep y 0x00007ffff7ef1a92 in Curl_resolver_is_resolved at asyn-thread.c:569
3 breakpoint keep y 0x00007ffff7f69702 in resolve_server at url.c:3327
breakpoint already hit 1 time
```
resovler breakpoint
```
Breakpoint 3, resolve_server (data=0x7ffff7f56d23 <Curl_speedinit+44>, conn=0x693c48, async=0x7fff00035757) at url.c:3327
```
this might be the place where curl resolve the url
https://github.com/curl/curl/blob/fe7b64228d553274f780ebc98a05a9ae266df828/lib/url.c#L3305
from here we can see `Curl_resolv_timeout` is the function to handle resolver
https://github.com/curl/curl/blob/fe7b64228d553274f780ebc98a05a9ae266df828/lib/url.c#L3378
```
resolve_server
|
---> Curl_resolv_timeout
|
---> Curl_resolv
|
---> Curl_getaddrinfo
|
---> Curl_resolver_getaddrinfo
https://github.com/curl/curl/blob/fe7b64228d553274f780ebc98a05a9ae266df828/lib/asyn-thread.c#L691
|
--> init_resolve_thread
https://github.com/curl/curl/blob/fe7b64228d553274f780ebc98a05a9ae266df828/lib/asyn-thread.c#L430
|
--> getaddrinfo_thread (Run this one)
| https://github.com/curl/curl/blob/fe7b64228d553274f780ebc98a05a9ae266df828/lib/asyn-thread.c#L463
|
-> Curl_getaddrinfo_ex
|
-> getaddrinfo(glibc lib)
|
--> gethostbyname_thread
```
`getaddrinfo` returned -2 then curl return host cannot be resovled.