1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
/* Protocol family operations
Copyright (C) 1995 Free Software Foundation, Inc.
Written by Miles Bader <miles@gnu.ai.mit.edu>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <sys/socket.h>
#include "sock.h"
#include "pipe.h"
#include "socket_S.h"
/* Create a new socket. Sock type is, for example, SOCK_STREAM,
SOCK_DGRAM, or some such. */
error_t
S_socket_create (mach_port_t pf,
int sock_type, int protocol,
mach_port_t *port, mach_msg_type_name_t *port_type)
{
error_t err;
struct sock *sock;
struct pipe_class *pipe_class;
if (protocol != 0)
return EPROTONOSUPPORT;
switch (sock_type)
{
case SOCK_STREAM:
pipe_class = stream_pipe_class; break;
case SOCK_DGRAM:
pipe_class = dgram_pipe_class; break;
case SOCK_SEQPACKET:
pipe_class = seqpacket_pipe_class; break;
default:
return ESOCKTNOSUPPORT;
}
err = sock_create (pipe_class, &sock);
if (!err)
err = sock_create_port (sock, port);
if (!err)
*port_type = MACH_MSG_TYPE_MAKE_SEND;
return err;
}
error_t
S_socket_create_address (mach_port_t pf,
int sockaddr_type,
char *data, size_t data_len,
mach_port_t *addr_port,
mach_msg_type_name_t *addr_port_type,
int binding)
{
return EOPNOTSUPP;
}
error_t
S_socket_fabricate_address (mach_port_t pf,
int sockaddr_type,
mach_port_t *addr_port,
mach_msg_type_name_t *addr_port_type)
{
error_t err;
struct addr *addr;
if (sockaddr_type != AF_LOCAL)
return EAFNOSUPPORT;
err = addr_create (&addr);
if (err)
return err;
*addr_port = ports_get_right (addr);
*addr_port_type = MACH_MSG_TYPE_MAKE_SEND;
return 0;
}
error_t
S_socket_whatis_address (struct addr *addr,
int *sockaddr_type,
char **sockaddr, size_t *sockaddr_len)
{
return EOPNOTSUPP;
}
|