xref: /plan9-contrib/sys/src/ape/lib/bsd/rresvport.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier /* posix */
2*219b2ee8SDavid du Colombier #include <sys/types.h>
3*219b2ee8SDavid du Colombier #include <unistd.h>
4*219b2ee8SDavid du Colombier #include <stdlib.h>
5*219b2ee8SDavid du Colombier #include <stdio.h>
6*219b2ee8SDavid du Colombier #include <string.h>
7*219b2ee8SDavid du Colombier #include <time.h>
8*219b2ee8SDavid du Colombier 
9*219b2ee8SDavid du Colombier /* socket extensions */
10*219b2ee8SDavid du Colombier #include <sys/socket.h>
11*219b2ee8SDavid du Colombier #include <netinet/in.h>
12*219b2ee8SDavid du Colombier #include <sys/un.h>
13*219b2ee8SDavid du Colombier 
14*219b2ee8SDavid du Colombier int
rresvport(int * p)15*219b2ee8SDavid du Colombier rresvport(int *p)
16*219b2ee8SDavid du Colombier {
17*219b2ee8SDavid du Colombier 	int fd;
18*219b2ee8SDavid du Colombier 	short i;
19*219b2ee8SDavid du Colombier 	struct	sockaddr_in in;
20*219b2ee8SDavid du Colombier 	static int next;
21*219b2ee8SDavid du Colombier 
22*219b2ee8SDavid du Colombier 	fd = socket(PF_INET, SOCK_STREAM, 0);
23*219b2ee8SDavid du Colombier 	if(fd < 0)
24*219b2ee8SDavid du Colombier 		return -1;
25*219b2ee8SDavid du Colombier 	i = 600 + ((getpid()+next++)%(1024-600));
26*219b2ee8SDavid du Colombier 	memset(&in, 0, sizeof(in));
27*219b2ee8SDavid du Colombier 	in.sin_family = AF_INET;
28*219b2ee8SDavid du Colombier 	in.sin_port = htons(i);
29*219b2ee8SDavid du Colombier printf("in.sin_port = %d\n", in.sin_port);
30*219b2ee8SDavid du Colombier 	if(bind(fd, &in, sizeof(in)) < 0){
31*219b2ee8SDavid du Colombier 		close(fd);
32*219b2ee8SDavid du Colombier 		return -1;
33*219b2ee8SDavid du Colombier 	}
34*219b2ee8SDavid du Colombier 	if(p)
35*219b2ee8SDavid du Colombier 		*p = i;
36*219b2ee8SDavid du Colombier 	return fd;
37*219b2ee8SDavid du Colombier }
38