⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brocas.c

📁 飞鸽传书for linux X图形界面下源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (net != NULL) {		memset(net, '\0', sizeof(*net));		net->sin.sin_family = AF_INET;		net->sin.sin_addr.s_addr = inet_addr(broad);		net->sin.sin_port = htons(bro_port);	}	return 0;}/* network_add */static intnetwork_bro_send(int so, unsigned long cmd, const char *msg){	union saddr *sin = DYNA_BUF(&dynet);	if (sin != NULL) {		int i, err;		for (i = 0; i < DYNA_USED(&dynet); i++) {			err = send_msg(so, sin, cmd, msg);			sin++;		}/* for */	}	return 0;}/* network_bro_send *//* */intsend_IPMSG_READMSG(struct maddr_t *replyto, unsigned long pkno){	char lbuf[20];	sprintf(lbuf, "%lu", pkno);	send_msg(replyto->m_so, &replyto->m_saddr, IPMSG_READMSG, lbuf);	return 0;}/* send_IPMSG_READMSG *//* * 弹瓢箕など、BR_ENTRY をブロ〖ドキャストする。 */intsend_IPMSG_BR_ENTRY(void){	network_bro_send(bro_socket, IPMSG_BR_ENTRY, "");	return 0;}/* send_IPMSG_BR_ENTRY *//* * 姜位箕、BR_EXIT をブロ〖ドキャストする。 */intsend_IPMSG_BR_EXIT(void){	network_bro_send(bro_socket, IPMSG_BR_EXIT, "");	return 0;}/* send_IPMSG_BR_EXIT *//* * BR_ENTRY を减け艰ったら、それに ANSENTRY を手す。 */static intreply_IPMSG_ANSENTRY(int so, const union saddr *from){	int err = 0;	if (!bro_disabled)		err = send_msg(so, from, IPMSG_ANSENTRY, "");	return err;}/* reply_IPMSG_ANSENTRY *//* * 减慨メッセ〖ジにオプション IPMSG_SENDCHECKOPT がついていたら * 澄千パケットを手す。 */static intreply_IPMSG_RECVMSG(int so, const union saddr *from, unsigned long pkno){	char lbuf[32];	int err;	sprintf(lbuf, "%lu", pkno);	err = send_msg(so, from, IPMSG_RECVMSG, lbuf);	return err;}/* reply_IPMSG_RECVMSG *//* * 减け艰ったパケットの流り缄は、すべて叹涟リストに判峡する。 */static struct ns_t *add_ns_entry(const struct maddr_t *ma, const char *host, const char *nick, const char *aux){	struct ns_t *ns = ns_lookup(ma);	if (ns == NULL) {		ns = ns_new(ma);	}	if (ns != NULL) {		ns->ns_maddr = *ma;		strncpyz(ns->ns_host, host, sizeof(ns->ns_host));		if (nick != NULL)			strncpyz(ns->ns_nick, nick, sizeof(ns->ns_nick));		if (ns->ns_nick[0] == '\0' && aux != NULL)			strncpyz(ns->ns_nick, aux, sizeof(ns->ns_nick));		call_cback(BRO_EV_LIST_CHANGED, NULL);	}	return ns;}/* add_ns_entry */static voiddelete_ns_entry(const struct maddr_t *ma){	ns_free(ma);}/* delete_ns_entry *//* * パケット借妄婶はここから [ */static intrecv_IPMSG_NOOPERATION(const struct packet_t *pk){	return 0;}/* recv_IPMSG_NOOPERATION *//* * 糠惮ノ〖ドが惟ち惧がった * pk->pk_msg == ニックネ〖ム */static intrecv_IPMSG_BR_ENTRY(const struct packet_t *pk){	char *nick = pk->pk_msg[0] != '\0' ? pk->pk_msg : pk->pk_user;	reply_IPMSG_ANSENTRY(pk->pk_maddr.m_so, &pk->pk_maddr.m_saddr);	add_ns_entry(&pk->pk_maddr, pk->pk_host, nick, NULL);	call_cback(BRO_EV_LIST_CHANGED, NULL);	return 0;}/* recv_IPMSG_BR_ENTRY *//* * ノ〖ド姜位した。 * pk->pk_msg == ニックネ〖ム */static intrecv_IPMSG_BR_EXIT(const struct packet_t *pk){	delete_ns_entry(&pk->pk_maddr);	call_cback(BRO_EV_LIST_CHANGED, NULL);	return 0;}/* recv_IPMSG_BR_EXIT *//* * BR_ENTRY の手祸が丸た。 * pk->pk_msg == ニックネ〖ム */static intrecv_IPMSG_ANSENTRY(const struct packet_t *pk){	char *nick = pk->pk_msg[0] != '\0' ? pk->pk_msg : pk->pk_user;	add_ns_entry(&pk->pk_maddr, pk->pk_host, nick, NULL);	call_cback(BRO_EV_LIST_CHANGED, NULL);	return 0;}/* recv_IPMSG_ANSENTRY */static intrecv_IPMSG_ABSENCE(const struct packet_t *pk){	return 0;}/* recv_IPMSG_ABSENCE */static intrecv_IPMSG_BR_ISGETLIST(const struct packet_t *pk){	return 0;}/* recv_IPMSG_BR_ISGETLIST */static intrecv_IPMSG_OKGETLIST(const struct packet_t *pk){	return 0;}/* recv_IPMSG_OKGETLIST */static intrecv_IPMSG_GETLIST(const struct packet_t *pk){	return 0;}/* recv_IPMSG_GETLIST */static intrecv_IPMSG_ANSLIST(const struct packet_t *pk){	return 0;}/* recv_IPMSG_ANSLIST *//* * メッセ〖ジが葡いた。 */static intrecv_IPMSG_SENDMSG(const struct packet_t *pk){	char *nick = pk->pk_user;	struct ns_t *ns = add_ns_entry(&pk->pk_maddr, pk->pk_host, NULL, nick);	unsigned long opt = GET_OPT(pk->pk_cmd);	int ignore = 0;	if (ns != NULL) {		nick = ns->ns_nick;		rcv_delete(&ns->ns_rcv);		if (rcv_id_lookup(&ns->ns_rcv, pk->pk_no) < 0)			rcv_add(&ns->ns_rcv, pk->pk_no);		else {			rcv_raise(&ns->ns_rcv, pk->pk_no);			ignore = 1;		}	}	if ((opt & IPMSG_SENDCHECKOPT) && !(opt & (IPMSG_BROADCASTOPT | IPMSG_AUTORETOPT)))		reply_IPMSG_RECVMSG(pk->pk_maddr.m_so, &pk->pk_maddr.m_saddr, pk->pk_no);	if (!ignore) {#define BRO_COLUMNS 58		size_t wraplen = wrap_euclen(pk->pk_msg, BRO_COLUMNS);		char *wrapbuf = malloc(wraplen + 1);		if (wrapbuf != NULL) {			char idname[USERNAME_MAX + HOSTNAME_MAX];			struct msg_data_t md;			wrap_euc(wrapbuf, pk->pk_msg, BRO_COLUMNS);			strtrim(wrapbuf);			strcat(strcat(strncpyz(idname, nick, USERNAME_MAX), "@"), ns->ns_host);			md.md_replyto = (void *)&pk->pk_maddr;			md.md_msg = wrapbuf;			md.md_icon = pk->pk_icon;			md.md_opt = opt;			md.md_pkno = pk->pk_no;			md.md_from = idname;			call_cback(BRO_EV_RECV_MESSAGE, &md);						free(wrapbuf);		}		else			error("malloc");	}	return 0;}/* recv_IPMSG_SENDMSG *//* * 流ったメッセ〖ジの减慨澄千パケットが耽って丸た。 * msg == 流ったメッセ〖ジの戎规 */static intrecv_IPMSG_RECVMSG(const struct packet_t *pk){	struct xq_t *xq = xq_lookup(strtol(pk->pk_msg, NULL, 10));	if (xq != NULL) {		char lbuf[80];		xq_deq(xq);		sprintf(lbuf, "%16s.%d ", inet_ntoa(xq->xq_saddr.sin.sin_addr), ntohs(xq->xq_saddr.sin.sin_port));		call_cback(BRO_EV_RECV_ACK, lbuf);		free(xq->xq_buf);		free(xq);	}	return 0;}/* recv_IPMSG_RECVMSG */static intrecv_IPMSG_READMSG(const struct packet_t *pk){	return 0;}/* recv_IPMSG_READMSG */static intrecv_IPMSG_DELMSG(const struct packet_t *pk){	return 0;}/* recv_IPMSG_DELMSG */static intrecv_IPMSG_GETINFO(const struct packet_t *pk){	return 0;}/* recv_IPMSG_GETINFO */static intrecv_IPMSG_SENDINFO(const struct packet_t *pk){	return 0;}/* recv_IPMSG_SENDINFO *//* * */static intdo_cmd(struct packet_t *pk){	unsigned long cmd = GET_MODE(pk->pk_cmd);	switch (cmd) {	case IPMSG_NOOPERATION: /* 痰拎侯 */		recv_IPMSG_NOOPERATION(pk);		break;	case IPMSG_BR_ENTRY: /* サ〖ビスにエントリ〖∈弹瓢箕にBroadcast∷ */		recv_IPMSG_BR_ENTRY(pk);		break;	case IPMSG_BR_EXIT: /* サ〖ビスから却ける∈姜位箕にBroadcast∷ */		recv_IPMSG_BR_EXIT(pk);		break;	case IPMSG_ANSENTRY: /* サ〖ビスにエントリ〖を千急 */		recv_IPMSG_ANSENTRY(pk);		break;	case IPMSG_BR_ABSENCE: /* 稍哼モ〖ド恃构 */		recv_IPMSG_ABSENCE(pk);		break;	case IPMSG_BR_ISGETLIST: /* ホストリスト流叫材墙メンバの玫瑚 */		recv_IPMSG_BR_ISGETLIST(pk);		break;	case IPMSG_OKGETLIST: /* ホストリスト流叫材墙奶梦 */		recv_IPMSG_OKGETLIST(pk);		break;	case IPMSG_GETLIST: /* ホストリスト流叫妥滇 */		recv_IPMSG_GETLIST(pk);		break;	case IPMSG_ANSLIST: /* ホストリスト流叫 */		recv_IPMSG_ANSLIST(pk);		break;	case IPMSG_SENDMSG: /* メッセ〖ジの流慨 */		recv_IPMSG_SENDMSG(pk);		break;	case IPMSG_RECVMSG: /* メッセ〖ジの减慨澄千 */		recv_IPMSG_RECVMSG(pk);		break;	case IPMSG_READMSG: /* 甚今の倡甚奶梦 */		recv_IPMSG_READMSG(pk);		break;	case IPMSG_DELMSG: /*  甚今撬逮奶梦 */		recv_IPMSG_DELMSG(pk);		break;	case IPMSG_GETINFO:		recv_IPMSG_GETINFO(pk);		break;	case IPMSG_SENDINFO:		recv_IPMSG_SENDINFO(pk);		break;	}/* switch */	return 0;}/* do_cmd */static struct packet_t *decode_packet(char *lbuf, size_t size, struct packet_t *pk){	/* Ver(1)¨Packet戎规 : 极User叹 : 极Host叹 : Command戎规 : 纳裁婶*/	struct packet_t *ret = NULL;	char *user, *host, *msg;	sscanf(lbuf, "%lu:%lu:%*[^:]:%*[^:]:%lu", &pk->pk_ver, &pk->pk_no, &pk->pk_cmd);	user = strnchr(lbuf, ':', 2);	if (user != NULL) {		user++;		host = strnchr(lbuf, ':', 3);		if (host != NULL) {			host++;			msg = strnchr(lbuf, ':', 5);			if (msg != NULL) {				msg++;				*strchr(user, ':') = '\0';				*strchr(host, ':') = '\0';				pk->pk_user = user;				pk->pk_host = host;				pk->pk_msg = msg;				ret = pk;			}		}	}	return ret;}/* decode_packet *//* * パケットが葡いた箕钙び叫される。 */intbro_recv_packet(int so){	struct packet_t pk;	char sbuf[MESSAGE_MAX];	union saddr *from = &pk.pk_maddr.m_saddr;	ssize_t size = p_get(so, from, 0, sbuf, sizeof(sbuf) - 1);	if (size > 0) {		char ebuf[sizeof(sbuf) * 2], *p;		unsigned char icon[128];		size_t iconsize;		sbuf[size] = '\0';		p = strchr(sbuf, '\0') + 1;		iconsize = MIN(sizeof(icon), size - (p - sbuf));		memset(icon, '\0', sizeof(icon));		memcpy(icon, p, iconsize);		strstoe(ebuf, sbuf);		size = strlen(ebuf) + 1;		if (debug_flag & 2) {			warning("%d: %16s.%d [", so, inet_ntoa(from->sin.sin_addr), ntohs(from->sin.sin_port));			fputs(ebuf, stderr);			fputs("]\n", stderr);		}		if (decode_packet(ebuf, size, &pk) != NULL) {			pk.pk_maddr.m_so = so;			pk.pk_icon = icon;			strncpyz(pk.pk_maddr.m_user, pk.pk_user, sizeof(pk.pk_maddr.m_user));			do_cmd(&pk);					}		else			warning("bad packet.\n");	}	return 0;}/* recv_packet *//* ] パケット借妄婶おわり *//* * タイムアウト借妄 * 1 擅髓に钙び叫される。 */voidbro_job(void){	bro_tic++;	xq_timers();}/* bro_job *//* * 菜な箕钙び叫される。 */voidbro_work(void){	xq_work_proc();}/* bro_job *//* * */intbro_set_disable(int disable){	bro_disabled = disable;	return 0;}/* bro_set_disable *//* * */intbro_init(int port, const char *user, const char *host, const char * const *bros){	int so;#ifdef SOCKS	SOCKSinit(myname);#endif	so = socket(PF_INET, SOCK_DGRAM, 0);	DYNA_IZ(&dynet, 32);	bro_user = malloc(strlen(user) + 1);	if (bro_user != NULL) {		stretos(bro_user, user);		bro_port = port;		bro_host = host;		msg_number = time(NULL);		while (*bros != NULL)			network_add(*bros++);		if (so >= 0) {			int optval = 1;			int err = SETSOCKOPT(so, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval));			if (err >= 0) {				int err;				union saddr sa;				memset(&sa, '\0', sizeof(sa));				sa.sin.sin_family = AF_INET;				sa.sin.sin_addr.s_addr = INADDR_ANY;				sa.sin.sin_port = htons(port);				err = bind(so, &sa.sa, sizeof(sa));			}			if (err < 0) {				close(so);				so = -1;			}		}	}	bro_socket = so;	return so;}/* bro_init */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -