static int client_main(pid_t pid, const char *sockpath) { struct sockaddr_storage sockaddr; struct sockaddr_un *addr; sigset_t set; int sig, sock, status; const char *signame; if (sigemptyset(&set) == -1) return (1); if (sigaddset(&set, SIG) == -1) return (2); if (sigwait(&set, &sig) != 0) return (3); if (sig != SIG) return (4); sock = socket(PF_LOCAL, SOCK_STREAM, 0); if (sock == -1) return (5); addr = (struct sockaddr_un *)&sockaddr; addr->sun_family = AF_LOCAL; strcpy(addr->sun_path, sockpath); addr->sun_len = SUN_LEN(addr); if (connect(sock, (struct sockaddr *)addr, addr->sun_len) == -1) return (6); if (do_sendmsg(sock) == -1) return (7); if (close(sock) == -1) return (8); return (0); }
static int dispatchit(int sock_slave, int sock, int sidx) { struct sockaddr_in a; unsigned char *pom; int conn, alen, ret; alen = sizeof(a); if ( (conn = accept(sock, (struct sockaddr *)&a, &alen)) < 0 ) { if (debug) { perror("accept()"); return 1; } else { syslog(LOG_ERR, "accept(): %m"); sleep(5); return -1; } } getpeername(conn, (struct sockaddr *)&a, &alen); pom = (char *) &a.sin_addr.s_addr; dprintf(("[master] %s connection from %d.%d.%d.%d:%d\n", services[sidx].id? services[sidx].id: "", (int)pom[0], (int)pom[1], (int)pom[2], (int)pom[3], ntohs(a.sin_port))); ret = 0; if ( ( clnt_dispatched < clnt_accepted /* wraparound */ || clnt_dispatched - clnt_accepted < set_slaves_ct * set_slave_overload) && !(ret = do_sendmsg(sock_slave, conn, clnt_dispatched++, sidx)) ) { /* all done */ dprintf(("[master] Dispatched %lu, last known served %lu\n", clnt_dispatched-1, clnt_accepted)); } else { services[sidx].on_reject_hnd(conn); dprintf(("[master] Rejected new connection due to overload\n")); if ( !debug ) syslog(LOG_ERR, "Rejected new connection due to overload\n"); } close(conn); if (ret) { perror("sendmsg()"); if ( !debug ) syslog(LOG_ERR, "sendmsg(): %m"); } return 0; }
void chat_sendmsg(chatcontext * pthis, const char *arg) { /* send msg in chatroom , by alex, 96.9.5 */ char userid[IDLEN + 1]; char msg[STRLEN * 2]; struct user_info *uin; int state; nextword(&arg, userid, sizeof(userid)); if (!userid[0]) { printchatline(pthis, "\x1b[37m*** \x1b[32m请输入你要发消息的 ID\x1b[37m ***\x1b[m"); return; } else if (!*arg) { printchatline(pthis, "\x1b[37m*** \x1b[32m请输入你要发的消息\x1b[37m ***\x1b[m"); return; } else if (!HAS_PERM(getCurrentUser(), PERM_PAGE)) { /* Leeward 98.07.30 */ sprintf(msg, "\x1b[32m你没有发信息的权限\x1b[m"); } else { uin = t_search(userid, false); if (uin == NULL) { sprintf(msg, "\x1b[32m%s\x1b[37m 并没有上站\x1b[m", userid); } else if (LOCKSCREEN == uin->mode) /* Leeward 98.02.28 */ sprintf(msg, "\x1b[32m%s\x1b[37m已经锁定屏幕,请稍候再发或给他(她)写信.\n", uin->userid); else { if (!canmsg(getCurrentUser(), uin)) sprintf(msg, "\x1b[32m%s\x1b[37m已经关闭接受讯息的呼叫器.\n", uin->userid); else if (false == canIsend2(getCurrentUser(),uin->userid)) sprintf(msg, "\x1b[32m%s\x1b[37m拒绝接受你的讯息.\n", uin->userid); /*Haohmaru.99.6.6,检查是否被ignore */ else { if (get_unreadcount(uin->userid) > MAXMESSAGE) sprintf(msg, "对方尚有一些讯息未处理,请稍候再发或给他(她)写信...\n"); else { /* 保存所发msg的目的uid 1998.7.5 by dong */ strcpy(getSession()->MsgDesUid, uin->userid); state = do_sendmsg(uin, arg, 2); if (state == 1) sprintf(msg, "\x1b[37m已经发消息给 \x1b[32m%s\x1b[37m 了\x1b[m", uin->userid); else if (state == -2) sprintf(msg, "\x1b[37m对方已经离线了...\x1b[m"); else sprintf(msg, "\033[37对方不接受你的消息...\033[m"); } } } } printchatline(pthis, msg); }
void call_user(chatcontext * pthis, const char *arg) { /* invite user online to chatroom */ char msg[STRLEN * 2]; struct user_info *uin; int state; if (!*arg) { printchatline(pthis, "\033[37m*** \033[32m请输入你要邀请的 ID\033[37m ***\033[m"); return; } if (!strcasecmp(arg, getCurrentUser()->userid)) sprintf(msg, "\033[32m你不用邀请自己啊\033[m"); else if (!HAS_PERM(getCurrentUser(), PERM_PAGE)) /* Leeward 98.07.30 */ sprintf(msg, "\033[32m你没有发信息的权限\033[m"); else { uin = t_search(arg, false); if (uin == NULL) sprintf(msg, "\033[32m%s\033[37m 并没有上站\033[m", arg); else if (LOCKSCREEN == uin->mode) /* Leeward 98.02.28 */ sprintf(msg, "\033[32m%s\033[37m已经锁定屏幕,请稍候再邀请或给他(她)写信.\n", uin->userid); else if (!canmsg(getCurrentUser(), uin)) sprintf(msg, "%s 已经关闭接受讯息的呼叫器.\n", uin->userid); else { if (get_unreadcount(uin->userid) > MAXMESSAGE) sprintf(msg, "对方尚有一些讯息未处理,请稍候再邀请或给他(她)写信...\n"); else { sprintf(msg, "到聊天广场的 %s 聊天室 聊聊天", pthis->chatroom); /* 保存所发msg的目的uid 1998.7.5 by dong */ strcpy(getSession()->MsgDesUid, uin->userid); state = do_sendmsg(uin, msg, 1); if (state == 1) sprintf(msg, "\033[37m已经帮你邀请 %s 了\033[m", uin->userid); else if (state == -2) sprintf(msg, "\033[37m对方已经离线了...\033[m"); else sprintf(msg, "\033[37对方不接受你的消息...\033[m"); } } } printchatline(pthis, msg); }
int s_msg(void){ return do_sendmsg(NULL, NULL, 0); }
PUBLIC int uds_ioctl(message *dev_m_in, message *dev_m_out) { int minor; #if DEBUG == 1 static int call_count = 0; printf("(uds) [%d] uds_ioctl() call_count=%d\n", uds_minor(dev_m_in), ++call_count); printf("Endpoint: 0x%x | Position 0x%x\n", dev_m_in->IO_ENDPT, dev_m_in->POSITION); #endif minor = uds_minor(dev_m_in); if (uds_fd_table[minor].state != UDS_INUSE) { /* attempted to close a socket that hasn't been opened -- * something is very wrong :( */ uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT, (cp_grant_id_t) dev_m_in->IO_GRANT, EINVAL); return EINVAL; } /* track the system call we are performing in case it gets cancelled */ uds_fd_table[minor].call_nr = dev_m_in->m_type; uds_fd_table[minor].ioctl = dev_m_in->COUNT; uds_fd_table[minor].syscall_done = 0; /* setup select(2) framework */ uds_fd_table[minor].selecting = 0; /* update the owner endpoint - yes it's really stored in POSITION */ uds_fd_table[minor].owner = dev_m_in->POSITION; switch (dev_m_in->COUNT) { /* Handle the ioctl(2) command */ case NWIOSUDSCONN: /* connect to a listening socket -- connect() */ return do_connect(dev_m_in, dev_m_out); case NWIOSUDSACCEPT: /* accept an incoming connection -- accept() */ return do_accept(dev_m_in, dev_m_out); case NWIOSUDSBLOG: /* set the backlog_size and put the socket into the * listening state -- listen() */ return do_listen(dev_m_in, dev_m_out); case NWIOSUDSTYPE: /* set the type for this socket (i.e. * SOCK_STREAM, SOCK_DGRAM, etc) -- socket() */ return do_socket(dev_m_in, dev_m_out); case NWIOSUDSADDR: /* set the address for this socket -- bind() */ return do_bind(dev_m_in, dev_m_out); case NWIOGUDSADDR: /* get the address for this socket -- getsockname() */ return do_getsockname(dev_m_in, dev_m_out); case NWIOGUDSPADDR: /* get the address for the peer -- getpeername() */ return do_getpeername(dev_m_in, dev_m_out); case NWIOSUDSSHUT: /* shutdown a socket for reading, writing, or * both -- shutdown() */ return do_shutdown(dev_m_in, dev_m_out); case NWIOSUDSPAIR: /* connect two sockets -- socketpair() */ return do_socketpair(dev_m_in, dev_m_out); case NWIOGUDSSOTYPE: /* get socket type -- getsockopt(SO_TYPE) */ return do_getsockopt_sotype(dev_m_in, dev_m_out); case NWIOGUDSPEERCRED: /* get peer endpoint -- getsockopt(SO_PEERCRED) */ return do_getsockopt_peercred(dev_m_in, dev_m_out); case NWIOSUDSTADDR: /* set target address -- sendto() */ return do_sendto(dev_m_in, dev_m_out); case NWIOGUDSFADDR: /* get from address -- recvfrom() */ return do_recvfrom(dev_m_in, dev_m_out); case NWIOGUDSSNDBUF: /* get the send buffer size -- getsockopt(SO_SNDBUF) */ return do_getsockopt_sndbuf(dev_m_in, dev_m_out); case NWIOSUDSSNDBUF: /* set the send buffer size -- setsockopt(SO_SNDBUF) */ return do_setsockopt_sndbuf(dev_m_in, dev_m_out); case NWIOGUDSRCVBUF: /* get the send buffer size -- getsockopt(SO_SNDBUF) */ return do_getsockopt_rcvbuf(dev_m_in, dev_m_out); case NWIOSUDSRCVBUF: /* set the send buffer size -- setsockopt(SO_SNDBUF) */ return do_setsockopt_rcvbuf(dev_m_in, dev_m_out); case NWIOSUDSCTRL: /* set the control data -- sendmsg() */ return do_sendmsg(dev_m_in, dev_m_out); case NWIOGUDSCTRL: /* set the control data -- recvmsg() */ return do_recvmsg(dev_m_in, dev_m_out); default: /* the IOCTL command is not valid for /dev/uds -- * this happens a lot and is normal. a lot of * libc functions determine the socket type with * IOCTLs. Any not for us simply get a EBADIOCTL * response. */ uds_fd_table[minor].syscall_done = 1; uds_set_reply(dev_m_out, TASK_REPLY, dev_m_in->IO_ENDPT, (cp_grant_id_t) dev_m_in->IO_GRANT, EBADIOCTL); return EBADIOCTL; } }