1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00
ipxwrapper/src/ipxwrapper.h

145 lines
4.0 KiB
C
Raw Normal View History

2008-12-09 21:36:07 +00:00
/* ipxwrapper - Library header
* Copyright (C) 2008-2011 Daniel Collins <solemnwarning@solemnwarning.net>
2008-12-09 21:36:07 +00:00
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef IPXWRAPPER_H
#define IPXWRAPPER_H
#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <wsipx.h>
2008-12-09 21:36:07 +00:00
#include <stdint.h>
#include <stdio.h>
2008-12-09 21:36:07 +00:00
#include "config.h"
2011-09-07 20:03:16 +00:00
#include "router.h"
2008-12-09 21:36:07 +00:00
/* Maximum UDP data size is 65467, we use a smaller value to ensure we have
* plenty of space to play with for headers, etc
*/
#define MAX_PACKET_SIZE 63487
#define PACKET_BUF_SIZE 65536
#define IPX_FILTER (int)(1<<0)
#define IPX_BOUND (int)(1<<1)
#define IPX_BROADCAST (int)(1<<2)
#define IPX_SEND (int)(1<<3)
#define IPX_RECV (int)(1<<4)
#define IPX_EX_BOUND (int)(1<<5)
2008-12-09 21:36:07 +00:00
#define RETURN(...) \
unlock_mutex();\
return __VA_ARGS__;
#define RETURN_WSA(errnum, ...) \
unlock_mutex();\
WSASetLastError(errnum);\
return __VA_ARGS__;
#define RETURN_ERR(errnum, ...) \
unlock_mutex();\
SetLastError(errnum);\
return __VA_ARGS__;
typedef struct ipx_socket ipx_socket;
typedef struct ipx_packet ipx_packet;
typedef struct ipx_host ipx_host;
struct ipx_socket {
SOCKET fd;
int flags;
uint8_t s_ptype;
2011-04-24 17:40:25 +00:00
uint8_t f_ptype; /* Undefined when IPX_FILTER isn't set */
2008-12-09 21:36:07 +00:00
/* The following values are undefined when IPX_BOUND is not set */
2011-09-07 20:03:16 +00:00
struct sockaddr_ipx addr;
uint32_t nic_bcast;
2008-12-09 21:36:07 +00:00
/* Extra bind address, only used for receiving packets.
* Only defined when IPX_EX_BOUND is set.
*/
2011-08-29 13:15:10 +00:00
struct ipx_interface *ex_nic;
uint16_t ex_socket;
2008-12-09 21:36:07 +00:00
ipx_socket *next;
};
struct ipx_packet {
uint8_t ptype;
unsigned char dest_net[4];
unsigned char dest_node[6];
uint16_t dest_socket;
unsigned char src_net[4];
unsigned char src_node[6];
uint16_t src_socket;
uint16_t size;
char data[1];
} __attribute__((__packed__));
struct ipx_host {
unsigned char ipx_net[4];
unsigned char ipx_node[6];
2008-12-09 21:36:07 +00:00
uint32_t ipaddr;
time_t last_packet;
2008-12-09 21:36:07 +00:00
ipx_host *next;
};
extern ipx_socket *sockets;
2011-08-29 13:15:10 +00:00
extern struct ipx_interface *nics;
2008-12-09 21:36:07 +00:00
extern ipx_host *hosts;
extern SOCKET net_fd;
extern struct reg_global global_conf;
2011-09-07 20:03:16 +00:00
extern struct router_vars *router;
2008-12-09 21:36:07 +00:00
extern HMODULE winsock2_dll;
extern HMODULE mswsock_dll;
extern HMODULE wsock32_dll;
void __stdcall *find_sym(char const *sym);
2008-12-09 21:36:07 +00:00
ipx_socket *get_socket(SOCKET fd);
void lock_mutex(void);
void unlock_mutex(void);
ipx_host *find_host(const unsigned char *net, const unsigned char *node);
2011-08-29 13:41:10 +00:00
void add_host(const unsigned char *net, const unsigned char *node, uint32_t ipaddr);
2008-12-09 21:36:07 +00:00
void log_open();
void log_close();
int ipx_ex_bind(SOCKET fd, const struct sockaddr_ipx *ipxaddr);
INT APIENTRY r_EnumProtocolsA(LPINT,LPVOID,LPDWORD);
INT APIENTRY r_EnumProtocolsW(LPINT,LPVOID,LPDWORD);
int PASCAL FAR r_WSARecvEx(SOCKET,char*,int,int*);
int WSAAPI r_bind(SOCKET,const struct sockaddr*,int);
int WSAAPI r_closesocket(SOCKET);
int WSAAPI r_getsockname(SOCKET,struct sockaddr*,int*);
int WSAAPI r_getsockopt(SOCKET,int,int,char*,int*);
int WSAAPI r_recv(SOCKET,char*,int,int);
int WSAAPI r_recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*);
int WSAAPI r_sendto(SOCKET,const char*,int,int,const struct sockaddr*,int);
int WSAAPI r_setsockopt(SOCKET,int,int,const char*,int);
int WSAAPI r_shutdown(SOCKET,int);
SOCKET WSAAPI r_socket(int,int,int);
int PASCAL r_ioctlsocket(SOCKET fd, long cmd, u_long *argp);
2008-12-09 21:36:07 +00:00
#endif /* !IPXWRAPPER_H */