xref: /plan9/sys/src/ape/lib/bsd/bind.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 <fcntl.h>
7*219b2ee8SDavid du Colombier #include <string.h>
8*219b2ee8SDavid du Colombier #include <errno.h>
9*219b2ee8SDavid du Colombier #include <sys/stat.h>
10*219b2ee8SDavid du Colombier #include <signal.h>
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier /* socket extensions */
13*219b2ee8SDavid du Colombier #include <sys/uio.h>
14*219b2ee8SDavid du Colombier #include <sys/socket.h>
15*219b2ee8SDavid du Colombier #include <netinet/in.h>
16*219b2ee8SDavid du Colombier #include <sys/un.h>
17*219b2ee8SDavid du Colombier 
18*219b2ee8SDavid du Colombier /* plan 9 */
19*219b2ee8SDavid du Colombier #include "lib.h"
20*219b2ee8SDavid du Colombier #include "sys9.h"
21*219b2ee8SDavid du Colombier 
22*219b2ee8SDavid du Colombier #include "priv.h"
23*219b2ee8SDavid du Colombier 
24*219b2ee8SDavid du Colombier int
25*219b2ee8SDavid du Colombier bind(int fd, void *a, int alen)
26*219b2ee8SDavid du Colombier {
27*219b2ee8SDavid du Colombier 	int n, len, cfd;
28*219b2ee8SDavid du Colombier 	Rock *r;
29*219b2ee8SDavid du Colombier 	char msg[128];
30*219b2ee8SDavid du Colombier 	struct sockaddr_in *lip;
31*219b2ee8SDavid du Colombier 
32*219b2ee8SDavid du Colombier 	/* assign the address */
33*219b2ee8SDavid du Colombier 	r = _sock_findrock(fd, 0);
34*219b2ee8SDavid du Colombier 	if(r == 0){
35*219b2ee8SDavid du Colombier 		errno = ENOTSOCK;
36*219b2ee8SDavid du Colombier 		return -1;
37*219b2ee8SDavid du Colombier 	}
38*219b2ee8SDavid du Colombier 	if(alen > sizeof(r->addr)){
39*219b2ee8SDavid du Colombier 		errno = ENAMETOOLONG;
40*219b2ee8SDavid du Colombier 		return -1;
41*219b2ee8SDavid du Colombier 	}
42*219b2ee8SDavid du Colombier 	memmove(&r->addr, a, alen);
43*219b2ee8SDavid du Colombier 
44*219b2ee8SDavid du Colombier 	/* the rest is IP sepecific */
45*219b2ee8SDavid du Colombier 	if (r->domain != PF_INET)
46*219b2ee8SDavid du Colombier 		return 0;
47*219b2ee8SDavid du Colombier 
48*219b2ee8SDavid du Colombier 	cfd = open(r->ctl, O_RDWR);
49*219b2ee8SDavid du Colombier 	if(cfd < 0){
50*219b2ee8SDavid du Colombier 		errno = EBADF;
51*219b2ee8SDavid du Colombier 		return -1;
52*219b2ee8SDavid du Colombier 	}
53*219b2ee8SDavid du Colombier 	lip = (struct sockaddr_in*)&r->addr;
54*219b2ee8SDavid du Colombier 	if(lip->sin_port > 0)
55*219b2ee8SDavid du Colombier 		sprintf(msg, "bind %d", lip->sin_port);
56*219b2ee8SDavid du Colombier 	else
57*219b2ee8SDavid du Colombier 		sprintf(msg, "bind *");
58*219b2ee8SDavid du Colombier 	n = write(cfd, msg, strlen(msg));
59*219b2ee8SDavid du Colombier 	if(n < 0){
60*219b2ee8SDavid du Colombier 		errno = EOPNOTSUPP;	/* Improve error reporting!!! */
61*219b2ee8SDavid du Colombier 		close(cfd);
62*219b2ee8SDavid du Colombier 		return -1;
63*219b2ee8SDavid du Colombier 	}
64*219b2ee8SDavid du Colombier 	close(cfd);
65*219b2ee8SDavid du Colombier 
66*219b2ee8SDavid du Colombier 	if(lip->sin_port <= 0)
67*219b2ee8SDavid du Colombier 		_sock_ingetaddr(r, lip, &len, "local");
68*219b2ee8SDavid du Colombier 
69*219b2ee8SDavid du Colombier 	return 0;
70*219b2ee8SDavid du Colombier }
71