xref: /plan9-contrib/sys/src/cmd/unix/drawterm/kern/devip-win32.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
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