Changeset a114ab for src/iodined.c


Ignore:
Timestamp:
12/02/07 00:02:06 (6 years ago)
Author:
Erik Ekman <yarrick@…>
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)
Message:

revert [607], [608] and parts of [611]

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/iodined.c

    r3c644e ra114ab  
    8383 
    8484        /* 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; 
    8789        } else { 
    8890                return 0; 
     
    123125} 
    124126 
    125 static void 
    126 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 int 
    164 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  
    211127static int 
    212128tunnel_dns(int tun_fd, int dns_fd) 
    213129{ 
     130        struct in_addr tempip; 
    214131        struct user dummy; 
    215132        struct ip *hdr; 
    216133        unsigned long outlen; 
     134        char logindata[16]; 
    217135        char out[64*1024]; 
    218136        char in[64*1024]; 
    219137        char unpacked[64*1024]; 
     138        char *tmp[2]; 
    220139        int userid; 
    221140        int touser; 
     141        int version; 
    222142        int read; 
    223143        int code; 
     
    228148                                 
    229149        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                } 
    231177        } 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                } 
    235212        } else if(in[0] == 'P' || in[0] == 'p') { 
    236213                read = unpack_data(unpacked, sizeof(unpacked), &(in[1]), read - 1, b32); 
Note: See TracChangeset for help on using the changeset viewer.