?? brocas.c
字號:
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 + -