From c79da23905ffae3dafcdfe1bab8d7afb053f47b8 Mon Sep 17 00:00:00 2001 From: ltoetsch <> Date: Wed, 14 Mar 2001 13:19:29 +0000 Subject: [lcd4linux @ 2001-03-14 13:19:29 by ltoetsch] Added pop3/imap4 mail support --- socket.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 socket.c (limited to 'socket.c') diff --git a/socket.c b/socket.c new file mode 100644 index 0000000..fa57b53 --- /dev/null +++ b/socket.c @@ -0,0 +1,151 @@ +/* $Id: socket.c,v 1.1 2001/03/14 13:19:29 ltoetsch Exp $ + * + * simple socket functions + * + * Copyright 2001 by Leopold Tötsch (lt@toetsch.at) + * + * 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 2, 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. + * + * + * $Log: socket.c,v $ + * Revision 1.1 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * + * + */ + +/* + * Exported Functions: + * + * int open_socket(char *machine, int port); + * + * open and connect to socket on machine:port + * returns fd on success or -1 on error + * + * + * int read_socket(int fd, char *buf, size_t size); + * + * read maximum size chars into buf + * returns n byte read, 0 on timeout, -1 on error + * + * + * int read_socket_match(int fd, char *buf, size_t size, char *match); + * + * read maximum size chars into buf and check if the start of line + * matches 'match' + * returns n on successful match, 0 on timeout/mismatch, -1 on error + * + * + * int write_socket(int fd, char *string); + * + * write string to socket fd + * returns n byte written, -1 on error + * + * with debuglevel 3, traffic on socket is logged + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" + +#define TIMEOUT 2 /* 2 seconds timeout */ + +int open_socket(char *machine, int port) +{ + struct hostent *addr; + struct sockaddr_in s; + int fd; + + addr = gethostbyname (machine); + if (addr) + memcpy (&s.sin_addr, addr->h_addr, sizeof (struct in_addr)); + else + return -1; + + fd = socket (AF_INET, SOCK_STREAM, 0); + if (fd < 0) + return -1; + + s.sin_family = AF_INET; + s.sin_port = htons (port); + + if (connect (fd, (struct sockaddr *)&s, sizeof (s)) < 0) + return -1; + return fd; +} + +int read_socket(int fd, char *buf, size_t size) +{ + fd_set readfds; + struct timeval tv; + int n = 0; + + FD_ZERO(&readfds); + FD_SET(fd, &readfds); + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + + if (select(fd+1, &readfds, NULL, NULL, &tv) > 0) + n = read(fd, buf, size); + if (n >= 0) + buf[n] = '\0'; + else + buf[0] = '\0'; + sockdebug("<(%d),%s", n, buf); + return n; +} + +int read_socket_match(int fd, char *buf, size_t size, char *match) +{ + int n = read_socket(fd, buf, size); + int len; + if (n <= 0) + return n; + len = strlen(match); + if (n >= len && memcmp(buf, match, len) == 0) + return n; + return 0; +} + +static char *del_pass(char *s) +{ + char *p; + /* del pop3 pass from log */ + if (memcmp(s, "PASS ", 5) == 0) + for (p = s+5; *p && *p != '\r'; p++) + *p = '*'; + /* del imap4 pass from log */ + else if (memcmp(s, ". LOGIN", 7) == 0) + for (p = s + strlen(s)-3 ; p > s && *p != ' '; p--) + *p = '*'; + return s; +} + +int write_socket(int fd, char *buf) +{ + int n = write(fd, buf, strlen(buf)); + sockdebug(">(%d),%s", n, del_pass(buf)); + return n; +} + -- cgit v1.2.3