Changeset a114ab for src/iodined.c
- Timestamp:
- 12/02/07 00:02:06 (6 years ago)
- Branches:
- master
- Children:
- b67819
- Parents:
- 468844
- git-author:
- Erik Ekman <yarrick@…> (12/02/07 00:02:06)
- git-committer:
- Erik Ekman <erik@…> (02/04/12 20:33:56)
- File:
-
- 1 edited
-
src/iodined.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/iodined.c
r3c644e ra114ab 83 83 84 84 /* if another packet is queued, throw away this one. TODO build queue */ 85 if (packet_empty(&(users[userid].outpacket)) == 0) { 86 return packet_fill(&(users[userid].outpacket), out, outlen); 85 if (users[userid].outpacket.len == 0) { 86 memcpy(users[userid].outpacket.data, out, outlen); 87 users[userid].outpacket.len = outlen; 88 return outlen; 87 89 } else { 88 90 return 0; … … 123 125 } 124 126 125 static void126 handle_version(int dns_fd, char *in, int len)127 {128 char unpacked[64*1024];129 struct user dummy;130 int read;131 int version;132 int userid;133 134 read = unpack_data(unpacked, sizeof(unpacked), &(in[1]), len - 1, b32);135 /* Version greeting, compare and send ack/nak */136 if (read > 4) {137 /* Received V + 32bits version */138 version = (((unpacked[0] & 0xff) << 24) |139 ((unpacked[1] & 0xff) << 16) |140 ((unpacked[2] & 0xff) << 8) |141 ((unpacked[3] & 0xff)));142 }143 144 if (version == VERSION) {145 userid = find_available_user();146 if (userid >= 0) {147 users[userid].seed = rand();148 memcpy(&(users[userid].host), &(dummy.q.from), dummy.q.fromlen);149 memcpy(&(users[userid].q), &(dummy.q), sizeof(struct query));150 users[userid].addrlen = dummy.q.fromlen;151 users[userid].encoder = get_base32_encoder();152 send_version_response(dns_fd, VERSION_ACK, users[userid].seed, &users[userid]);153 users[userid].q.id = 0;154 } else {155 /* No space for another user */156 send_version_response(dns_fd, VERSION_FULL, USERS, &dummy);157 }158 } else {159 send_version_response(dns_fd, VERSION_NACK, VERSION, &dummy);160 }161 }162 163 static int164 handle_login(int dns_fd, char *in, int len)165 {166 char data[64*1024];167 char logindata[16];168 struct in_addr tempip;169 char *tmp[2];170 struct user dummy;171 int read;172 int userid;173 174 read = unpack_data(data, sizeof(data), &(in[1]), len - 1, b32);175 /* Login phase, handle auth */176 userid = data[0];177 if (userid < 0 || userid >= USERS) {178 write_dns(dns_fd, &(dummy.q), "BADIP", 5);179 return -1; /* illegal id */180 }181 users[userid].last_pkt = time(NULL);182 login_calculate(logindata, 16, password, users[userid].seed);183 184 if (dummy.q.fromlen != users[userid].addrlen ||185 memcmp(&(users[userid].host), &(dummy.q.from), dummy.q.fromlen) != 0) {186 write_dns(dns_fd, &(dummy.q), "BADIP", 5);187 } else {188 if (read >= 18 && (memcmp(logindata, data+1, 16) == 0)) {189 /* Login ok, send ip/mtu info */190 191 tempip.s_addr = my_ip;192 tmp[0] = strdup(inet_ntoa(tempip));193 tempip.s_addr = users[userid].tun_ip;194 tmp[1] = strdup(inet_ntoa(tempip));195 196 read = snprintf(data, sizeof(data), "%s-%s-%d",197 tmp[0], tmp[1], my_mtu);198 199 write_dns(dns_fd, &(dummy.q), data, read);200 dummy.q.id = 0;201 202 free(tmp[1]);203 free(tmp[0]);204 } else {205 write_dns(dns_fd, &(dummy.q), "LNAK", 4);206 }207 }208 return userid;209 }210 211 127 static int 212 128 tunnel_dns(int tun_fd, int dns_fd) 213 129 { 130 struct in_addr tempip; 214 131 struct user dummy; 215 132 struct ip *hdr; 216 133 unsigned long outlen; 134 char logindata[16]; 217 135 char out[64*1024]; 218 136 char in[64*1024]; 219 137 char unpacked[64*1024]; 138 char *tmp[2]; 220 139 int userid; 221 140 int touser; 141 int version; 222 142 int read; 223 143 int code; … … 228 148 229 149 if(in[0] == 'V' || in[0] == 'v') { 230 handle_version(dns_fd, in, read); 150 read = unpack_data(unpacked, sizeof(unpacked), &(in[1]), read - 1, b32); 151 /* Version greeting, compare and send ack/nak */ 152 if (read > 4) { 153 /* Received V + 32bits version */ 154 version = (((unpacked[0] & 0xff) << 24) | 155 ((unpacked[1] & 0xff) << 16) | 156 ((unpacked[2] & 0xff) << 8) | 157 ((unpacked[3] & 0xff))); 158 } 159 160 if (version == VERSION) { 161 userid = find_available_user(); 162 if (userid >= 0) { 163 users[userid].seed = rand(); 164 memcpy(&(users[userid].host), &(dummy.q.from), dummy.q.fromlen); 165 memcpy(&(users[userid].q), &(dummy.q), sizeof(struct query)); 166 users[userid].addrlen = dummy.q.fromlen; 167 users[userid].encoder = get_base32_encoder(); 168 send_version_response(dns_fd, VERSION_ACK, users[userid].seed, &users[userid]); 169 users[userid].q.id = 0; 170 } else { 171 /* No space for another user */ 172 send_version_response(dns_fd, VERSION_FULL, USERS, &dummy); 173 } 174 } else { 175 send_version_response(dns_fd, VERSION_NACK, VERSION, &dummy); 176 } 231 177 } else if(in[0] == 'L' || in[0] == 'l') { 232 userid = handle_login(dns_fd, in, read); 233 if (userid == -1) 234 return 0; /* illegal user id */ 178 read = unpack_data(unpacked, sizeof(unpacked), &(in[1]), read - 1, b32); 179 /* Login phase, handle auth */ 180 userid = unpacked[0]; 181 if (userid < 0 || userid >= USERS) { 182 write_dns(dns_fd, &(dummy.q), "BADIP", 5); 183 return 0; /* illegal id */ 184 } 185 users[userid].last_pkt = time(NULL); 186 login_calculate(logindata, 16, password, users[userid].seed); 187 188 if (dummy.q.fromlen != users[userid].addrlen || 189 memcmp(&(users[userid].host), &(dummy.q.from), dummy.q.fromlen) != 0) { 190 write_dns(dns_fd, &(dummy.q), "BADIP", 5); 191 } else { 192 if (read >= 18 && (memcmp(logindata, unpacked+1, 16) == 0)) { 193 /* Login ok, send ip/mtu info */ 194 195 tempip.s_addr = my_ip; 196 tmp[0] = strdup(inet_ntoa(tempip)); 197 tempip.s_addr = users[userid].tun_ip; 198 tmp[1] = strdup(inet_ntoa(tempip)); 199 200 read = snprintf(out, sizeof(out), "%s-%s-%d", 201 tmp[0], tmp[1], my_mtu); 202 203 write_dns(dns_fd, &(dummy.q), out, read); 204 dummy.q.id = 0; 205 206 free(tmp[1]); 207 free(tmp[0]); 208 } else { 209 write_dns(dns_fd, &(dummy.q), "LNAK", 4); 210 } 211 } 235 212 } else if(in[0] == 'P' || in[0] == 'p') { 236 213 read = unpack_data(unpacked, sizeof(unpacked), &(in[1]), read - 1, b32);
Note: See TracChangeset
for help on using the changeset viewer.
