00001
00012
00013
00014
00015 #ifndef OA_SOCKET_H
00016 #define OA_SOCKET_H
00017
00018 #include <stdio.h>
00019
00020 #ifdef _WIN32
00021 #define __USE_W32_SOCKETS
00022 #include <windows.h>
00023 #else
00024 #include <sys/types.h>
00025 #include <sys/socket.h>
00026 #include <netinet/in.h>
00027 #endif
00028
00029
00030 #define RFIFOP(fd,pos) \
00031 (session[fd]->rdata + session[fd]->rdata_pos + (pos))
00032
00033 #define RFIFOB(fd,pos) \
00034 (*(unsigned char*) \
00035 (session[fd]->rdata + session[fd]->rdata_pos + (pos)))
00036
00037 #define RFIFOW(fd,pos) \
00038 (*(unsigned short*) \
00039 (session[fd]->rdata + session[fd]->rdata_pos + (pos)))
00040
00041 #define RFIFOL(fd,pos) \
00042 (*(unsigned int*) \
00043 (session[fd]->rdata + session[fd]->rdata_pos + (pos)))
00044
00045 #ifdef __DEBUG
00046 #define RFIFOSKIP(fd,len) \
00047 do { \
00048 if (session[fd]->rdata_size \
00049 - session[fd]->rdata_pos - (len) < 0) { \
00050 fprintf(stderr, \
00051 "Too many skips at %s:%d.\n", \
00052 __FILE__, __LINE__); \
00053 exit(1); \
00054 } else { \
00055 session[fd]->rdata_pos += (len); \
00056 } \
00057 } while (0)
00058
00059 #else
00060 #define RFIFOSKIP(fd,len) \
00061 (session[fd]->rdata_pos += (len))
00062 #endif // __DEBUG
00063
00064 #define RFIFOREST(fd) \
00065 (session[fd]->rdata_size - session[fd]->rdata_pos)
00066
00067 #define RFIFOFLUSH(fd) \
00068 do { \
00069 memmove(session[fd]->rdata, \
00070 RFIFOP(fd,0), RFIFOREST(fd)); \
00071 session[fd]->rdata_size = RFIFOREST(fd); \
00072 session[fd]->rdata_pos = 0; \
00073 } while (0)
00074
00075 #define RFIFOSPACE(fd) \
00076 (session[fd]->max_rdata - session[fd]->rdata_size)
00077
00078 #define RBUFP(p,pos) \
00079 (((unsigned char*)(p)) + (pos))
00080
00081 #define RBUFB(p,pos) \
00082 (*(unsigned char*)((p) + (pos)))
00083
00084 #define RBUFW(p,pos) \
00085 (*(unsigned short*)((p) + (pos)))
00086
00087 #define RBUFL(p,pos) \
00088 (*(unsigned int*)((p) + (pos)))
00089
00090 #define WFIFOSPACE(fd) \
00091 (session[fd]->max_wdata - session[fd]->wdata_size)
00092
00098 char WPACKETBUF[65536];
00099
00107 #define WPACKETP(pos) \
00108 (WPACKETBUF + (pos))
00109
00117 #define WPACKETB(pos) \
00118 (*(unsigned char*)(WPACKETBUF + (pos)))
00119
00125 #define WPACKETW(pos) \
00126 (*(unsigned short*)(WPACKETBUF + (pos)))
00127
00133 #define WPACKETL(pos) \
00134 (*(unsigned int*)(WPACKETBUF + (pos)))
00135
00136 #if 0
00137
00143 #define SENDPACKET(fd,len) \
00144 (memcpy(session[fd]->wdata + session[fd]->wdata_size, \
00145 WFIFOBUF, len); \
00146 session[fd]->wdata_size = session[fd]->wdata_size + (len);)
00147
00148 #define WFIFOP(fd,pos) \
00149 (session[fd]->wdata + session[fd]->wdata_size + (pos))
00150
00151 #define WFIFOB(fd,pos) \
00152 (*(unsigned char*) \
00153 (session[fd]->wdata + session[fd]->wdata_size + (pos)))
00154
00155 #define WFIFOW(fd,pos) \
00156 (*(unsigned short*) \
00157 (session[fd]->wdata + session[fd]->wdata_size + (pos)))
00158
00159 #define WFIFOL(fd,pos) \
00160 (*(unsigned int*) \
00161 (session[fd]->wdata + session[fd]->wdata_size + (pos)))
00162
00163 #define WFIFOSET(fd,len) \
00164 (session[fd]->wdata_size = \
00165 (session[fd]->wdata_size + (len) + 2048 < session[fd]->max_wdata)\
00166 ? session[fd]->wdata_size + len : session[fd]->wdata_size)
00167
00170 #endif // 0
00171
00172 #define WBUFP(p,pos) \
00173 (((unsigned char*)(p)) + (pos))
00174
00175 #define WBUFB(p,pos) \
00176 (*(unsigned char*)((p) + (pos)))
00177
00178 #define WBUFW(p,pos) \
00179 (*(unsigned short*)((p) + (pos)))
00180
00181 #define WBUFL(p,pos) \
00182 (*(unsigned int*)((p) + (pos)))
00183
00184 #ifdef __INTERIX
00185 #define FD_SETSIZE 4096
00186 #endif // __INTERIX
00187
00188
00189
00190
00191
00192
00196 struct socket_data{
00197 unsigned char eof;
00198 unsigned char not_used_big_rdata;
00199 unsigned char not_used_big_wdata;
00200 char *rdata, *wdata;
00201 int max_rdata, max_wdata;
00202 int rdata_size, wdata_size;
00203 int rdata_pos;
00204 struct sockaddr_in client_addr;
00205 int (*func_recv)(int);
00206 int (*func_send)(int);
00207 int (*func_parse)(int);
00208 int (*func_console)(char*);
00209 void* session_data;
00210 };
00211
00212
00213
00214 extern struct socket_data *session[FD_SETSIZE];
00215
00216 int fd_max;
00217
00218 extern char listen_ip[16];
00219
00220
00221
00222 int make_listen_port(int);
00223 int make_connection(long, int);
00224 int delete_session(int);
00225 int realloc_fifo(int fd, int rfifo_size, int wfifo_size);
00226 void SENDPACKET(const int fd, const int len);
00227
00228
00229 #ifdef HAVE_ARES_LIB
00230 void set_proxy_dnsbl(const char *dnsbl);
00231 #endif
00232
00233 void flush_fifos(void);
00234 int do_sendrecv(int next);
00235 int do_parsepacket(void);
00236 void do_socket(void);
00237
00238 int start_console(int (*parse_console_func)(char*));
00239
00240 void set_defaultparse(int (*defaultparse)(int));
00241
00242 int Net_Init(void);
00243
00244 unsigned int addr_[16];
00245 unsigned int naddr_;
00246
00249 #endif // OA_SOCKET_H
00250