Subversion Repositories Kolibri OS

Rev

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

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