From 4440a86cfa359b8e40a484a2cd46d33db5455d8a Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Mon, 25 May 2020 20:09:04 +0200 Subject: Initial --- irc/c_bsd.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 irc/c_bsd.c (limited to 'irc/c_bsd.c') diff --git a/irc/c_bsd.c b/irc/c_bsd.c new file mode 100644 index 0000000..25bbd83 --- /dev/null +++ b/irc/c_bsd.c @@ -0,0 +1,149 @@ +/************************************************************************ + * IRC - Internet Relay Chat, irc/c_bsd.c + * Copyright (C) 1990, Jarkko Oikarinen and + * University of Oulu, Computing Center + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef lint +static char rcsid[] = "@(#)$Id: c_bsd.c,v 1.5 1998/12/13 00:02:35 kalt Exp $"; +#endif + +#include "os.h" +#include "c_defines.h" +#define C_BSD_C +#include "c_externs.h" +#undef C_BSD_C + +#ifdef AUTOMATON +#ifdef DOCURSES +#undef DOCURSES +#endif +#ifdef DOTERMCAP +#undef DOTERMCAP +#endif +#endif /* AUTOMATON */ + +#define STDINBUFSIZE (0x80) + +int client_init(host, portnum, cptr) +char *host; +int portnum; +aClient *cptr; +{ + int sock; + static struct hostent *hp; + static struct SOCKADDR_IN server; + + sock = socket(AFINET, SOCK_STREAM, 0); + if (sock < 0) { + perror("opening stream socket"); + exit(1); + } + server.SIN_FAMILY = AFINET; + + if (isdigit(*host)) +#ifdef INET6 + { + if(!inet_pton(AF_INET6, host, server.sin6_addr.s6_addr)) + bcopy(minus_one, server.sin6_addr.s6_addr, IN6ADDRSZ); + } +#else + server.sin_addr.s_addr = inetaddr(host); +#endif + else { +#ifdef INET6 + res_init(); + _res.options|=RES_USE_INET6; +#endif + hp = gethostbyname(host); + if (hp == 0) { + fprintf(stderr, "%s: unknown host\n", host); + exit(2); + } + bcopy(hp->h_addr, (char *)&server.SIN_ADDR, hp->h_length); + } + server.SIN_PORT = htons(portnum); + if (connect(sock, (SAP)&server, sizeof(server)) == -1) { + perror("irc"); + exit(1); + } + + cptr->acpt = cptr; + cptr->port = server.SIN_PORT; +#ifdef INET6 + bcopy(server.sin6_addr.s6_addr, cptr->ip.s6_addr, IN6ADDRSZ); +#else + cptr->ip.s_addr = server.sin_addr.s_addr; +#endif + return(sock); +} + +void client_loop(sock) +int sock; +{ + int i = 0, size, pos; + char apubuf[STDINBUFSIZE+1]; + fd_set ready; + + do { + if (sock < 0 || QuitFlag) + return; + FD_ZERO(&ready); + FD_SET(sock, &ready); + FD_SET(0, &ready); +#ifdef DOCURSES + if (termtype == CURSES_TERM) + move(LINES-1,i); refresh(); +#endif +#ifdef DOTERMCAP + if (termtype == TERMCAP_TERM) + tcap_move (-1, i); +#endif + if (select(32, (SELECT_FDSET_TYPE *)&ready, 0, 0, NULL) < 0) { +/* perror("select"); */ + continue; + } + if (FD_ISSET(sock, &ready)) { + if ((size = read(sock, apubuf, STDINBUFSIZE)) < 0) + perror("receiving stream packet"); + if (size <= 0) { + close(sock); + return; + } + dopacket(&me, apubuf, size); + } +#ifndef AUTOMATON + if (FD_ISSET(0, &ready)) { + if ((size = read(0, apubuf, STDINBUFSIZE)) < 0) { + putline("FATAL ERROR: End of stdin file !"); + return; + } + for (pos = 0; pos < size; pos++) { + i=do_char(apubuf[pos]); +#ifdef DOCURSES + if (termtype == CURSES_TERM) + move(LINES-1, i); +#endif +#ifdef DOTERMCAP + if (termtype == CURSES_TERM) + tcap_move(-1, i); +#endif + } + } +#endif /* AUTOMATON */ + } while (1); +} -- cgit v1.2.3