void identd_handler(int s) { struct sockaddr_in remaddr; socklen_t sra = sizeof(struct sockaddr_in); int sock = -1; #if 0 if (!(get_dllint_var("identd")) || !(get_dllstring_var("identd_user"))) { int opt = 0; int optlen = sizeof(opt); getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)&opt, optlen); return; } #endif if ((sock = accept(s, (struct sockaddr *) &remaddr, &sra)) > -1) { if (!(get_dllint_var("identd")) || !(get_dllstring_var("identd_user"))) { close(sock); return; } add_socketread(sock, s, 0, inet_ntoa(remaddr.sin_addr), identd_read, NULL); add_sockettimeout(sock, 20, NULL); } }
int start_identd(void) { int sock = -1; unsigned short port = 113; if (identd != -1) return -1; if ((sock = connect_by_number(NULL, &port, SERVICE_SERVER, PROTOCOL_TCP, 1)) > -1) add_socketread(sock, port, 0, NULL, identd_handler, NULL); identd = sock; return 0; }
void nap_chat_start(int snum) { GetFile *gf; SocketList *s; if (!(s = get_socket(snum)) || !(gf = (GetFile *)s->info)) { put_it("error get_socket(%d)", snum); nap_finished_file(snum, PREMATURE_FINISH); return; } if (gf->deleted) { if (gf->write != -1) close(gf->write); gf->write = -1; if (gf->deleted++ > 5) close_socketread(snum); return; } if ((gf->flags & NAP_CHAT) == NAP_CHAT) { /* we need to accept the connection here. */ struct sockaddr_in remaddr; int sra = sizeof(struct sockaddr_in); int sock = -1; if ((sock = my_accept(snum, (struct sockaddr *) &remaddr, &sra)) > -1) { set_keepalive(sock); gf->port = ntohs(remaddr.sin_port); add_socketread(sock, gf->port, 0, inet_ntoa(remaddr.sin_addr), nap_chat, NULL); set_socketinfo(sock, gf); s->info = NULL; gf->flags = NAP_CHAT_CONNECTED; gf->socket = sock; malloc_strcpy(&gf->ip, inet_ntoa(remaddr.sin_addr)); say("DCC CHAT to %s [%s:%d] established", gf->nick, gf->ip, gf->port); gf->starttime = now; } close_socketread(snum); return; } }
void query_q_server(char *server, unsigned short port, int game) { char buffer[16]; struct sockaddr_in qsock; struct hostent *he; querying = 1; /* look up our quakeserver address */ if ((he = gethostbyname(server)) == NULL) { put_it("unknown host: %s", server); close(qfd); querying = 0; return; } qfd = connect_by_number(server, &port, SERVICE_CLIENT, PROTOCOL_UDP, 1); memset(buffer, 0, sizeof(buffer)); memset(&qsock, 0, sizeof(struct sockaddr_in)); if(game == 3) strcpy(buffer, "\xFF\xFF\xFF\xFFgetstatus"); else strcpy(buffer, "\xFF\xFF\xFF\xFFstatus"); qsock.sin_family = AF_INET; qsock.sin_port = htons(port); qsock.sin_addr = *((struct in_addr *)he->h_addr); put_it("Sending status request to %d.%d.%d.%d...", (unsigned char) he->h_addr_list[0][0], (unsigned char) he->h_addr_list[0][1], (unsigned char) he->h_addr_list[0][2], (unsigned char) he->h_addr_list[0][3]); /* send our information to the quake server */ sendto(qfd, buffer, strlen(buffer), 0, (struct sockaddr *)&qsock, sizeof(struct sockaddr)); gettimeofday(&q_tv, NULL); strncpy(q_server, server, 256); q_type = game; add_socketread(qfd, port, 0, server, q_timer, NULL); add_sockettimeout(qfd, 5, q_timeout); }
int toc_add_input_stream(int fd,int (*func)(int)) { sock_read_id = add_socketread(fd, 0, 0, "bleh", func, func); return 1; }