kos_sys/os/
socket.rs

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
103
104
105
106
// Rust for KallistiOS/Dreamcast
// Copyright (C) 2024 Eric Fradella
// https://dreamcast.rs/

use crate::prelude::*;

pub type socklen_t = u32;
pub type sa_family_t = u8;

#[repr(C)]
pub struct sockaddr {
    sa_family:  sa_family_t,
    sa_data:    FAM<c_char>,
}

pub const _SS_MAXSIZE: usize    = 128;

pub const _SS_ALIGNSIZE: usize  = size_of::<u64>();

pub const _SS_PAD1SIZE: usize   = _SS_ALIGNSIZE - size_of::<sa_family_t>();

pub const _SS_PAD2SIZE: usize   = _SS_MAXSIZE - size_of::<sa_family_t>()
                                  + _SS_PAD1SIZE + _SS_ALIGNSIZE;

#[repr(C)]
pub struct sockaddr_storage {
    ss_family:  sa_family_t,
    _ss_pad1:   [c_char; _SS_PAD1SIZE],
    _ss_align:  u64,
    _ss_pad2:   [c_char; _SS_PAD2SIZE],
}

pub const SOCK_DGRAM: c_int     = 1;
pub const SOCK_STREAM: c_int    = 2;

pub const SOL_SOCKET: c_int     = 1;

pub const SO_ACCEPTCONN: c_int  = 1;
pub const SO_BROADCAST: c_int   = 2;
pub const SO_DEBUG: c_int       = 3;
pub const SO_DONTROUTE: c_int   = 4;
pub const SO_ERROR: c_int       = 5;
pub const SO_KEEPALIVE: c_int   = 6;
pub const SO_LINGER: c_int      = 7;
pub const SO_OOBINLINE: c_int   = 8;
pub const SO_RCVBUF: c_int      = 9;
pub const SO_RCVLOWAT: c_int    = 10;
pub const SO_RCVTIMEO: c_int    = 11;
pub const SO_REUSEADDR: c_int   = 12;
pub const SO_SNDBUF: c_int      = 13;
pub const SO_SNDLOWAT: c_int    = 14;
pub const SO_SNDTIMEO: c_int    = 15;
pub const SO_TYPE: c_int        = 16;

pub const MSG_CTRUNC: c_int     = 0x01;
pub const MSG_DONTROUTE: c_int  = 0x02;
pub const MSG_EOR: c_int        = 0x04;
pub const MSG_OOB: c_int        = 0x08;
pub const MSG_PEEK: c_int       = 0x10;
pub const MSG_TRUNC: c_int      = 0x20;
pub const MSG_WAITALL: c_int    = 0x40;
pub const MSG_DONTWAIT: c_int   = 0x80;

pub const AF_UNSPEC: c_int      = 0;
pub const AF_INET: c_int        = 1;
pub const AF_INET6: c_int       = 2;

pub const PF_UNSPEC: c_int      = AF_UNSPEC;
pub const PF_INET: c_int        = AF_INET;
pub const PF_INET6: c_int       = AF_INET6;

pub const SHUT_RD: u32          = 0x00000001;

pub const SHUT_WR: u32          = 0x00000002;

pub const SHUT_RDWR: u32        = SHUT_RD | SHUT_WR;

pub const SOMAXCONN: c_int      = 32;

#[link(name = "kallisti")]
extern "C" {
    pub fn accept(socket: c_int, address: *mut sockaddr,
                  address_len: *mut socklen_t) -> c_int;
    pub fn bind(socket: c_int, address: *const sockaddr, address_len: socklen_t) -> c_int;
    pub fn connect(socket: c_int, address: *const sockaddr,
                   address_len: socklen_t) -> c_int;
    pub fn listen(socket: c_int, backlog: c_int) -> c_int;
    pub fn recv(socket: c_int, buffer: *mut c_void, length: c_size_t,
                flags: c_int) -> c_ssize_t;
    pub fn recvfrom(socket: c_int, buffer: *mut c_void, length: c_size_t, flags: c_int,
                    address: *mut sockaddr, address_len: *mut socklen_t) -> c_ssize_t;
    pub fn send(socket: c_int, message: *const c_void, length: c_size_t,
                flags: c_int) -> c_ssize_t;
    pub fn sendto(socket: c_int, message: *const c_void, length: c_size_t, flags: c_int,
                  dest_addr: *const sockaddr, dest_len: socklen_t) -> c_ssize_t;
    pub fn shutdown(socket: c_int, how: c_int) -> c_int;
    pub fn socket(domain: c_int, r#type: c_int, protocol: c_int) -> c_int;
    pub fn getsockname(socket: c_int, name: *mut sockaddr,
                       name_len: *mut socklen_t) -> c_int;
    pub fn getpeername(socket: c_int, name: *mut sockaddr,
                       name_len: *mut socklen_t) -> c_int;
    pub fn getsockopt(socket: c_int, level: c_int, option_name: c_int,
                      option_value: *mut c_void, option_len: *mut socklen_t) -> c_int;
    pub fn setsockopt(socket: c_int, level: c_int, option_name: c_int,
                      option_value: *const c_void, option_len: socklen_t) -> c_int;
}