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