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);
}
예제 #2
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;
}
예제 #3
0
파일: chat.c 프로젝트: wyat/kbs
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);
}
예제 #4
0
파일: chat.c 프로젝트: wyat/kbs
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);
}
예제 #5
0
int s_msg(void){
    return do_sendmsg(NULL, NULL, 0);
}
예제 #6
0
파일: dev_uds.c 프로젝트: Spenser309/CS551
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;
	}
}