Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1386 | Kulich | 1 | |
2 | MODULE LIB_DNS_RESOLVER |
||
3 | PUBLIC dns_resolver |
||
4 | EXTERN errno, OS_NETSOCKET, OS_NETCLOSE, YIELD |
||
5 | EXTERN OS_NETCONNECT, OS_NETRECV, OS_NETSEND |
||
6 | EXTERN os_getdns |
||
7 | |||
8 | RSEG CODE |
||
9 | dns_resolver: ;DE-domain name |
||
10 | push ix |
||
11 | push de |
||
12 | ld de,dns_ia + 3 |
||
13 | call os_getdns |
||
14 | ld hl,dns_head |
||
15 | ld de,dnsbuf |
||
16 | ld bc,6 |
||
17 | ldir |
||
18 | ex de,hl |
||
19 | ld de,dnsbuf+7 |
||
20 | ld (hl),0 |
||
21 | ld bc,256-7 |
||
22 | ldir |
||
23 | ld de,dnsbuf+12 |
||
24 | ld h,d |
||
25 | ld l,e |
||
26 | pop bc |
||
27 | name_loop: |
||
28 | inc hl |
||
29 | ld a,(bc) |
||
30 | ld (hl),a |
||
31 | inc bc |
||
32 | cp '.' |
||
33 | jr z,is_dot |
||
34 | or a |
||
35 | jr nz,name_loop |
||
36 | is_dot: |
||
37 | sbc hl,de |
||
38 | ex de,hl |
||
39 | dec e |
||
40 | ld (hl),e |
||
41 | inc e |
||
42 | add hl,de |
||
43 | ld d,h |
||
44 | ld e,l |
||
45 | or a |
||
46 | jr nz,name_loop |
||
47 | inc a |
||
48 | inc hl |
||
49 | inc hl |
||
50 | ld (hl),a |
||
51 | inc hl |
||
52 | inc hl |
||
53 | ld (hl),a |
||
54 | inc hl |
||
55 | push hl |
||
56 | |||
57 | ld de,0x0203 |
||
58 | call OS_NETSOCKET |
||
59 | ld (dnssoc),a |
||
60 | or a |
||
61 | jp m,exiterr |
||
62 | ;LD C,A |
||
63 | ;LD DE,dns_ia |
||
64 | ;CALL OS_NETCONNECT |
||
65 | ;or a |
||
66 | ;jp m,exiterr |
||
67 | |||
68 | pop hl |
||
69 | push hl |
||
70 | ld de,0xffff&(-dnsbuf) |
||
71 | add hl,de |
||
72 | PUSH HL |
||
73 | LD bc,(dnssoc) |
||
74 | LD ix,dnsbuf |
||
75 | ld de,dns_ia |
||
76 | CALL OS_NETSEND |
||
77 | pop af |
||
78 | bit 7,h |
||
79 | jr nz,exitcode |
||
80 | ld b,50 |
||
81 | push bc |
||
82 | jr recv_wait1 |
||
83 | recv_wait: |
||
84 | push bc |
||
85 | call YIELD |
||
86 | recv_wait1: |
||
87 | ld hl,256 |
||
88 | PUSH HL |
||
89 | LD bc,(dnssoc) |
||
90 | LD DE,dnsbuf |
||
91 | LD ix,dnsbuf |
||
92 | CALL OS_NETRECV |
||
93 | pop af |
||
94 | pop bc |
||
95 | ;ld a,h |
||
96 | ;or l |
||
97 | bit 7,h |
||
98 | jr z,recv_wait_end |
||
99 | djnz recv_wait |
||
100 | ld a,54 ;ERR_CONNRESET |
||
101 | ld (errno),a |
||
102 | jr exiterr |
||
103 | recv_wait_end: |
||
104 | ld a,65 ;ERR_HOSTUNREACH |
||
105 | ld (errno),a |
||
106 | bit 7,h |
||
107 | jr nz,exitcode |
||
108 | ld a,(dnsbuf+3) |
||
109 | and 0x0f |
||
110 | jr nz,exiterr |
||
111 | exitcode: |
||
112 | LD BC,(dnssoc) |
||
113 | LD E,0 |
||
114 | CALL OS_NETCLOSE |
||
115 | pop hl |
||
116 | pop ix |
||
117 | reqpars_l |
||
118 | inc hl |
||
119 | inc hl |
||
120 | inc hl |
||
121 | ld a,(hl) |
||
122 | ld de,7 |
||
123 | add hl,de |
||
124 | ld b,(hl) |
||
125 | inc hl |
||
126 | ld c,(hl) |
||
127 | inc hl |
||
128 | dec a |
||
129 | ret z |
||
130 | cp 4 |
||
131 | jr nz,exiterr1 |
||
132 | add hl,bc |
||
133 | jr reqpars_l |
||
134 | |||
135 | exiterr: |
||
136 | pop af |
||
137 | ld a,(errno) |
||
138 | push af |
||
139 | LD BC,(dnssoc) |
||
140 | LD E,0 |
||
141 | CALL OS_NETCLOSE |
||
142 | pop af |
||
143 | ld (errno),a |
||
144 | pop ix |
||
145 | exiterr1: |
||
146 | ld hl,0 |
||
147 | ret |
||
148 | |||
149 | RSEG CONST |
||
150 | dns_head |
||
151 | defb 0x11,0x22,0x01,0x00,0x00,0x01 |
||
152 | dns_ia: |
||
153 | defb 0,0,53,8,8,8,8 |
||
154 | RSEG NO_INIT |
||
155 | dnssoc: |
||
156 | DEFS 1 |
||
157 | dnsbuf: |
||
158 | DEFS 256 |
||
159 | |||
160 | END |
||
161 |