Subversion Repositories Kolibri OS

Rev

Rev 8787 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8687 turbocat 1
/* Copyright (C) 2019-2021 Logaev Maxim (turbocat2001), GPLv2 */
2
 
3
#ifndef _SOCKET_H_
4
#define _SOCKET_H_
5
 
6
#include 
7
#include 
8
#include 
9
 
10
// Socket Types
11
#define SOCK_STREAM 1
12
#define SOCK_DGRAM 2
13
#define SOCK_RAW 3
14
 
15
// IP protocols
16
#define IPPROTO_IP 0
17
#define IPPROTO_ICMP 1
18
#define IPPROTO_TCP 6
19
#define IPPROTO_UDP 17
20
#define IPPROTO_RAW 255
21
 
22
// IP options
23
#define IP_TTL 2
24
 
25
// Address families
26
#define AF_UNSPEC 0
27
#define AF_LOCAL 1
28
#define AF_INET  2     // Default INET=IPv4
29
#define AF_INET4 2     // IPv4
30
#define AF_INET6 10    // IPv6
31
 
32
#define PF_UNSPEC AF_UNSPEC
33
#define PF_LOCAL  AF_LOCAL
34
#define PF_INET4  AF_INET4
35
#define PF_INET6  AF_INET6
36
 
37
// internal definition
38
#define AI_SUPPORTED 0x40F
39
 
40
// for system function 76
41
#define API_ETH (0<<16)
42
#define API_IPv4 (1<<16)
43
#define API_ICMP (2<<16)
44
#define API_UDP (3<<16)
45
#define API_TCP (4<<16)
46
#define API_ARP (5<<16)
47
#define API_PPPOE (6<<16)
48
 
49
// Socket flags for user calls
50
#define MSG_NOFLAG 0
51
#define MSG_PEEK 0x02
52
#define MSG_DONTWAIT 0x40
53
 
54
// Socket levels
55
#define SOL_SOCKET 0xffff
56
 
57
//Socket options
58
#define SO_BINDTODEVICE (1<<9)
59
#define SO_NONBLOCK (1<<31)
60
 
61
#define PORT(X) (X<<8)
62
 
63
#pragma pack(push,1)
64
struct sockaddr{
65
    unsigned short sin_family;
66
    unsigned short sin_port;
67
    unsigned int sin_addr;
68
    unsigned long long sin_zero;
69
};
70
 
71
typedef struct{
72
  unsigned int level;
73
  unsigned int optionname;
74
  unsigned int optlenght;
75
  unsigned char options;
76
}optstruct;
77
#pragma pack(pop)
78
 
79
static inline
80
void _conv_socket_err(){
81
    switch(errno){
82
        case 1:  errno = ENOBUFS; break;
83
        case 2:  errno = EINPROGRESS; break;
84
        case 4:  errno = EOPNOTSUPP; break;
85
        case 6:  errno = EWOULDBLOCK; break;
86
        case 9:  errno = ENOTCONN; break;
87
        case 10: errno = EALREADY; break;
88
        case 11: errno = EINVAL; break;
89
        case 12: errno = EMSGSIZE; break;
90
        case 18: errno = ENOMEM; break;
91
        case 20: errno = EADDRINUSE; break;
92
        case 61: errno = ECONNREFUSED; break;
93
        case 52: errno = ECONNRESET; break;
94
        case 56: errno = EISCONN; break;
95
        case 60: errno = ETIMEDOUT; break;
96
        case 54: errno = ECONNABORTED; break;
97
        default: errno = 0; break;
98
    }
99
}
100
 
101
static inline
102
int socket(int domain, int type, int protocol)
103
{
104
    int socket;
105
    asm_inline(
106
        "int $0x40"
107
        :"=b"(errno), "=a"(socket)
108
        :"a"(75), "b"(0), "c"(domain), "d"(type), "S"(protocol)
109
    );
110
    _conv_socket_err();
111
    return socket;
112
}
113
 
114
static inline
115
int close(int socket)
116
{
117
    int status;
118
    asm_inline(
119
        "int $0x40"
120
        :"=b"(errno), "=a"(status)
121
        :"a"(75), "b"(1), "c"(socket)
122
    );
123
    _conv_socket_err();
124
    return status;
125
}
126
 
127
static inline
128
int bind(int socket, const struct sockaddr *addres, int addres_len)
129
{
130
    int status;
131
    asm_inline(
132
        "int $0x40"
133
        :"=b"(errno), "=a"(status)
134
        :"a"(75), "b"(2), "c"(socket), "d"(addres), "S"(addres_len)
135
    );
136
    _conv_socket_err();
137
    return status;
138
}
139
 
140
static inline
141
int listen(int socket, int backlog)
142
{
143
    int status;
144
    asm_inline(
145
        "int $0x40"
146
        :"=b"(errno), "=a"(status)
147
        :"a"(75), "b"(3), "c"(socket), "d"(backlog)
148
    );
149
    _conv_socket_err();
150
    return status;
151
}
152
 
153
static inline
154
int connect(int socket, const struct sockaddr* address, int socket_len)
155
{
156
    int status;
157
    asm_inline(
158
        "int $0x40"
159
        :"=b"(errno), "=a"(status)
160
        :"a"(75), "b"(4), "c"(socket), "d"(address), "S"(socket_len)
161
    );
162
    _conv_socket_err();
163
    return status;
164
}
165
 
166
static inline int
167
accept(int socket, const struct sockaddr *address, int address_len)
168
{
169
    int new_socket;
170
    asm_inline(
171
        "int $0x40"
172
        :"=b"(errno), "=a"(new_socket)
173
        :"a"(75), "b"(5), "c"(socket), "d"(address), "S"(address_len)
174
    );
175
    _conv_socket_err();
176
    return new_socket;
177
}
178
 
179
static inline
180
int send(int socket, const void *message, size_t msg_len, int flag)
181
{
182
    int status;
183
    asm_inline(
184
        "int $0x40"
185
        :"=b"(errno), "=a"(status)
186
        :"a"(75), "b"(6), "c"(socket), "d"(message), "S"(msg_len), "D"(flag)
187
    );
188
    _conv_socket_err();
189
    return status;
190
}
191
 
192
static inline
193
int recv(int socket, void *buffer, size_t buff_len, int flag)
194
{
195
    int status;
196
    asm_inline(
197
        "int $0x40"
198
        :"=b"(errno), "=a"(status)
199
        :"a"(75), "b"(7), "c"(socket), "d"(buffer), "S"(buff_len), "D"(flag)
200
    );
201
    _conv_socket_err();
202
    return status;
203
}
204
 
205
static inline
206
int setsockopt(int socket,const optstruct* opt)
207
{
208
    int status;
209
    asm_inline(
210
        "int $0x40"
211
        :"=b"(errno), "=a"(status)
212
        :"a"(75), "b"(8), "c"(socket),"d"(opt)
213
    );
214
    _conv_socket_err();
215
    return status;
216
}
217
 
218
static inline
219
int getsockopt(int socket, optstruct* opt)
220
{
221
    int status;
222
    asm_inline(
223
        "int $0x40"
224
        :"=b"(errno), "=a"(status)
225
        :"a"(75), "b"(9), "c"(socket),"d"(opt)
226
    );
227
    _conv_socket_err();
228
    return status;
229
}
230
 
231
static inline
232
int socketpair(int *socket1, int *socket2)
233
{
234
   asm_inline(
235
        "int $0x40"
236
        :"=b"(*socket2), "=a"(*socket1)
237
        :"a"(75), "b"(10)
238
    );
239
    errno=*socket2;
240
    _conv_socket_err();
241
    return *socket1;
242
}
243
 
244
#endif //_SOCKET_H_