/* * This part was hacked by Harald Kipp * * Bug reports should be sent to * * harald@os2point.ping.de * harald@haport.sesam.com * Fido: 2:2448/434 * * This module contains the tcp socket interface. * */ #define OS2 #include #include #include #include #undef min #include #include #include #include #include #include #include #include static int flog = 0; /************************************************************************/ /* */ /************************************************************************/ void so_setlog(int f) { flog |= f; } /************************************************************************/ /* */ /************************************************************************/ static char *errmsg(int code) { static char ebuf[6 + 5 + 1]; if (code > sys_nerr || code < 0) { sprintf(ebuf, "Error %d", code); return ebuf; } else return sys_errlist[code]; } /************************************************************************/ /* given a host name (either name or internet address) and service name */ /* (or port number) (both in ASCII), give us a TCP connection to the */ /* requested service at the requested host (or give us FAIL). */ /************************************************************************/ int get_tcp_conn(char *host, char *serv) { int sock; int port; struct sockaddr_in sadr; struct hostent *hostnm; struct servent *sp; if ((hostnm = gethostbyname(host)) == NULL) { lprintf("Unknown host: %s", host); return (-1); } if(isdigit(*serv)) port = htons(atoi(serv)); else if ((sp = getservbyname(serv, "tcp")) != NULL) { port = sp->s_port; } else { lprintf("Unknown service: %s, using default port 119", serv); port = htons(119); } sadr.sin_family = AF_INET; sadr.sin_port = port; sadr.sin_addr.s_addr = *((unsigned long *)(hostnm -> h_addr)); if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { lprintf("socket(): %s", errmsg(errno)); return (-1); } if (connect(sock, (struct sockaddr *) & sadr, sizeof(sadr)) < 0) { int e_save = errno; fprintf(stderr, "%s [%s] port %u: %s\n", host, inet_ntoa(sadr.sin_addr), port, errmsg(errno)); soclose(sock); errno = e_save; return (-1); } if(serv); return (sock); } /************************************************************************/ /* */ /************************************************************************/ int so_puts(int s, char *line) { int rc; rc = send(s, line, strlen(line), 0); if(rc == -1) lprintf("send(): Error %d", errno); else if(flog & ENABLE_SLOG) { char *cp = strchr(line, '\r'); if(cp) *cp = '\0'; if(*line) lprintf("<'%s'", line); if(cp) *cp = '\r'; } return (rc); } /************************************************************************/ /* */ /************************************************************************/ int _cdecl so_printf(int s, char *format,...) { int rc; char achBuf[BUFSIZ]; va_list marker; va_start(marker, format); vsprintf(achBuf, format, marker); rc = so_puts(s, achBuf); va_end(marker); return (rc); } /************************************************************************/ /* */ /* */ /************************************************************************/ int recv_line(int s, char *pline) { register int rc; register char *cp = pline; char cl = '\0'; int cc = 0; while ((rc = recv(s, cp, 1, 0)) > 0) { if (*cp == '\n') { if(cl == '\r') cp--; else cc++; *cp = '\0'; break; } cl = *cp++; if(++cc >= BUFSIZ) { *cp = '\0'; break; } } if(rc < 0) { if(errno != 54) lprintf("recv(): Error %d", errno); else lprintf("connection broken"); } else if(rc && (flog & ENABLE_RLOG)) lprintf(">'%s'", pline); else if(!rc) lprintf("client disconnects"); return((rc > 0) ? cc : rc); } /************************************************************************/ /* */ /* */ /************************************************************************/ int recv_bchar(int s, char *ch) { static char *buffer = NULL; static int ibuf = 0; static int pbuf = 0; if(buffer == NULL) buffer = malloc(2048); if(ibuf == pbuf) { pbuf = 0; if((ibuf = recv(s, buffer, 2048, 0)) <= 0) { free(buffer); buffer = NULL; return(ibuf); } } *ch = buffer[pbuf++]; return(1); } int recv_bline(int s, char *pline) { register int rc; register char *cp = pline; char cl = '\0'; int cc = 0; while ((rc = recv_bchar(s, cp)) > 0) { if (*cp == '\n') { if(cl == '\r') cp--; else cc++; *cp = '\0'; break; } cl = *cp++; if(++cc >= BUFSIZ) { *cp = '\0'; break; } } if(rc < 0) { if(errno != 54) lprintf("recv(): Error %d", errno); else lprintf("connection broken"); } else if(rc && (flog & ENABLE_RLOG)) lprintf(">'%s'", pline); else if(!rc) lprintf("client disconnects"); return((rc > 0) ? cc : rc); }