6 #include <sys/socket.h>
8 #include <netinet/tcp.h>
10 #include <net/gen/in.h>
11 #include <net/gen/tcp.h>
12 #include <net/gen/tcp_io.h>
13 #include <net/gen/udp.h>
14 #include <net/gen/udp_io.h>
18 static int _tcp_getsockopt(int socket
, int level
, int option_name
,
19 void *_RESTRICT option_value
, socklen_t
*_RESTRICT option_len
);
20 static int _udp_getsockopt(int socket
, int level
, int option_name
,
21 void *_RESTRICT option_value
, socklen_t
*_RESTRICT option_len
);
23 int getsockopt(int socket
, int level
, int option_name
,
24 void *_RESTRICT option_value
, socklen_t
*_RESTRICT option_len
)
30 r
= ioctl(socket
, NWIOGTCPOPT
, &tcpopt
);
31 if (r
!= -1 || errno
!= ENOTTY
)
35 /* Bad file descriptor */
38 return _tcp_getsockopt(socket
, level
, option_name
,
39 option_value
, option_len
);
42 r
= ioctl(socket
, NWIOGUDPOPT
, &udpopt
);
43 if (r
!= -1 || errno
!= ENOTTY
)
47 /* Bad file descriptor */
50 return _udp_getsockopt(socket
, level
, option_name
,
51 option_value
, option_len
);
55 fprintf(stderr
, "getsockopt: not implemented for fd %d\n", socket
);
61 static int _tcp_getsockopt(int socket
, int level
, int option_name
,
62 void *_RESTRICT option_value
, socklen_t
*_RESTRICT option_len
)
66 if (level
== SOL_SOCKET
&& option_name
== SO_KEEPALIVE
)
68 i
= 1; /* Keepalive is always on */
69 if (*option_len
< sizeof(i
))
70 memcpy(option_value
, &i
, *option_len
);
72 memcpy(option_value
, &i
, sizeof(i
));
73 *option_len
= sizeof(i
);
76 if (level
== SOL_SOCKET
&& option_name
== SO_ERROR
)
78 r
= ioctl(socket
, NWIOTCPGERROR
, &err
);
81 if (*option_len
< sizeof(err
))
82 memcpy(option_value
, &err
, *option_len
);
84 memcpy(option_value
, &err
, sizeof(err
));
85 *option_len
= sizeof(err
);
88 if (level
== SOL_SOCKET
&& option_name
== SO_RCVBUF
)
90 i
= 32*1024; /* Receive buffer in the current
93 if (*option_len
< sizeof(i
))
94 memcpy(option_value
, &i
, *option_len
);
96 memcpy(option_value
, &i
, sizeof(i
));
97 *option_len
= sizeof(i
);
100 if (level
== SOL_SOCKET
&& option_name
== SO_SNDBUF
)
102 i
= 32*1024; /* Send buffer in the current implementation */
103 if (*option_len
< sizeof(i
))
104 memcpy(option_value
, &i
, *option_len
);
106 memcpy(option_value
, &i
, sizeof(i
));
107 *option_len
= sizeof(i
);
110 if (level
== IPPROTO_TCP
&& option_name
== TCP_NODELAY
)
112 i
= 0; /* nodelay is always off */
113 if (*option_len
< sizeof(i
))
114 memcpy(option_value
, &i
, *option_len
);
116 memcpy(option_value
, &i
, sizeof(i
));
117 *option_len
= sizeof(i
);
121 fprintf(stderr
, "_tcp_getsocketopt: level %d, name %d\n",
129 static int _udp_getsockopt(int socket
, int level
, int option_name
,
130 void *_RESTRICT option_value
, socklen_t
*_RESTRICT option_len
)
135 fprintf(stderr
, "_udp_getsocketopt: level %d, name %d\n",