aboutsummaryrefslogtreecommitdiffstats
path: root/mail2.c
diff options
context:
space:
mode:
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2004-05-25 19:47:12 +0000
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2004-05-25 19:47:12 +0000
commit1c10cacd115707162f03422294fbcb1363016615 (patch)
tree7782c307354efaa1635cf4c5023f073312c02a86 /mail2.c
parent9cc7535e569f892aac0e817fe6be3c0482c80cd0 (diff)
downloadlcd4linux-1c10cacd115707162f03422294fbcb1363016615.tar.gz
[lcd4linux @ 2004-05-25 19:47:11 by reinelt]
Status updated obsolete files removed git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@433 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
Diffstat (limited to 'mail2.c')
-rw-r--r--mail2.c537
1 files changed, 0 insertions, 537 deletions
diff --git a/mail2.c b/mail2.c
deleted file mode 100644
index 63cc604..0000000
--- a/mail2.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/* $Id: mail2.c,v 1.13 2004/03/03 03:47:04 reinelt Exp $
- *
- * mail: pop3, imap, news functions
- *
- * Copyright 2001 Leopold Tötsch <lt@toetsch.at>
- *
- * This file is part of LCD4Linux.
- *
- * LCD4Linux 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.
- *
- * LCD4Linux 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: mail2.c,v $
- * Revision 1.13 2004/03/03 03:47:04 reinelt
- * big patch from Martin Hejl:
- * - use qprintf() where appropriate
- * - save CPU cycles on gettimeofday()
- * - add quit() functions to free allocated memory
- * - fixed lots of memory leaks
- *
- * Revision 1.12 2004/01/30 20:57:56 reinelt
- * HD44780 patch from Martin Hejl
- * dmalloc integrated
- *
- * Revision 1.11 2004/01/29 04:40:02 reinelt
- * every .c file includes "config.h" now
- *
- * Revision 1.10 2004/01/09 04:16:06 reinelt
- * added 'section' argument to cfg_get(), but NULLed it on all calls by now.
- *
- * Revision 1.9 2003/10/05 17:58:50 reinelt
- * libtool junk; copyright messages cleaned up
- *
- * Revision 1.8 2003/02/22 07:53:10 reinelt
- * cfg_get(key,defval)
- *
- * Revision 1.7 2002/12/05 19:23:01 reinelt
- * fixed undefined operations found by gcc3
- *
- * Revision 1.6 2001/09/12 06:17:22 reinelt
- * *** empty log message ***
- *
- * Revision 1.5 2001/09/12 05:58:16 reinelt
- * fixed bug in mail2.c
- *
- * Revision 1.4 2001/03/16 09:28:08 ltoetsch
- * bugfixes
- *
- * Revision 1.3 2001/03/15 14:25:05 ltoetsch
- * added unread/total news
- *
- * Revision 1.2 2001/03/15 11:10:53 ltoetsch
- * added quit/logout to pop/imap
- *
- * Revision 1.1 2001/03/14 13:19:29 ltoetsch
- * Added pop3/imap4 mail support
- *
- *
- * Exported Functions:
- *
- * int Mail_pop_imap_news(char *mbox, int *total_mails, int *unseen);
- * returns -1 on error, 0 on success
- *
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <malloc.h>
-#include <errno.h>
-
-#include "debug.h"
-#include "cfg.h"
-#include "socket.h"
-
-#ifdef WITH_DMALLOC
-#include <dmalloc.h>
-#endif
-
-#define PROTO_UNKNOWN -1
-#define PROTO_POP3 110
-#define PROTO_NNTP 119
-#define PROTO_IMAP4 143
-
-/*
- * parse_proto()
- *
- * parse a MailboxN entry in 's' as
- *
- * proto:[user[:pass]@]machine[:port][/dir]
- *
- * 's' get's destroyed
- * returns 0 on success, -1 on error
- *
- */
-
-static int parse_proto(char *s, int *proto, char **user, char **pass,
- char **machine, int *port, char **dir)
-{
- struct
- {
- char *prefix;
- int proto;
- }
- protos[] =
- {
- { "pop3:", PROTO_POP3 },
- { "nntp:", PROTO_NNTP },
- { "imap4:", PROTO_IMAP4 },
- };
- int i;
- char *p, *q;
- static char empty[] = "";
- static char INBOX[] = "INBOX";
-
- *proto = *port = PROTO_UNKNOWN;
- for (i=0; i< sizeof(protos)/sizeof(protos[0]); i++)
- {
- if (memcmp(s, protos[i].prefix, strlen(protos[i].prefix)) == 0)
- {
- *proto = *port = protos[i].proto;
- break;
- }
- }
- if (*proto == PROTO_UNKNOWN)
- return -1;
-
- p = s + strlen(protos[i].prefix);
- /*
- * this might fail if user or pass contains a '/'
- *
- */
- if ((q = strchr(p, '/')) != NULL)
- {
- /* /dir */
- *dir = q + 1;
- *q = '\0';
- }
- else
- *dir = empty;
-
- if ((q = strchr(p, '@')) != NULL)
- {
- /* user, pass is present */
- *machine = q + 1;
- *q = '\0';
- *user = p;
- if ((q = strchr(p, ':')) != NULL)
- {
- /* user[:pass] */
- *q = '\0';
- *pass = q+1;
- }
- else
- *pass = empty;
- }
- else
- {
- *machine = p;
- *user = *pass = empty;
- }
-
- if ((q = strchr(*machine, ':')) != NULL)
- {
- /* machine[:pass] */
- *q = '\0';
- *port = atoi(q+1);
- if (*port <= 0 || *port >= 0xffff)
- return -1;
- }
- if (!**machine)
- return -1;
- if (*proto == PROTO_POP3 && **dir)
- return -1;
- if (*proto == PROTO_IMAP4 && !**dir)
- *dir = INBOX;
- return 0;
-}
-
-
-/* write buffer, compare with match */
-
-#define BUFLEN 256
-static int wr_rd(int fd, char *buf, char *match,
- char *err, char *machine, int port)
-{
- int n;
- n = write_socket(fd, buf);
- if (n <= 0)
- {
- error("Couldn't write to %s:%d (%s)", machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- n = read_socket_match(fd, buf, BUFLEN-1, match);
- if (n <= 0)
- {
- error("%s %s:%d (%s)", err, machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- return n;
-}
-
-static int check_nntp(char *user, char *pass, char *machine,
- int port, char *dir, int *total, int *unseen)
-{
- int fd;
- int n;
- char buf[BUFLEN];
- char line[BUFLEN];
- FILE *fp;
- int groups;
- int err;
- int totg, unsg;
- int first;
- char *s;
-
- *total = 0;
- *unseen = 0;
-
- strcpy(buf, (s=cfg_get(NULL, "Newsrc", ".newsrc")));
- if (*buf == 0 || ((fp = fopen(buf, "r")) == NULL)) {
- error("Couldn't open .newsrc-file '%s'", buf);
- free(s);
- return -1;
- }
- free(s);
- fd = open_socket(machine, port);
- if (fd < 0)
- {
- error("Couldn't connect to %s:%d (%s)", machine, port, strerror(errno));
- fclose(fp);
- return -1;
- }
- n = read_socket_match(fd, buf, BUFLEN-1, "20"); /* server ready */
- if (n <= 0) {
- error("Server doesn't respond %s:%d (%s)", machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- /* do auth if necessary, this is NOT TESTED */
- if (*user) {
- sprintf(buf, "AUTHINFO USER %s\r\n", user);
- if (wr_rd(fd, buf, "381", "No AUTH required?", machine, port) <= 0)
- return -1;
- if (*pass)
- {
- sprintf(buf, "AUTHINFO PASS %s\r\n", pass);
- if (wr_rd(fd, buf, "281", "Wrong PASS?", machine, port) <= 0)
- return -1;
- }
- }
- // Fixme: this is badbadbadbad
- sleep(2); /* wait for newsserver to read groupinfo */
- groups = 0;
- err = 0;
- totg = unsg = 0; /* total, unseen */
- while (fgets(line, sizeof(line)-1, fp) && err < 5) {
- char group[256];
- char *p;
- int smin, smax, lmin, lmax;
-
- if (sscanf(line, "%255[^:]:", group) != 1) {
- error("Couldn't read group in '%s'", line);
- err++;
- continue;
- }
- if ((p=strchr(group,':')) != NULL)
- *p='\0';
-
- /* check dir if it matches group */
- if (*dir && strcmp(dir, group))
- continue;
-
- sprintf(buf, "GROUP %s\r\n", group);
- if (wr_rd(fd, buf, "211", "Wrong Group", machine, port) <= 0) {
- err++;
- continue;
- }
- /* answer 211 total smin smax group: */
- sscanf(buf, "211 %*d %d %d", &smin, &smax);
- debug("nntp: %s: smin=%d smax=%d", group, smin, smax);
- totg += smax-smin-1;
- p = strchr(line, ':');
- p++;
- first = 1;
- while (1) {
- lmin = strtol(p, &p, 10);
- if (*p == '-')
- lmax = strtol(p+1, &p, 10);
- else
- lmax=lmin;
- debug("nntp: %s: lmin=%d lmax=%d", group, lmin, lmax);
- if (smax >= lmax) { /* server has more articles */
- if (first)
- unsg += smax - lmax;
- else
- unsg -= lmax-lmin+1;
- first = 0;
- }
- else /* local has higher article ??? */
- break;
- if (*p == ',')
- p++;
- else
- break;
- }
- } /* while fp */
- fclose(fp);
- strcpy(buf, "QUIT\r\n");
- wr_rd(fd, buf, "2", "Quit", machine, port);
- close(fd);
- *unseen = unsg;
- *total = totg;
- return 0;
-}
-
-
-static int check_imap4(char *user, char *pass, char *machine,
- int port, char *dir, int *total, int *unseen)
-{
- int fd = open_socket(machine, port);
- int n;
- char buf[BUFLEN];
- char *p;
-
- *total=0;
- *unseen = 0;
-
- if (fd < 0)
- {
- error("Couldn't connect to %s:%d (%s)", machine, port, strerror(errno));
- return -1;
- }
- n = read_socket_match(fd, buf, BUFLEN-1, "* OK");
- if (n <= 0) {
- error("Server doesn't respond %s:%d (%s)", machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- sprintf(buf, ". LOGIN %s %s\r\n", user, pass);
- if (wr_rd(fd, buf, ". OK", "Wrong User/PASS?", machine, port) <= 0)
- return -1;
- sprintf(buf, ". STATUS %s (MESSAGES UNSEEN)\r\n", dir);
- if (wr_rd(fd, buf, "*", "Wrong dir?", machine, port) <= 0)
- return -1;
- if ((p = strstr(buf, "MESSAGES")) != NULL)
- sscanf(p, "%*s %d", total);
- else {
- error("Server doesn't provide MESSAGES (%s)", machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- if ((p = strstr(buf, "UNSEEN")) != NULL)
- sscanf(p, "%*s %d", unseen);
- else {
- error("Server doesn't provide UNSEEN (%s)", machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- strcpy(buf,". LOGOUT\r\n");
- wr_rd(fd, buf, "", "LOGOUT", machine, port);
- close(fd);
- return 0;
-}
-
-static int check_pop3(char *user, char *pass, char *machine,
- int port, int *total, int *unseen)
-{
- int fd = open_socket(machine, port);
- int n;
- char buf[BUFLEN];
-
- *total=0;
- *unseen=0;
-
- if (fd < 0)
- {
- error("Couldn't connect to %s:%d (%s)", machine, port, strerror(errno));
- return -1;
- }
- n = read_socket_match(fd, buf, BUFLEN-1, "+OK");
- if (n <= 0) {
- error("Server doesn't respond %s:%d (%s)", machine, port, strerror(errno));
- close(fd);
- return -1;
- }
- if (*user)
- {
- sprintf(buf, "USER %s\r\n", user);
- if (wr_rd(fd, buf, "+OK", "Wrong USER?", machine, port) <= 0)
- return -1;
- }
- if (*pass)
- {
- sprintf(buf, "PASS %s\r\n", pass);
- if (wr_rd(fd, buf, "+OK", "Wrong PASS?", machine, port) <= 0)
- return -1;
- }
- sprintf(buf, "STAT\r\n");
- if (wr_rd(fd, buf, "+OK", "Wrong STAT answer?", machine, port) <= 0)
- return -1;
- sscanf(buf, "+OK %d", total);
- if (*total) {
- sprintf(buf, "LAST\r\n");
- if (wr_rd(fd, buf, "+OK", "Wrong LAST answer?", machine, port) <= 0)
- return -1;
- sscanf(buf, "+OK %d", unseen);
- *unseen = *total - *unseen;
- }
- strcpy(buf, "QUIT\r\n");
- wr_rd(fd, buf, "+OK", "Quit", machine, port);
- close(fd);
- return 0;
-}
-
-int Mail_pop_imap_news(char *s, int *total, int *unseen)
-{
- int proto, port, ret;
- char *user, *pass, *machine, *dir, *ds;
-
- ds = strdup(s);
- if (ds == NULL)
- {
- error("Out of mem");
- return -1;
- }
- ret = parse_proto(ds, &proto, &user, &pass,
- &machine, &port, &dir) ;
- if (ret < 0)
- error("Not a pop3/imap4 mailbox");
- else
- ret = (proto == PROTO_POP3) ?
- check_pop3(user, pass, machine, port, total, unseen) :
- (proto == PROTO_NNTP) ?
- check_nntp(user, pass, machine, port, dir, total, unseen) :
- check_imap4(user, pass, machine, port, dir, total, unseen);
- free(ds);
- return ret;
-}
-
-#ifdef STANDALONE
-
-/*
- * test parse_proto with some garbage
- *
- */
-
-int foreground = 1;
-int debugging = 3;
-
-/*
- * for STANDALONE tests, disable Text driver and
- *
- * cc -DSTANDALONE mail2.c socket.c debug.c -g -Wall -o mail2
- *
- */
-
-#ifdef CHECK_PARSER
-
-static int test(char *s)
-{
- int ret;
- int proto, port;
- char *user, *pass, *machine, *dir, *ds;
-
- ds = strdup(s);
- ret = parse_proto(ds, &proto, &user, &pass,
- &machine, &port, &dir) ;
- printf("parse_proto(%s) ret=%d\n", s, ret);
- if (!ret)
- printf(
- "\tproto='%d'\n"
- "\tuser='%s'\n"
- "\tpass='%s'\n"
- "\tmachine='%s'\n"
- "\tport='%d'\n"
- "\tdir='%s'\n",
- proto,user,pass,machine,port,dir);
- free(ds);
- return ret;
-}
-#endif
-
-int main(int argc, char *argv[])
-{
-
-#ifdef CHECK_PARSER
- int i, ret;
- /* proto:[user[:pass]@]machine[:port][/dir] */
- char *t[] =
- {
- "pop3:sepp:Geheim@Rechner:123",
- "pop3:sepp@Rechner",
- "pop3:Rechner:123",
- "imap4:sepp:Geheim@Rechner/dir@/:pfad",
- "imap4:sepp:Geheim@Rechner",
- "imap4sepp:Geheim@Rechner/dir@/:pfad",
- "imap4:sepp:Geheim/Rechner/dir@/:pfad",
- "pop3:sepp@:",
- 0
- };
-
- ret = 0;
- if (argc > 1)
- ret |= test(argv[1]);
- else
- for (i = 0; t[i]; i++)
- ret |= test(t[i]);
- return ret;
-# else
-
- int total = -1, unseen = -1;
- char *mbx = "imap4:user:pass@server/folder/file";
- int ret = Mail_pop_imap(mbx, &total, &unseen);
- printf("ret = %d, total = %d unseen = %d\n", ret, total, unseen);
- return ret;
-
-# endif
-}
-
-#endif