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; }
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; }
tcpserver::tcpserver(event_loop* eloop):listenfd_(-1),evloop_(eloop) { idlefd_ = ::open("/dev/null", O_RDONLY); setcloseonexec(idlefd_); }