Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
}