Changeset 1235cb
- Timestamp:
- 06/14/09 15:31:35 (3 years ago)
- Branches:
- master
- Children:
- de976d
- Parents:
- c92ed9
- git-author:
- Erik Ekman <yarrick@…> (06/14/09 15:31:35)
- git-committer:
- Erik Ekman <erik@…> (02/04/12 20:34:02)
- File:
-
- 1 edited
-
src/iodined.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/iodined.c
rc92ed9 r1235cb 839 839 } 840 840 841 static void 842 send_raw(int fd, char *buf, int buflen, int cmd, struct query *q) 843 { 844 unsigned char packet[4096]; 845 int len; 846 847 len = MIN(sizeof(packet) - RAW_HDR_LEN, buflen); 848 849 memcpy(packet, raw_header, RAW_HDR_LEN); 850 memcpy(&packet[RAW_HDR_LEN], buf, len); 851 852 len += RAW_HDR_LEN; 853 packet[RAW_HDR_CMD] = cmd; 854 855 sendto(fd, packet, len, 0, &q->from, q->fromlen); 856 } 857 858 static void 859 handle_raw_login(char *packet, int len, struct query *q, int fd) 860 { 861 int userid; 862 char myhash[16]; 863 864 if (len < 17) return; 865 866 userid = packet[16]; 867 if (userid < 0 || userid > created_users) return; 868 if (!users[userid].active) return; 869 870 login_calculate(myhash, 16, password, users[userid].seed + 1); 871 if (memcmp(packet, myhash, 16) == 0) { 872 /* Correct hash, reply with hash of seed - 1 */ 873 users[userid].last_pkt = time(NULL); 874 login_calculate(myhash, 16, password, users[userid].seed - 1); 875 memcpy(packet, myhash, 16); 876 send_raw(fd, packet, 17, RAW_HDR_CMD_LOGIN, q); 877 } 878 } 879 880 static int 881 raw_decode(char *packet, int len, struct query *q, int fd) 882 { 883 /* minimum length */ 884 if (len < RAW_HDR_LEN) return 0; 885 /* should start with header */ 886 if (memcmp(packet, raw_header, RAW_HDR_IDENT_LEN)) return 0; 887 888 if (packet[RAW_HDR_CMD] == RAW_HDR_CMD_LOGIN) { 889 handle_raw_login(&packet[RAW_HDR_LEN], len - RAW_HDR_LEN, q, fd); 890 } else { 891 warnx("Unhandled raw command %02X\n", packet[RAW_HDR_CMD]); 892 } 893 return 1; 894 } 895 841 896 static int 842 897 read_dns(int fd, struct query *q) … … 871 926 872 927 if (r > 0) { 928 memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen); 929 q->fromlen = addrlen; 930 931 /* TODO do not handle raw packets here! */ 932 if (raw_decode(packet, r, q, fd)) { 933 return 0; 934 } 873 935 if (dns_decode(NULL, 0, q, QR_QUERY, packet, r) < 0) { 874 936 return 0; 875 937 } 876 memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen);877 q->fromlen = addrlen;878 938 879 939 #ifndef WINDOWS32
Note: See TracChangeset
for help on using the changeset viewer.
