devip-win32.c 4.9 KB

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