From dfc23a8138bb7aa72043d754170c1c48e66485c0 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 git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@117 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- Makefile.am | 4 +- Makefile.in | 9 +- NEWS | 5 + README | 25 +++- TODO | 15 ++- configure | 201 ++++++++++++++-------------- debug.h | 6 +- lcd4linux.conf.sample | 19 +++ mail.c | 31 ++++- mail.h | 9 +- mail2.c | 358 ++++++++++++++++++++++++++++++++++++++++++++++++++ parser.c | 6 +- parser.h | 7 +- processor.c | 15 ++- socket.c | 151 +++++++++++++++++++++ socket.h | 40 ++++++ 16 files changed, 773 insertions(+), 128 deletions(-) create mode 100644 mail2.c create mode 100644 socket.c create mode 100644 socket.h diff --git a/Makefile.am b/Makefile.am index cb11a3b..4e0c311 100644 --- a/Makefile.am +++ b/Makefile.am @@ -27,7 +27,9 @@ udelay.c udelay.h \ display.c display.h \ pixmap.c pixmap.h \ fontmap.c fontmap.h \ -exec.c exec.h +exec.c exec.h \ +mail2.c \ +socket.c socket.h EXTRA_lcd4linux_SOURCES= \ acconfig.h \ diff --git a/Makefile.in b/Makefile.in index 65cd610..852c5fe 100644 --- a/Makefile.in +++ b/Makefile.in @@ -76,7 +76,7 @@ lcd4linux_LDFLAGS = $(X_LIBS) lcd4linux_LDADD = @DRIVERS@ @DRVLIBS@ lcd4linux_DEPENDENCIES = @DRIVERS@ -lcd4linux_SOURCES = lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h battery.c battery.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h fontmap.c fontmap.h exec.c exec.h +lcd4linux_SOURCES = lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h battery.c battery.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h fontmap.c fontmap.h exec.c exec.h mail2.c socket.c socket.h EXTRA_lcd4linux_SOURCES = acconfig.h BeckmannEgle.c Crystalfontz.c Crystalfontz.h HD44780.c MatrixOrbital.c PalmPilot.c Raster.c SIN.c Skeleton.c XWindow.c Text.c @@ -101,7 +101,7 @@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ lcd4linux_OBJECTS = lcd4linux.o debug.o cfg.o lock.o parser.o \ processor.o system.o isdn.o mail.o seti.o battery.o filter.o udelay.o \ -display.o pixmap.o fontmap.o exec.o +display.o pixmap.o fontmap.o exec.o mail2.o socket.o CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) @@ -120,8 +120,9 @@ DEP_FILES = .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/HD44780.P \ .deps/Skeleton.P .deps/Text.P .deps/XWindow.P .deps/battery.P \ .deps/cfg.P .deps/debug.P .deps/display.P .deps/exec.P .deps/filter.P \ .deps/fontmap.P .deps/isdn.P .deps/lcd4linux.P .deps/lock.P \ -.deps/mail.P .deps/parser.P .deps/pixmap.P .deps/processor.P \ -.deps/seti.P .deps/system.P .deps/udelay.P +.deps/mail.P .deps/mail2.P .deps/parser.P .deps/pixmap.P \ +.deps/processor.P .deps/seti.P .deps/socket.P .deps/system.P \ +.deps/udelay.P SOURCES = $(lcd4linux_SOURCES) $(EXTRA_lcd4linux_SOURCES) OBJECTS = $(lcd4linux_OBJECTS) diff --git a/NEWS b/NEWS index 24bccfb..42236e7 100644 --- a/NEWS +++ b/NEWS @@ -40,3 +40,8 @@ lcd4linux-0.98 - seti@home client: new tokens 'hc' (% completed) and 'ht' (cpu time needed) - simple web-server driver (see README.Webinterface) + +- mail suport for pop3 and imap4, token 'u1' ..'u9' show unseen mail + (which is propably incorrect for normal mbox) + +- added another verbose level (-vvv) for debugging socket traffic diff --git a/README b/README index ed2fe3f..70eeba1 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ # -# $Id: README,v 1.17 2001/03/13 07:41:22 reinelt Exp $ +# $Id: README,v 1.18 2001/03/14 13:19:29 ltoetsch Exp $ # This is the README file for lcd4linux @@ -8,8 +8,8 @@ This is the README file for lcd4linux INTRODUCTION lcd4linux is a small program that reads various information from the kernel -(and probably from other subsystems, especially ISDN) and displays them on a -LCD. +(and from other subsystems, especially ISDN) and displays them on a LCD or +other display device. It supports displaying text values and different types of bars: Horizontal and vertical bars, logarithmic bars, split bars (two independent bars in one row). @@ -37,6 +37,8 @@ lcd4linux [-c key=val] [-F] [-f config-file] [-o output] [-q] [-v] suppress startup splash screen with '-q' generate info messages with '-v' generate debugging messages with '-vv' + debug socket traffic too, with '-vvv' + DIAGNOSTICS @@ -154,6 +156,18 @@ Data-specific options: Min_x1 ..9 min value for bars (default 0) battery: Battwarning 10 (default 10) + + Mailbox: + The option string may be a plain mbox file or a pop3/imap4 server + string with the following format: + + pop3:[user[:pass]@]machine[:port] + imap4:[user[:pass]@]machine[:port][/dir] + + Port defaults to 110 and 143 respectively. + If /dir is not given, INBOX is assumed. + + Delay_e1..e9 delay in seconds for querying the MailboxN (default 5) Driver-specific options: @@ -228,9 +242,10 @@ Tokens: 'bp', battery percentage (APM by now) 'bs', battery status ('=' = online, '+' = charging, '-' discharging) 'bd', battery duration in s{econds}, m{ins}, h{ours} or d{ays} - 'e*', mails in mailbox 1-9, + 'e*', mails in mailbox 1-9, total mail + 'u*', mails in mailbox 1-9, unseen mail 'x*', output of command 1-9 Please have a look at lcd4linux.conf.sample, where you can find examples -of all options. +of all options and there usage. diff --git a/TODO b/TODO index 2cf451d..40707fc 100644 --- a/TODO +++ b/TODO @@ -50,9 +50,10 @@ will be done with the big config-rework 2001-03-07 Michael Reinelt use ppdev instead of ugly outb() -2001-03-09 Michael Reinelt -replace udelay() assembly loop with rdtsc (read time stamp counter) -at least try to.... +// 2001-03-09 Michael Reinelt +// replace udelay() assembly loop with rdtsc (read time stamp counter) +// at least try to.... +// done -mr 2001-03-09 Leo Tötsch read configuration file earlier (before forking) so that specific drivers @@ -62,5 +63,9 @@ There's a reason for forking that early, but I forgot... 2001-03-12 Michael Reinelt remove USE_OLD_UDELAY after wide testing of new udelay code -2001-03-12 Michael Reinelt -create a NEWS file with changes/enhancements of every release +// 2001-03-12 Michael Reinelt +// crate a NEWS file with changes/enhancements of every release +// done -mr + +2001-03-14 Leopold Toetsch +improve unseen for mbox (check Status:) diff --git a/configure b/configure index f8e0dbc..0344383 100755 --- a/configure +++ b/configure @@ -1,7 +1,7 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 +# Generated automatically using autoconf version 2.14 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation @@ -344,7 +344,7 @@ EOF verbose=yes ;; -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" + echo "configure generated by autoconf version 2.14" exit 0 ;; -with-* | --with-*) @@ -1680,6 +1680,7 @@ else /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname(); +char (*f)(); int main() { @@ -1689,12 +1690,12 @@ int main() { #if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) choke me #else -gethostbyname(); +f = gethostbyname; #endif ; return 0; } EOF -if { (eval echo configure:1698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else @@ -1715,7 +1716,7 @@ fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:1719: checking for gethostbyname in -lnsl" >&5 +echo "configure:1720: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1723,7 +1724,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1764,12 +1765,12 @@ fi # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 -echo "configure:1768: checking for connect" >&5 +echo "configure:1769: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else @@ -1813,7 +1815,7 @@ fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 -echo "configure:1817: checking for connect in -lsocket" >&5 +echo "configure:1819: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1821,7 +1823,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1856,12 +1858,12 @@ fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 -echo "configure:1860: checking for remove" >&5 +echo "configure:1862: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1891: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_remove=yes" else @@ -1905,7 +1908,7 @@ fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 -echo "configure:1909: checking for remove in -lposix" >&5 +echo "configure:1912: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1913,7 +1916,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1948,12 +1951,12 @@ fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 -echo "configure:1952: checking for shmat" >&5 +echo "configure:1955: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else @@ -1997,7 +2001,7 @@ fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 -echo "configure:2001: checking for shmat in -lipc" >&5 +echo "configure:2005: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2005,7 +2009,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2049,7 +2053,7 @@ fi # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 -echo "configure:2053: checking for IceConnectionNumber in -lICE" >&5 +echo "configure:2057: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2057,7 +2061,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2094,7 +2098,7 @@ fi echo $ac_n "checking which drivers to compile""... $ac_c" 1>&6 -echo "configure:2098: checking which drivers to compile" >&5 +echo "configure:2102: checking which drivers to compile" >&5 # Check whether --with-drivers or --without-drivers was given. if test "${with_drivers+set}" = set; then withval="$with_drivers" @@ -2285,12 +2289,12 @@ fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:2289: checking for ANSI C header files" >&5 +echo "configure:2293: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2298,7 +2302,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2302: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2306: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2315,7 +2319,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -2333,7 +2337,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -2354,7 +2358,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -2365,7 +2369,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2373: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -2393,12 +2397,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 -echo "configure:2397: checking for $ac_hdr that defines DIR" >&5 +echo "configure:2401: checking for $ac_hdr that defines DIR" >&5 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> @@ -2406,7 +2410,7 @@ int main() { DIR *dirp = 0; ; return 0; } EOF -if { (eval echo configure:2410: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2414: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else @@ -2431,7 +2435,7 @@ done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 -echo "configure:2435: checking for opendir in -ldir" >&5 +echo "configure:2439: checking for opendir in -ldir" >&5 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2439,7 +2443,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldir $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2472,7 +2476,7 @@ fi else echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 -echo "configure:2476: checking for opendir in -lx" >&5 +echo "configure:2480: checking for opendir in -lx" >&5 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2480,7 +2484,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lx $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2514,12 +2518,12 @@ fi fi echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 -echo "configure:2518: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo "configure:2522: checking for sys/wait.h that is POSIX.1 compatible" >&5 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2535,7 +2539,7 @@ wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } EOF -if { (eval echo configure:2539: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2543: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_sys_wait_h=yes else @@ -2559,17 +2563,17 @@ for ac_hdr in fcntl.h limits.h strings.h sys/ioctl.h sys/time.h syslog.h unistd. do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2563: checking for $ac_hdr" >&5 +echo "configure:2567: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2573: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2577: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2599,17 +2603,17 @@ for ac_hdr in sys/io.h asm/io.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2603: checking for $ac_hdr" >&5 +echo "configure:2607: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2613: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2617: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2639,17 +2643,17 @@ for ac_hdr in gd/gd.h gd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2643: checking for $ac_hdr" >&5 +echo "configure:2647: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2653: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2657: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2679,17 +2683,17 @@ for ac_hdr in net/if_ppp.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2683: checking for $ac_hdr" >&5 +echo "configure:2687: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2697: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2719,17 +2723,17 @@ for ac_hdr in asm/msr.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2723: checking for $ac_hdr" >&5 +echo "configure:2727: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2737: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2757,12 +2761,12 @@ done echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:2761: checking for working const" >&5 +echo "configure:2765: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2819: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -2832,21 +2836,21 @@ EOF fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:2836: checking for inline" >&5 +echo "configure:2840: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2854: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -2872,12 +2876,12 @@ EOF esac echo $ac_n "checking for pid_t""... $ac_c" 1>&6 -echo "configure:2876: checking for pid_t" >&5 +echo "configure:2880: checking for pid_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -2905,12 +2909,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2909: checking for size_t" >&5 +echo "configure:2913: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -2938,12 +2942,12 @@ EOF fi echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 -echo "configure:2942: checking whether time.h and sys/time.h may both be included" >&5 +echo "configure:2946: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2952,7 +2956,7 @@ int main() { struct tm *tp; ; return 0; } EOF -if { (eval echo configure:2956: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2960: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else @@ -2973,12 +2977,12 @@ EOF fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 -echo "configure:2977: checking whether struct tm is in sys/time.h or time.h" >&5 +echo "configure:2981: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2986,7 +2990,7 @@ int main() { struct tm *tp; tp->tm_sec; ; return 0; } EOF -if { (eval echo configure:2990: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2994: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else @@ -3007,12 +3011,12 @@ EOF fi echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6 -echo "configure:3011: checking for uid_t in sys/types.h" >&5 +echo "configure:3015: checking for uid_t in sys/types.h" >&5 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -3043,13 +3047,13 @@ fi if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 -echo "configure:3047: checking whether ${CC-cc} needs -traditional" >&5 +echo "configure:3051: checking whether ${CC-cc} needs -traditional" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP @@ -3067,7 +3071,7 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA @@ -3089,7 +3093,7 @@ echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6 fi echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 -echo "configure:3093: checking for 8-bit clean memcmp" >&5 +echo "configure:3097: checking for 8-bit clean memcmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3097,7 +3101,7 @@ else ac_cv_func_memcmp_clean=no else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3115: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_memcmp_clean=yes else @@ -3125,12 +3129,12 @@ echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6 test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -echo "configure:3129: checking return type of signal handlers" >&5 +echo "configure:3133: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3147,7 +3151,7 @@ int main() { int i; ; return 0; } EOF -if { (eval echo configure:3151: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3155: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else @@ -3168,12 +3172,12 @@ EOF for ac_func in gettimeofday putenv select socket strdup strerror strstr strtol uname do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3172: checking for $ac_func" >&5 +echo "configure:3176: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3311,7 +3316,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" + echo "$CONFIG_STATUS generated by autoconf version 2.14" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; diff --git a/debug.h b/debug.h index 44bac26..6db001b 100644 --- a/debug.h +++ b/debug.h @@ -1,4 +1,4 @@ -/* $Id: debug.h,v 1.2 2000/08/10 09:44:09 reinelt Exp $ +/* $Id: debug.h,v 1.3 2001/03/14 13:19:29 ltoetsch Exp $ * * debug messages * @@ -20,6 +20,9 @@ * * * $Log: debug.h,v $ + * Revision 1.3 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * * Revision 1.2 2000/08/10 09:44:09 reinelt * * new debugging scheme: error(), info(), debug() @@ -39,6 +42,7 @@ void message (int level, const char *format, ...); +#define sockdebug(args...) message (3, args) #define debug(args...) message (2, __FILE__ ": " args) #define info(args...) message (1, args) #define error(args...) message (0, args) diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index 6724650..a0870a7 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -105,8 +105,27 @@ Overload 2.0 Battwarning 10 SetiDir /etc/setiathome + +# normal local mbox Mailbox1 /var/spool/mail/michi +# POP3 mail @ machine +Mailbox2 pop3:user:pass@machine + +# IMAP4 mail folder @ machine +Mailbox3 imap4:user:pass@machine/folder + +# Full syntax of pop3/imap4 is: +# [user[:pass]@]machine[:port][/dir] +# +# display total/unseen mails of Mailbox3 +# Row6 "Mails %e3/%u3" + +# delay query of MailboxN in seconds (default = 5) +Delay_e1 5 +Delay_e2 20 +Delay_e3 20 + Sensor1 /proc/sys/dev/sensors/as99127f-i2c-0-2d/temp1 Sensor1_min 30 Sensor1_max 50 diff --git a/mail.c b/mail.c index 2986512..7621449 100644 --- a/mail.c +++ b/mail.c @@ -1,4 +1,4 @@ -/* $Id: mail.c,v 1.5 2001/03/13 08:34:15 reinelt Exp $ +/* $Id: mail.c,v 1.6 2001/03/14 13:19:29 ltoetsch Exp $ * * email specific functions * @@ -20,6 +20,9 @@ * * * $Log: mail.c,v $ + * Revision 1.6 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * * Revision 1.5 2001/03/13 08:34:15 reinelt * * corrected a off-by-one bug with sensors @@ -69,7 +72,7 @@ #include "debug.h" #include "mail.h" -int Mail (int index, int *num) +int Mail (int index, int *num, int *unseen) { FILE *fstr; char buffer[32]; @@ -89,7 +92,15 @@ int Mail (int index, int *num) if (index<0 || index>MAILBOXES) return -1; - if (time(NULL)==now[index]) return 0; // More then 1 second after last check + if (now[index] == 0) { /* not first time, to give faster a chance */ + now[index] = -1; + return 0; + } + if (now[index] > 0) { /* first time, immediately, else wait */ + sprintf(txt1, "Delay_e%d", index); + if (time(NULL)<=now[index]+atoi(cfg_get(txt1)?:"5")) + return 0; // More then 5/Delay_eX seconds after last check? + } time(&now[index]); // for Mailbox #index /* Build the filename from the config @@ -109,7 +120,15 @@ int Mail (int index, int *num) */ rc=stat(fnp1, &fst); if ( rc != 0 ) { - error ("Error getting stat of Mailbox%d", index ); + /* + is it pop3 or imap4? + */ + rc = Mail_pop_imap(fnp1, num, unseen); + if (rc == 0) + return 0; + else + cfgmbx[index] = FALSE; /* don't try again */ + error ("Error getting stat of Mailbox%d", index); return (-1); } if ( mbxlt[index] != fst.st_mtime ) { @@ -145,6 +164,10 @@ int Mail (int index, int *num) } } } + /* FIXME look at the Status of Mails */ + *unseen = v1 - mbxnum[index]; + if (*unseen < 0) + *unseen = 0; mbxnum[index]=v1; *num=v1; return (0); diff --git a/mail.h b/mail.h index 3cc8c62..8341220 100644 --- a/mail.h +++ b/mail.h @@ -1,4 +1,4 @@ -/* $Id: mail.h,v 1.2 2001/03/08 09:02:04 reinelt Exp $ +/* $Id: mail.h,v 1.3 2001/03/14 13:19:29 ltoetsch Exp $ * * email specific functions * @@ -20,6 +20,9 @@ * * * $Log: mail.h,v $ + * Revision 1.3 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * * Revision 1.2 2001/03/08 09:02:04 reinelt * * seti client cleanup @@ -34,6 +37,6 @@ #define MAILBOXES 9 -int Mail (int index, int *num); - +int Mail (int index, int *num, int *unseen); +int Mail_pop_imap(char *mbx, int *num, int *unseen); /* mail2.c */ #endif diff --git a/mail2.c b/mail2.c new file mode 100644 index 0000000..19b80c3 --- /dev/null +++ b/mail2.c @@ -0,0 +1,358 @@ +/* $Id: mail2.c,v 1.1 2001/03/14 13:19:29 ltoetsch Exp $ + * + * mail: pop3, imap 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: mail2.c,v $ + * Revision 1.1 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * + * + * Exported Functions: + * + * int Mail_pop_imap(char *mbox, int *total_mails, int *unseen); + * returns -1 on error, 0 on success + * + */ + +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "socket.h" + +#define PROTO_UNKNOWN -1 +#define PROTO_POP3 110 +#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 }, + { "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_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; + + 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; + } + 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]; + + 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; + } + close(fd); + return 0; +} + +int Mail_pop_imap(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) : + 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 diff --git a/parser.c b/parser.c index 3e16cdf..2e2f9a1 100644 --- a/parser.c +++ b/parser.c @@ -1,4 +1,4 @@ -/* $Id: parser.c,v 1.14 2001/03/13 08:34:15 reinelt Exp $ +/* $Id: parser.c,v 1.15 2001/03/14 13:19:29 ltoetsch Exp $ * * row definition parser * @@ -20,6 +20,9 @@ * * * $Log: parser.c,v $ + * Revision 1.15 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * * Revision 1.14 2001/03/13 08:34:15 reinelt * * corrected a off-by-one bug with sensors @@ -162,6 +165,7 @@ static SYMTAB Symtab[] = {{ "%", T_PERCENT, C_GENERIC, 0 }, { "bs", T_BATT_STAT, C_BATT, 0 }, { "bd", T_BATT_DUR, C_BATT, 0 }, { "e*", T_MAIL, C_MAIL, 0 }, + { "u*", T_MAIL_UNSEEN,C_MAIL, 0 }, { "s*", T_SENSOR, C_SENSOR, 1 }, { "x*", T_EXEC, C_EXEC, 1 }, { "", -1, 0 }}; diff --git a/parser.h b/parser.h index 7332b4c..6feba13 100644 --- a/parser.h +++ b/parser.h @@ -1,4 +1,4 @@ -/* $Id: parser.h,v 1.10 2001/03/07 18:10:21 ltoetsch Exp $ +/* $Id: parser.h,v 1.11 2001/03/14 13:19:29 ltoetsch Exp $ * * row definition parser * @@ -20,6 +20,9 @@ * * * $Log: parser.h,v $ + * Revision 1.11 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * * Revision 1.10 2001/03/07 18:10:21 ltoetsch * added e(x)ec commands * @@ -84,7 +87,7 @@ typedef enum { T_SETI_PRC, T_SETI_CPU, T_BATT_PERC, T_BATT_STAT, T_BATT_DUR, T_EXTENDED, - T_MAIL, + T_MAIL, T_MAIL_UNSEEN, T_SENSOR, T_EXEC } TOKEN; diff --git a/processor.c b/processor.c index 8676747..45eaff7 100644 --- a/processor.c +++ b/processor.c @@ -1,4 +1,4 @@ -/* $Id: processor.c,v 1.19 2001/03/13 08:34:15 reinelt Exp $ +/* $Id: processor.c,v 1.20 2001/03/14 13:19:29 ltoetsch Exp $ * * main data processing * @@ -20,6 +20,9 @@ * * * $Log: processor.c,v $ + * Revision 1.20 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * * Revision 1.19 2001/03/13 08:34:15 reinelt * * corrected a off-by-one bug with sensors @@ -152,7 +155,7 @@ struct { int usage, in, out, total, max, peak; } isdn; struct { int rx, tx, total, max, peak; } ppp; struct { int perc, stat; double dur; } batt; struct { double perc, cput; } seti; -struct { int num; } mail[MAILBOXES+1]; +struct { int num, unseen;} mail[MAILBOXES+1]; struct { double val, min, max; } sensor[SENSORS+1]; static double query (int token) @@ -245,6 +248,9 @@ static double query (int token) case T_MAIL: return mail[(token>>8)-'0'].num; + case T_MAIL_UNSEEN: + return mail[(token>>8)-'0'].unseen; + case T_SENSOR: return sensor[(token>>8)-'0'].val; @@ -450,6 +456,7 @@ static void print_token (int token, char **p, char *start, int maxlen) break; case T_MAIL: + case T_MAIL_UNSEEN: val=query(token); *p+=sprintf (*p, "%3.0f", val); break; @@ -521,8 +528,8 @@ static void collect_data (void) } for (i=0; i<=MAILBOXES; i++) { - if (token_usage[T_MAIL]&(1< +#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; +} + diff --git a/socket.h b/socket.h new file mode 100644 index 0000000..95c0e1d --- /dev/null +++ b/socket.h @@ -0,0 +1,40 @@ +/* $Id: socket.h,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.h,v $ + * Revision 1.1 2001/03/14 13:19:29 ltoetsch + * Added pop3/imap4 mail support + * + * + */ + +#ifndef __SOCKET_H_ +#define __SOCKET_H_ + +int open_socket(char *machine, int port); +int read_socket(int fd, char *buf, size_t size); +int read_socket_match(int fd, char *buf, size_t size, char *match); +int write_socket(int fd, char *buf); + +#endif + + + -- cgit v1.2.3