/* Copyright (c) 2005 Mackenzie Straight <eiz@codealchemy.org> */ /* Use of this software for any purpose is allowed, provided this notice */ /* is preserved. It is provided as-is. If it breaks, you get to keep */ /* both pieces. */ #ifndef _OPAS_H #define _OPAS_H #include <netinet/in.h> #define BIT(x) (1 << x) #define BUF_SIZE 1024 #define OPAS_VERSION (1 << 24) #define min(x,y) ((x) < (y) ? (x) : (y)) #define max(x,y) ((x) > (y) ? (x) : (y)) #define clamp(x, lo, hi) max(lo, min(hi, x)) typedef struct opas_header opas_header_t; typedef struct opas_request4 opas_request4_t; typedef struct opas_reply_proxy opas_reply_proxy_t; typedef struct opas_client opas_client_t; typedef void dispatch_func(opas_client_t *, opas_header_t *); struct opas_header { uint32_t bits; }; struct opas_request4 { opas_header_t header; uint32_t user_data; struct in_addr ipaddr; }; struct opas_reply_proxy { opas_header_t header; uint32_t user_data; struct in_addr ipaddr; int timestamp; short type; short port; char msg[1]; }; typedef enum { opas_state_header, opas_state_packet } opas_state_t; typedef enum { opas_packet_reply_neg, opas_packet_reply_proxy, opas_packet_error, opas_invalid_packet } opas_packet_type_t; struct opas_client { int sock; char inbuf[BUF_SIZE]; int in_len; opas_state_t state; uint32_t st_len; uint32_t st_hdr; dispatch_func *dispatch; } opas_client; opas_client_t *opas_open(char *server, int port); void opas_send_req4(opas_client_t *client, uint32_t user_data, struct in_addr ipaddr); void opas_send_ping(opas_client_t *client); void opas_set_dispatch(opas_client_t *client, dispatch_func func); int opas_wait(opas_client_t *client); int opas_dispatch(opas_client_t *client); int opas_packet_length (opas_header_t *packet); opas_packet_type_t opas_packet_type(opas_header_t *packet); #endif /* _OPAS_H */