use32
; standard header
	db	'MENUET01'	; signature
	dd	1		; header version
	dd	start		; entry point
	dd	i_end		; initialized size
	dd	mem		; required memory
	dd	mem		; stack pointer
	dd	0		; parameters
	dd	0		; path

; useful includes
include '../macros.inc'
purge mov,add,sub
include '../proc32.inc'
include 'dll.inc'

include '../network_lib/network.inc'

; entry point
start:
; load libraries
	stdcall dll.Load, @IMPORT
	test	eax, eax
	jnz	exit
; initialize console
	push	1
	call	[con_start]
	push	title
	push	-1
	push	-1
	push	-1
	push	-1
	call	[con_init]
; main loop
main:
; write prompt
	push	str1
	call	[con_write_asciiz]
; read string
	mov	esi, s
	push	256
	push	esi
	call	[con_gets]
; check for exit
	test	eax, eax
	jz	done
	cmp	byte [esi], 10
	jz	done
; delete terminating '\n'
	push	esi
@@:
	lodsb
	test	al, al
	jnz	@b
	mov	byte [esi-2], al
	pop	esi
; resolve name
	push	esp	; reserve stack place
	push	esp	; fourth parameter
	push	0	; third parameter
	push	0	; second parameter
	push	esi	; first parameter
	call	[getaddrinfo]
	pop	esi
; test for error
	test	eax, eax
	jnz	fail
; write results
	push	str2
	call	[con_write_asciiz]
	mov	edi, esi
addrloop:
; before all subsequent addresses print comma
	cmp	edi, esi
	jz	@f
	push	str3
	call	[con_write_asciiz]
@@:
; convert IP address to decimal notation
	mov	eax, [edi+addrinfo.ai_addr]
	pushd	[eax+sockaddr_in.sin_addr]
	call	[inet_ntoa]
; write result
	push	eax
	call	[con_write_asciiz]
; advance to next item
	mov	edi, [edi+addrinfo.ai_next]
	test	edi, edi
	jnz	addrloop
; free allocated memory
	push	esi
	call	[freeaddrinfo]
; write newline and continue main loop
	push	str4
@@:
	call	[con_write_asciiz]
	jmp	main
fail:
	push	str5
	jmp	@b
done:
	push	1
	call	[con_exit]
exit:
	mcall	-1

; data
title	db	'Names resolver',0
str1	db	'Host name to resolve: ',0
str2	db	'IP address(es): ',0
str3	db	', ',0
str4	db	10,0
str5	db	'Name resolution failed.',10,0
; import
align 4
@IMPORT:

library network, 'network.obj', console, 'console.obj'
import	network,	\
	getaddrinfo,	'getaddrinfo',	\
	freeaddrinfo,	'freeaddrinfo', \
	inet_ntoa,	'inet_ntoa'
import	console,	\
	con_start,	'START',	\
	con_init,	'con_init',	\
	con_write_asciiz,	'con_write_asciiz',	\
	con_exit,	'con_exit',	\
	con_gets,	'con_gets'
i_end:
s	rb	256
align	4
rb	4096	; stack
mem:
