Exemplo n.º 1
0
static ssize_t spy_ai_send(struct addrinfo *ai, struct seq_file const *m)
{
	struct addrinfo hints;
	struct addrinfo *result, *rp;
	ssize_t len = -1;
	char from[128];
	char to[128];
	int fd;
	int tos;
	int s;

	memset(&hints, 0, sizeof(struct addrinfo));
	hints.ai_family = ai->ai_family;
	hints.ai_socktype = ai->ai_socktype;
	hints.ai_flags = AI_PASSIVE;
	s = getaddrinfo(NULL, "syslog", &hints, &result);
	if (s != 0)
		fatal("getaddrinfo: %s\n", gai_strerror(s));

	for (rp = result; rp != NULL; rp = rp->ai_next) {
		if ((fd = socket(rp->ai_family, rp->ai_socktype,
				 rp->ai_protocol)) < 0)
			fatal("%s(%s) %m", "socket",
			      ai_print(rp, from, sizeof(from)));

		if (setcloseonexec(fd) < 0)
			fatal("%s(%s) %m", "setcloseonexec",
			      ai_print(rp, from, sizeof(from)));

		tos = (VOIP_DSCP << 2);
		setsockopt(fd, SOL_IP, IP_TOS, &tos, sizeof(tos));

		if (bind(fd, rp->ai_addr, rp->ai_addrlen) < 0)
			fatal("%s(%s) %m", "bind",
			      ai_print(rp, from, sizeof(from)));

		len = sendto(fd, seq_c_str(m), seq_length(m), 0, ai->ai_addr,
			     ai->ai_addrlen);

		dbg("%s > %s: %s",
		    ai_print(rp, from, sizeof(from)),
		    ai_print(ai, to, sizeof(to)), seq_c_str(m));
		if (len <= 0) {
			warn("%s(%s -> %s) %m", "sendto",
			     ai_print(rp, from, sizeof(from)),
			     ai_print(ai, to, sizeof(to)));
			close(fd);
			continue;
		}

		close(fd);
		break;
	}

	freeaddrinfo(result);

	return len;
}
Exemplo n.º 2
0
int tcpserver::init(int listenport)
{
    listenfd_ = ::socket(AF_INET, SOCK_STREAM, 0);
    if (listenfd_ == -1) abort();

    int opt = 1;
    ::setsockopt(listenfd_, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt));	

    setnonblock(listenfd_);
    setcloseonexec(listenfd_);

    struct sockaddr_in addr;
    memset( &addr , 0,sizeof(addr) );
    addr.sin_family = AF_INET;
    addr.sin_port = htons(listenport);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if ( 0 != ::bind( listenfd_ , (struct sockaddr *)&addr , sizeof(addr) ) ) abort();
    if( 0 != ::listen( listenfd_, 1000000 ) ) abort();

    if (!evloop_->addlistenfd(listenfd_,this)) abort();
    return 0;
}
Exemplo n.º 3
0
tcpserver::tcpserver(event_loop* eloop):listenfd_(-1),evloop_(eloop)
{
    idlefd_ = ::open("/dev/null", O_RDONLY);
    setcloseonexec(idlefd_);
}