1 #include <windows.h> 2 #include "u.h" 3 #include "lib.h" 4 #include "dat.h" 5 #include "fns.h" 6 #include "error.h" 7 8 #include "devip.h" 9 10 #ifdef MSVC 11 #pragma comment(lib, "wsock32.lib") 12 #endif 13 14 #undef listen 15 #undef accept 16 #undef bind 17 18 void 19 osipinit(void) 20 { 21 WSADATA wasdat; 22 char buf[1024]; 23 24 if(WSAStartup(MAKEWORD(1, 1), &wasdat) != 0) 25 panic("no winsock.dll"); 26 27 gethostname(buf, sizeof(buf)); 28 kstrdup(&sysname, buf); 29 } 30 31 int 32 so_socket(int type) 33 { 34 int fd, one; 35 36 switch(type) { 37 default: 38 error("bad protocol type"); 39 case S_TCP: 40 type = SOCK_STREAM; 41 break; 42 case S_UDP: 43 type = SOCK_DGRAM; 44 break; 45 } 46 47 fd = socket(AF_INET, type, 0); 48 if(fd < 0) 49 oserror(); 50 51 one = 1; 52 if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)) > 0){ 53 oserrstr(); 54 print("setsockopt: %s\n", up->errstr); 55 } 56 57 return fd; 58 } 59 60 61 void 62 so_connect(int fd, unsigned long raddr, unsigned short rport) 63 { 64 struct sockaddr_in sin; 65 66 memset(&sin, 0, sizeof(sin)); 67 sin.sin_family = AF_INET; 68 hnputs(&sin.sin_port, rport); 69 hnputl(&sin.sin_addr.s_addr, raddr); 70 71 if(connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) 72 oserror(); 73 } 74 75 void 76 so_getsockname(int fd, unsigned long *laddr, unsigned short *lport) 77 { 78 int len; 79 struct sockaddr_in sin; 80 81 len = sizeof(sin); 82 if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0) 83 oserror(); 84 85 if(sin.sin_family != AF_INET || len != sizeof(sin)) 86 error("not AF_INET"); 87 88 *laddr = nhgetl(&sin.sin_addr.s_addr); 89 *lport = nhgets(&sin.sin_port); 90 } 91 92 void 93 so_listen(int fd) 94 { 95 if(listen(fd, 5) < 0) 96 oserror(); 97 } 98 99 int 100 so_accept(int fd, unsigned long *raddr, unsigned short *rport) 101 { 102 int nfd, len; 103 struct sockaddr_in sin; 104 105 len = sizeof(sin); 106 nfd = accept(fd, (struct sockaddr*)&sin, &len); 107 if(nfd < 0) 108 oserror(); 109 110 if(sin.sin_family != AF_INET || len != sizeof(sin)) 111 error("not AF_INET"); 112 113 *raddr = nhgetl(&sin.sin_addr.s_addr); 114 *rport = nhgets(&sin.sin_port); 115 return nfd; 116 } 117 118 void 119 so_bind(int fd, int su, unsigned short port) 120 { 121 int i, one; 122 struct sockaddr_in sin; 123 124 one = 1; 125 if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0){ 126 oserrstr(); 127 print("setsockopt: %s", up->errstr); 128 } 129 130 if(su) { 131 for(i = 600; i < 1024; i++) { 132 memset(&sin, 0, sizeof(sin)); 133 sin.sin_family = AF_INET; 134 sin.sin_port = i; 135 136 if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) >= 0) 137 return; 138 } 139 oserror(); 140 } 141 142 memset(&sin, 0, sizeof(sin)); 143 sin.sin_family = AF_INET; 144 hnputs(&sin.sin_port, port); 145 146 if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) 147 oserror(); 148 } 149 150 int 151 so_gethostbyname(char *host, char**hostv, int n) 152 { 153 int i; 154 char buf[32]; 155 unsigned char *p; 156 struct hostent *hp; 157 158 hp = gethostbyname(host); 159 if(hp == 0) 160 return 0; 161 162 for(i = 0; hp->h_addr_list[i] && i < n; i++) { 163 p = (unsigned char*)hp->h_addr_list[i]; 164 sprint(buf, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); 165 hostv[i] = strdup(buf); 166 if(hostv[i] == 0) 167 break; 168 } 169 return i; 170 } 171 172 char* 173 hostlookup(char *host) 174 { 175 char buf[100]; 176 uchar *p; 177 HOSTENT *he; 178 179 he = gethostbyname(host); 180 if(he != 0 && he->h_addr_list[0]) { 181 p = (uchar*)he->h_addr_list[0]; 182 sprint(buf, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3]); 183 } else 184 strcpy(buf, host); 185 186 return strdup(buf); 187 } 188 189 int 190 so_getservbyname(char *service, char *net, char *port) 191 { 192 struct servent *s; 193 194 s = getservbyname(service, net); 195 if(s == 0) 196 return -1; 197 198 sprint(port, "%d", nhgets(&s->s_port)); 199 return 0; 200 } 201 202 int 203 so_send(int fd, void *d, int n, int f) 204 { 205 return send(fd, d, n, f); 206 } 207 208 int 209 so_recv(int fd, void *d, int n, int f) 210 { 211 return recv(fd, d, n, f); 212 } 213