/*
* brocas.h
* Copyright (C) 1996 by candy
* $Id: brocas.h,v 3.7 1996/12/12 17:15:12 candy Exp candy $
*/
#ifndef BROCAS_H__
#define BROCAS_H__
#define COUNTOF(v) (sizeof(v)/sizeof((v)[0]))
#define GETUW(p) ((((unsigned char *)(p))[0]<<8)|(((unsigned char *)(p))[1]))
#define GETUL(p) ((((unsigned long)((unsigned char *)(p))[0])<<24)|(((unsigned char *)(p))[1]<<16)|(((unsigned char *)(p))[2]<<8)|(((unsigned char *)(p))[3]))
#define SETUW(p,x) (void)(((char*)(p))[0]=((x)>>8)&0xff,((char*)(p))[1]=(x)&0xff)
#define SETUL(p,x) (void)(((char*)(p))[0]=((x)>>24)&0xff,((char*)(p))[1]=((x)>>16)&0xff,((char*)(p))[2]=((x)>>8)&0xff,((char*)(p))[3]=(x)&0xff)
#ifndef MAX
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
extern int debug_flag;
#define USERNAME_MAX 64
#define HOSTNAME_MAX 256
#define MESSAGE_MAX 8192
/*
* ソケットアドレス
*/
union saddr {
struct sockaddr sa;
struct sockaddr_in sin;
};
/*
* IP Messenger プロトコルアドレス構造体
*/
struct maddr_t {
int m_so;
char m_user[USERNAME_MAX];
union saddr m_saddr;
};
/*
* 受信パケットをデコードしたもの
*/
struct packet_t {
unsigned long pk_ver;
unsigned long pk_no;
unsigned long pk_cmd;
char *pk_user;
char *pk_host;
char *pk_msg;
char *pk_icon;
size_t pk_msgsize;
struct maddr_t pk_maddr;
};
/*
* コールバックのイベント
*/
enum bro_event_t {
BRO_EV_LIST_CHANGED, /* 名前リストが変わった */
BRO_EV_RECV_MESSAGE, /* メッセージが届いた */
BRO_EV_RECV_ACK, /* 送ったメッセージが間違いなく届いた */
BRO_EV_NO_ACK, /* 送ったメッセージが届かなかったかも */
BRO_EV_START_WORK_PROC, /* work procedure を開始する (^^;; */
BRO_EV_MAX /* (イベント種類総数) */
};
struct msg_data_t {
struct maddr_t *md_replyto;
char *md_msg;
char *md_from;
unsigned long md_opt;
unsigned long md_pkno;
unsigned char *md_icon;
};
/*
* パケットフィルタリング用
*/
struct rcv_q_t {
unsigned long q_id; /* 受信したパケット番号 */
unsigned long q_keep; /* 保持する時間 */
};
/*
*
*/
struct rcv_t {
struct rcv_q_t *rcv_q;
size_t rcv_size; /* rcv_q のサイズ */
size_t rcv_used; /* rcv_q の使用中のサイズ */
};
struct ns_t {
struct maddr_t ns_maddr; /* プロトコルアドレス */
char ns_host[HOSTNAME_MAX]; /* ホスト名フィールド値 */
char ns_nick[USERNAME_MAX]; /* ニックネーム */
struct rcv_t ns_rcv;
};
typedef void (*bro_callback_t)(enum bro_event_t, void *closure, void *call_data);
/*
* スキャッターバッファ
*/
struct iov_t {
struct iov_t *iov_next;
void *iov_base;
size_t iov_len;
};
#define SET_IOV(v,next,base,len) (void)((v)->iov_next = (next), (v)->iov_base = (base), (v)->iov_len = (len))
/* ----START */
char * str_dup(const char *s);
char * strncpyz(char *dst, const char *src, size_t len);
char * strnchr(const char *s, int ch, size_t n);
int strcmpi(const char *d_, const char *s_);
int strncmpi(const char *d_, const char *s_, size_t n);
int bro_add_callback(enum bro_event_t e, bro_callback_t callback, void *closure);
struct xq_t * xq_enq(struct xq_t *xq);
int bro_send(const char *msg, const unsigned char *icon, const struct maddr_t *ma);
struct ns_t * ns_lookup(const struct maddr_t *ma);
struct ns_t * ns_get(int idx);
void ns_free(const struct maddr_t *ma);
void ns_clear(void);
char ** ns_list(void);
int send_IPMSG_READMSG(struct maddr_t *replyto, unsigned long pkno);
int send_IPMSG_BR_ENTRY(void);
int send_IPMSG_BR_EXIT(void);
int bro_recv_packet(int so);
void bro_job(void);
void bro_work(void);
int bro_set_disable(int disable);
int bro_init(int port, const char *user, const char *host, const char * const *bros);
/* ----END */
#endif
syntax highlighted by Code2HTML, v. 0.9.1