mirror of
https://github.com/netfun2000/lcd4linux.git
synced 2026-02-27 09:44:34 +08:00
[lcd4linux @ 2004-04-08 11:59:26 by reinelt]
added plugin_pop3 from Javi git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@411 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
This commit is contained in:
+2
-1
@@ -54,7 +54,8 @@ plugin_exec.c \
|
||||
plugin_xmms.c \
|
||||
plugin_mysql.c \
|
||||
plugin_wireless.c \
|
||||
plugin_seti.c
|
||||
plugin_seti.c \
|
||||
plugin_pop3.c
|
||||
|
||||
#liblcd4linux_la_DEPENDENCIES = @DRIVERS@
|
||||
#liblcd4linux_la_LDFLAGS = -version-info 9:12:9
|
||||
|
||||
+8
-7
@@ -91,7 +91,7 @@ lcd4linux_LDADD = @DRIVERS@ @DRVLIBS@
|
||||
#remove next line for liblcd4linux
|
||||
lcd4linux_DEPENDENCIES = @DRIVERS@
|
||||
|
||||
lcd4linux_SOURCES = lcd4linux.c cfg.c cfg.h debug.c debug.h drv.c drv.h evaluator.c evaluator.h hash.c hash.h layout.c layout.h lock.c lock.h pid.c pid.h timer.c timer.h thread.c thread.h udelay.c udelay.h qprintf.c qprintf.h widget.c widget.h widget_text.c widget_text.h widget_bar.c widget_bar.h widget_icon.c widget_icon.h plugin.c plugin.h plugin_math.c plugin_string.c plugin_cfg.c plugin_uname.c plugin_loadavg.c plugin_proc_stat.c plugin_cpuinfo.c plugin_meminfo.c plugin_netdev.c plugin_ppp.c plugin_dvb.c plugin_apm.c plugin_i2c_sensors.c plugin_imon.c plugin_exec.c plugin_xmms.c plugin_mysql.c plugin_wireless.c plugin_seti.c
|
||||
lcd4linux_SOURCES = lcd4linux.c cfg.c cfg.h debug.c debug.h drv.c drv.h evaluator.c evaluator.h hash.c hash.h layout.c layout.h lock.c lock.h pid.c pid.h timer.c timer.h thread.c thread.h udelay.c udelay.h qprintf.c qprintf.h widget.c widget.h widget_text.c widget_text.h widget_bar.c widget_bar.h widget_icon.c widget_icon.h plugin.c plugin.h plugin_math.c plugin_string.c plugin_cfg.c plugin_uname.c plugin_loadavg.c plugin_proc_stat.c plugin_cpuinfo.c plugin_meminfo.c plugin_netdev.c plugin_ppp.c plugin_dvb.c plugin_apm.c plugin_i2c_sensors.c plugin_imon.c plugin_exec.c plugin_xmms.c plugin_mysql.c plugin_wireless.c plugin_seti.c plugin_pop3.c
|
||||
|
||||
|
||||
#liblcd4linux_la_DEPENDENCIES = @DRIVERS@
|
||||
@@ -127,7 +127,7 @@ plugin_string.o plugin_cfg.o plugin_uname.o plugin_loadavg.o \
|
||||
plugin_proc_stat.o plugin_cpuinfo.o plugin_meminfo.o plugin_netdev.o \
|
||||
plugin_ppp.o plugin_dvb.o plugin_apm.o plugin_i2c_sensors.o \
|
||||
plugin_imon.o plugin_exec.o plugin_xmms.o plugin_mysql.o \
|
||||
plugin_wireless.o plugin_seti.o
|
||||
plugin_wireless.o plugin_seti.o plugin_pop3.o
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
@@ -154,11 +154,12 @@ DEP_FILES = .deps/BeckmannEgle.P .deps/MilfordInstruments.P \
|
||||
.deps/plugin_cpuinfo.P .deps/plugin_dvb.P .deps/plugin_exec.P \
|
||||
.deps/plugin_i2c_sensors.P .deps/plugin_imon.P .deps/plugin_loadavg.P \
|
||||
.deps/plugin_math.P .deps/plugin_meminfo.P .deps/plugin_mysql.P \
|
||||
.deps/plugin_netdev.P .deps/plugin_ppp.P .deps/plugin_proc_stat.P \
|
||||
.deps/plugin_seti.P .deps/plugin_string.P .deps/plugin_uname.P \
|
||||
.deps/plugin_wireless.P .deps/plugin_xmms.P .deps/qprintf.P \
|
||||
.deps/thread.P .deps/timer.P .deps/udelay.P .deps/widget.P \
|
||||
.deps/widget_bar.P .deps/widget_icon.P .deps/widget_text.P
|
||||
.deps/plugin_netdev.P .deps/plugin_pop3.P .deps/plugin_ppp.P \
|
||||
.deps/plugin_proc_stat.P .deps/plugin_seti.P .deps/plugin_string.P \
|
||||
.deps/plugin_uname.P .deps/plugin_wireless.P .deps/plugin_xmms.P \
|
||||
.deps/qprintf.P .deps/thread.P .deps/timer.P .deps/udelay.P \
|
||||
.deps/widget.P .deps/widget_bar.P .deps/widget_icon.P \
|
||||
.deps/widget_text.P
|
||||
SOURCES = $(lcd4linux_SOURCES) $(EXTRA_lcd4linux_SOURCES)
|
||||
OBJECTS = $(lcd4linux_OBJECTS)
|
||||
|
||||
|
||||
@@ -109,6 +109,14 @@ Plugin MySQL {
|
||||
database 'lcd4linux' # MUST be specified
|
||||
}
|
||||
|
||||
Plugin Pop3 {
|
||||
server1 'localhost'
|
||||
port1 110
|
||||
user1 'michael'
|
||||
password1 'secret'
|
||||
}
|
||||
|
||||
|
||||
Widget OS {
|
||||
class 'Text'
|
||||
expression '*** '.uname('sysname').' '.uname('release').' ***'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: plugin.c,v 1.25 2004/04/07 08:29:05 hejl Exp $
|
||||
/* $Id: plugin.c,v 1.26 2004/04/08 11:59:26 reinelt Exp $
|
||||
*
|
||||
* plugin handler for the Evaluator
|
||||
*
|
||||
@@ -22,6 +22,9 @@
|
||||
*
|
||||
*
|
||||
* $Log: plugin.c,v $
|
||||
* Revision 1.26 2004/04/08 11:59:26 reinelt
|
||||
* added plugin_pop3 from Javi
|
||||
*
|
||||
* Revision 1.25 2004/04/07 08:29:05 hejl
|
||||
* New plugin for wireless info
|
||||
*
|
||||
@@ -177,6 +180,7 @@ int plugin_init_imon(void);
|
||||
int plugin_init_mysql(void);
|
||||
int plugin_init_seti(void);
|
||||
int plugin_init_wireless(void);
|
||||
int plugin_init_pop3(void);
|
||||
|
||||
|
||||
void plugin_exit_math (void);
|
||||
@@ -198,6 +202,7 @@ void plugin_exit_imon(void);
|
||||
void plugin_exit_mysql(void);
|
||||
void plugin_exit_seti(void);
|
||||
void plugin_exit_wireless(void);
|
||||
void plugin_exit_pop3(void);
|
||||
|
||||
int plugin_init (void)
|
||||
{
|
||||
@@ -220,6 +225,7 @@ int plugin_init (void)
|
||||
plugin_init_mysql();
|
||||
plugin_init_seti();
|
||||
plugin_init_wireless();
|
||||
plugin_init_pop3();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -244,6 +250,7 @@ void plugin_exit(void) {
|
||||
plugin_exit_mysql();
|
||||
plugin_exit_seti();
|
||||
plugin_exit_wireless();
|
||||
plugin_exit_pop3();
|
||||
|
||||
DeleteFunctions();
|
||||
DeleteVariables();
|
||||
|
||||
+336
@@ -0,0 +1,336 @@
|
||||
/* $Id: plugin_pop3.c,v 1.1 2004/04/08 11:59:26 reinelt Exp $
|
||||
*
|
||||
* Plugin to check POP3 mail accounts
|
||||
*
|
||||
* Copyright 2004 Javi Garcia Dominguez (aka Stolz) <javi@gsmlandia.com>
|
||||
* Based on code from pop3check (c) 1999 http://sourceforge.net/projects/pop3check
|
||||
* Simon Liddington <squidly@users.sourceforge.net> is the pop3check current maintainer.
|
||||
* The pop3check original author is Steven Radack <steve@lconn.net>.
|
||||
*
|
||||
* Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
|
||||
*
|
||||
* This file is a pluging for 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: plugin_pop3.c,v $
|
||||
* Revision 1.1 2004/04/08 11:59:26 reinelt
|
||||
* added plugin_pop3 from Javi
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "debug.h"
|
||||
#include "plugin.h"
|
||||
#include "cfg.h"
|
||||
|
||||
//added
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
//#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
//#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
//
|
||||
|
||||
#ifdef WITH_DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
|
||||
//POP 3
|
||||
#define POPERR "-ERR"
|
||||
#define LOCKEDERR "-ERR account is locked by another session or for maintenance, try again."
|
||||
#define BUFSIZE 8192
|
||||
#define POP3PORT 110
|
||||
#define MAX_NUM_ACCOUNTS 3
|
||||
//
|
||||
|
||||
static struct check {
|
||||
int id;
|
||||
char *username;
|
||||
char *password;
|
||||
char *server;
|
||||
int port;
|
||||
int messages;
|
||||
struct check *next;
|
||||
};
|
||||
|
||||
// ************************ PROTOTYPES ********************************
|
||||
// list
|
||||
static struct check *check_node_alloc(void);
|
||||
void check_node_add(struct check **head, struct check *new_check);
|
||||
void check_destroy(struct check **head);
|
||||
// pop3
|
||||
void pop3_check_messages(struct check *hi,int verbose);
|
||||
void pop3_recv_crlf_terminated(int sockfd, char *buf, int size);
|
||||
// socket
|
||||
int tcp_connect(struct check *hi);
|
||||
// ************************ GLOBAL ***********************************
|
||||
static char Section[] = "Plugin:POP3";
|
||||
static struct check *head = NULL;
|
||||
// ********************************************************************
|
||||
static void my_POP3check (RESULT *result, RESULT *check)
|
||||
{
|
||||
double value;
|
||||
double param=R2N(check);
|
||||
|
||||
struct check *node = NULL;
|
||||
|
||||
for (node = head; node; node = node->next)
|
||||
{
|
||||
if (node->id == param)
|
||||
break;
|
||||
}
|
||||
if (node == NULL) //Inexistent account
|
||||
value=-1.0;
|
||||
else
|
||||
pop3_check_messages(node,0);
|
||||
value = (double)node->messages;
|
||||
SetResult(&result, R_NUMBER, &value);
|
||||
}
|
||||
|
||||
static int getConfig (void)
|
||||
{
|
||||
struct check *node = NULL;
|
||||
int i,n=0;
|
||||
char *user= (char *)calloc(1, sizeof("user")+sizeof(int));
|
||||
char *password= (char *)calloc(1, sizeof("password")+sizeof(int));
|
||||
char *server=(char *)calloc(1, sizeof("server")+sizeof(int));
|
||||
char *port= (char *)calloc(1, sizeof("port")+sizeof(int));
|
||||
|
||||
for (i =1;i <= MAX_NUM_ACCOUNTS; i++)
|
||||
{
|
||||
sprintf(user,"user%d",i);
|
||||
sprintf(password,"password%d",i);
|
||||
sprintf(server,"server%d",i);
|
||||
sprintf(port,"port%d",i);
|
||||
|
||||
char *x = cfg_get (Section, server, "");
|
||||
if (*x=='\0')
|
||||
{
|
||||
info ("[POP3] No '%s.%s' entry from %s, disabling POP3 account #%d", Section, server, cfg_source(),i);
|
||||
free(x);
|
||||
}
|
||||
else
|
||||
{
|
||||
node = check_node_alloc();
|
||||
node->id = i;
|
||||
node->server = x;
|
||||
node->messages = 0;
|
||||
node->next = NULL;
|
||||
|
||||
x = cfg_get (Section, user, "");
|
||||
if (*x=='\0')
|
||||
{
|
||||
info ("[POP3] No '%s.%s' entry from %s, disabling POP3 account #%d", Section, user, cfg_source(),i);
|
||||
free(x);
|
||||
}
|
||||
else
|
||||
{
|
||||
node->username = x;
|
||||
x = cfg_get (Section, password, "");
|
||||
if (*x=='\0')
|
||||
{
|
||||
info ("[POP3] No '%s.%s' entry from %s, disabling POP3 account #%d", Section, password, cfg_source(),i);
|
||||
free(x);
|
||||
}
|
||||
else
|
||||
{
|
||||
node->password = x;
|
||||
if (cfg_number(Section, port, POP3PORT, 1, 65536, &node->port)<1)
|
||||
info("[POP3] No '%s.%s' entry from %s, %d will be used for account #%d", Section, port, cfg_source(),POP3PORT,i);
|
||||
check_node_add(&head, node);
|
||||
n++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(n);
|
||||
}
|
||||
|
||||
int plugin_init_pop3(void)
|
||||
{
|
||||
|
||||
int n = getConfig();
|
||||
// by now, head should point to a list of all our accounts
|
||||
if (head)
|
||||
{
|
||||
info("[POP3] %d POP3 accounts have been succesfully defined",n);
|
||||
AddFunction ("POP3check", 1, my_POP3check);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void plugin_exit_pop3(void)
|
||||
{
|
||||
check_destroy(&head);
|
||||
}
|
||||
|
||||
// ************************ LIST ***********************************
|
||||
static struct check *check_node_alloc(void)
|
||||
{
|
||||
struct check *new_check;
|
||||
new_check = (struct check *)calloc(1, sizeof(struct check));
|
||||
if (new_check == NULL)
|
||||
{
|
||||
error( "[POP3] out of memory\n");
|
||||
}
|
||||
return new_check;
|
||||
}
|
||||
|
||||
void check_node_add(struct check **head, struct check *new_check)
|
||||
{
|
||||
new_check->next = *head ;
|
||||
*head = new_check;
|
||||
}
|
||||
|
||||
void check_destroy(struct check **head)
|
||||
{
|
||||
struct check *iter;
|
||||
while (*head)
|
||||
{
|
||||
iter = (*head)->next;
|
||||
free((*head)->username);
|
||||
free((*head)->password);
|
||||
free((*head)->server);
|
||||
free(*head);
|
||||
*head = iter;
|
||||
}
|
||||
*head = NULL;
|
||||
}
|
||||
|
||||
// ************************ POP3 ********************************
|
||||
void pop3_check_messages(struct check *hi,int verbose)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
int sockfd;
|
||||
|
||||
if ((sockfd = tcp_connect(hi)) < 0)
|
||||
{
|
||||
hi->messages = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
pop3_recv_crlf_terminated(sockfd, buf, sizeof(buf)); /* server greeting */
|
||||
if (verbose)
|
||||
info("[POP3] %s -> %s\n", hi->server, buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "USER %s\r\n", hi->username);
|
||||
write(sockfd, buf, strlen(buf));
|
||||
buf[strlen(buf)-1] = '\0';
|
||||
if (verbose)
|
||||
info("[POP3] %s <- %s\n", hi->server, buf);
|
||||
pop3_recv_crlf_terminated(sockfd, buf, sizeof(buf)); /* response from USER command */
|
||||
if (verbose)
|
||||
info("[POP3] %s -> %s\n", hi->server, buf);
|
||||
|
||||
snprintf(buf, sizeof(buf), "PASS %s\r\n", hi->password);
|
||||
write(sockfd, buf, strlen(buf));
|
||||
if (verbose)
|
||||
info("[POP3] %s <- PASS ???\n", hi->server);
|
||||
pop3_recv_crlf_terminated(sockfd, buf, sizeof(buf)); /* response from PASS command */
|
||||
if (verbose)
|
||||
info("[POP3] %s -> %s\n", hi->server, buf);
|
||||
|
||||
if (strncmp(buf, LOCKEDERR, strlen(LOCKEDERR)) == 0)
|
||||
{
|
||||
hi->messages = -2;
|
||||
close(sockfd);
|
||||
return;
|
||||
}
|
||||
if (strncmp(buf, POPERR, strlen(POPERR)) == 0)
|
||||
{
|
||||
error("[POP3] error logging into %s\n", hi->server);
|
||||
error("[POP3] server responded: %s\n", buf);
|
||||
hi->messages = -1;
|
||||
close(sockfd);
|
||||
return;
|
||||
}
|
||||
|
||||
snprintf(buf, sizeof(buf), "STAT\r\n");
|
||||
write(sockfd, buf, strlen(buf));
|
||||
if (verbose)
|
||||
info("[POP3] %s <- STAT\n", hi->server);
|
||||
pop3_recv_crlf_terminated(sockfd, buf, sizeof(buf)); /* response from PASS command */
|
||||
if (verbose)
|
||||
info("[POP3] %s -> %s\n", hi->server, buf);
|
||||
|
||||
strtok(buf, " ");
|
||||
hi->messages = atoi(strtok(NULL, " "));
|
||||
|
||||
snprintf(buf, sizeof(buf), "QUIT\r\n");
|
||||
write(sockfd, buf, strlen(buf));
|
||||
if (verbose)
|
||||
info("[POP3] %s <- QUIT\n", hi->server);
|
||||
pop3_recv_crlf_terminated(sockfd, buf, sizeof(buf)); /* response from QUIT command */
|
||||
if (verbose)
|
||||
info("[POP3] %s -> %s\n", hi->server, buf);
|
||||
|
||||
close(sockfd);
|
||||
}
|
||||
|
||||
void pop3_recv_crlf_terminated(int sockfd, char *buf, int size)
|
||||
{
|
||||
/* receive one line server responses terminated with CRLF */
|
||||
char *pos;
|
||||
int bytes = 0;
|
||||
memset(buf, 0, size);
|
||||
while ((pos = strstr(buf, "\r\n")) == NULL)
|
||||
bytes += read(sockfd, buf+bytes, size-bytes);
|
||||
*pos = '\0';
|
||||
}
|
||||
|
||||
// ************************ SOCKET ********************************
|
||||
int tcp_connect(struct check *hi)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
struct hostent *he = gethostbyname(hi->server);
|
||||
int sockfd;
|
||||
|
||||
if (hi == NULL)
|
||||
return -1;
|
||||
|
||||
if (!he)
|
||||
{
|
||||
error("[POP3] Failed to lookup %s\n",hi->server);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
memset((char *)&addr, 0, sizeof(struct sockaddr_in));
|
||||
addr.sin_family = AF_INET;
|
||||
memcpy(&(addr.sin_addr.s_addr), he->h_addr, he->h_length);
|
||||
addr.sin_port = htons(hi->port);
|
||||
|
||||
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
perror("socket()");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0)
|
||||
{
|
||||
perror("connect()");
|
||||
close(sockfd);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(sockfd);
|
||||
}
|
||||
Reference in New Issue
Block a user