mirror of
https://github.com/agdsn/ancient-weatherstation.git
synced 2026-06-19 23:07:59 +00:00
Working at home
git-svn-id: file:///home/jan/tmp/wetterstation/trunk@31 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
+32
-2
@@ -8,6 +8,14 @@ INCL = -I$$(pg_config --includedir)
|
||||
BIN_NAME = weatherdeamon
|
||||
OBJS = main.o config.o input.o process.o write.o
|
||||
|
||||
CONF_NAME = weatherd.conf
|
||||
|
||||
INSTDIR = /usr/bin/
|
||||
CONFDIR = /etc/
|
||||
INSTGRP = losinski
|
||||
INSTUSR = losinski
|
||||
|
||||
DESTDIR = /home/losinski
|
||||
|
||||
# Alles bauen
|
||||
all: $(BIN_NAME)
|
||||
@@ -34,11 +42,33 @@ $(OBJS):
|
||||
|
||||
# Programm mit debug-ausgabe bauen
|
||||
debug:
|
||||
$(MAKE) all DEBUG=-DDEBUG
|
||||
@ echo "baue Version mit Debugoutput ..."
|
||||
@ $(MAKE) all DEBUG=-DDEBUG
|
||||
|
||||
# Programm ohne Log-ausgabe bauen
|
||||
nolog:
|
||||
$(MAKE) all NOLOG=-DNO_LOGING
|
||||
@ echo "baue Version ohne Logoutput ..."
|
||||
@ $(MAKE) all NOLOG=-DNO_LOGING
|
||||
|
||||
# Installieren
|
||||
install:
|
||||
@ echo "kopiere $(BIN_NAME) nach $(DESTDIR)$(INSTDIR)"
|
||||
@ mkdir -p $(DESTDIR)$(INSTDIR); \
|
||||
cp $(BIN_NAME) $(DESTDIR)$(INSTDIR)
|
||||
@ echo "setze Rechte auf $(BIN_NAME)"
|
||||
@ cd $(DESTDIR)$(INSTDIR); \
|
||||
chmod 755 $(BIN_NAME); \
|
||||
chgrp $(INSTGRP) $(BIN_NAME); \
|
||||
chown $(INSTUSR) $(BIN_NAME)
|
||||
@ echo "kopiere $(CONF_NAME) nach $(DESTDIR)$(CONFDIR)"
|
||||
@ mkdir -p $(DESTDIR)$(CONFDIR); \
|
||||
cp $(CONF_NAME) $(DESTDIR)$(CONFDIR)
|
||||
@ echo "setze Rechte auf $(CONF_NAME)"
|
||||
@ cd $(DESTDIR)$(CONFDIR); \
|
||||
chmod 755 $(CONF_NAME); \
|
||||
chgrp $(CONFGRP) $(CONF_NAME); \
|
||||
chown $(CONFUSR) $(CONF_NAME)
|
||||
|
||||
|
||||
# Aufräumnen (alle Object-Files löschen)
|
||||
cleanup:
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#define ERROR_READ "sensor-rs232interface: Fehler beim Lesen\n"
|
||||
#define ERROR_LOGFILE "Log-Error: Kann Logfile nicht öffnen\n"
|
||||
#define ERROR_FORK "Fork-Fehler: Kann den Prozess nicht in den Hintergrund schieben\n"
|
||||
#define ERROR_SEIINST "Signal-Fehler: Kann Signalhandler zum beenden nicht installieren\n"
|
||||
|
||||
|
||||
/* Parameter-Flags ----------------------------------------------------- */
|
||||
|
||||
+49
-16
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
|
||||
weatherdeamon -- Weather Data Capture Program for the
|
||||
'ELV-PC-Wettersensor-Empfänger'
|
||||
'ELV-PC-Wettersensor-Empfaenger'
|
||||
main.c -- Part of the weatherdeamon
|
||||
|
||||
Copyright (C) 2006 Jan Losinski
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h> /* O_WRONLY O_APPEND O_CREAT ... */
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include "definitions.h"
|
||||
#include "config.h"
|
||||
#include "main.h"
|
||||
@@ -39,7 +40,7 @@
|
||||
w_opts global_opts;
|
||||
clean_struct_ptr clean_ptr = NULL;
|
||||
#ifndef NO_LOGING
|
||||
static char *error_buffer = NULL; /* Puffer für Fehler-ausgaben */
|
||||
static char *error_buffer = NULL; /* Puffer fuer Fehler-ausgaben */
|
||||
#endif
|
||||
|
||||
/* Funktionen ----------------------------------------------------------*/
|
||||
@@ -53,7 +54,7 @@ static void merge_options(w_opts *);
|
||||
#endif
|
||||
static clean_struct_ptr get_last_clean(clean_struct_ptr);
|
||||
static void clean();
|
||||
|
||||
static void exit_sig_handler(int);
|
||||
|
||||
/* Jetzt gehts los.... --------------------------------------------------*/
|
||||
|
||||
@@ -76,6 +77,19 @@ int main(int argc, char *argv[]){
|
||||
|
||||
DEBUGOUT1("Programm gestartet\n");
|
||||
|
||||
if(signal(SIGABRT, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGABRT installiert\n");
|
||||
if(signal(SIGINT, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGINT installiert\n");
|
||||
if(signal(SIGQUIT, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGQUIT installiert\n");
|
||||
if(signal(SIGTERM, exit_sig_handler) == SIG_ERR)
|
||||
exit_error(ERROR_SEIINST);
|
||||
DEBUGOUT1("Signalhandler zum beenden per SIGTERM installiert\n");
|
||||
|
||||
read_config(DEFAULT_CONFIG_FILE,1);
|
||||
|
||||
/* Optionen auswerten */
|
||||
@@ -116,7 +130,7 @@ int main(int argc, char *argv[]){
|
||||
read_config(extra_conf_file,0);
|
||||
}
|
||||
|
||||
/* Komandozeilen-Optionen zu denen aus der Config-File hinzufügen */
|
||||
/* Komandozeilen-Optionen zu denen aus der Config-File hinzufuegen */
|
||||
merge_options(&opts);
|
||||
|
||||
/* Debug-Ausgaben, um zu sehen, ob die Optionen richtig gesetzt werden */
|
||||
@@ -138,8 +152,8 @@ int main(int argc, char *argv[]){
|
||||
|
||||
/* Programm in den Hintergrund schicken ? */
|
||||
background();
|
||||
|
||||
DEBUGOUT1("\nBeginne Interface zu öffnen\n\n");
|
||||
while (1);
|
||||
DEBUGOUT1("\nBeginne Interface zu oeffnen\n\n");
|
||||
|
||||
/* Port Pollen */
|
||||
read_port();
|
||||
@@ -159,7 +173,7 @@ static void background(){
|
||||
}
|
||||
}
|
||||
|
||||
/* Führt die Optionen aus der Komandozeile und die aus dem Conf-File zusammen */
|
||||
/* Fuehrt die Optionen aus der Komandozeile und die aus dem Conf-File zusammen */
|
||||
static void merge_options(w_opts *priv){
|
||||
if((*priv).device != NULL)
|
||||
global_opts.device = (*priv).device;
|
||||
@@ -196,8 +210,8 @@ int get_flag(int mask){
|
||||
}
|
||||
|
||||
/* Diese Funktion beendet das Programm mit einer Fehlermeldung. */
|
||||
void exit_error(char* err)
|
||||
{
|
||||
void exit_error(char* err){
|
||||
DEBUGOUT1("\nEtwas unschoenes ist passiert\n");
|
||||
clean();
|
||||
if(errno != 0){
|
||||
perror("Fehler");
|
||||
@@ -206,9 +220,27 @@ void exit_error(char* err)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Wird bei Beendigungssignalen ausgefuehrt */
|
||||
static void exit_sig_handler(int signr){
|
||||
#ifdef DEBUG
|
||||
DEBUGOUT1("\n");
|
||||
switch (signr){
|
||||
case SIGABRT:
|
||||
DEBUGOUT1("SIGABRT Interupt erhalten!\n");
|
||||
case SIGTERM:
|
||||
DEBUGOUT1("SIGTERM Interupt erhalten!\n");
|
||||
case SIGQUIT:
|
||||
DEBUGOUT1("SIGQUIT Interupt erhalten!\n");
|
||||
case SIGINT:
|
||||
DEBUGOUT1("SIGINT Interupt erhalten!\n");
|
||||
}
|
||||
#endif
|
||||
clean();
|
||||
DEBUGOUT1("Beende Programm...\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
/* Funktionen für die Logfiles */
|
||||
/* Funktionen fuer die Logfiles */
|
||||
|
||||
#ifndef NO_LOGING
|
||||
/* Schreiben einer Fehlermeldung in das fehler-Logfile */
|
||||
@@ -225,7 +257,7 @@ void log_data(time_t timestamp, char *msg){
|
||||
DEBUGOUT1(" -->Data Logged \n");
|
||||
}
|
||||
|
||||
/* Logfile öffnen */
|
||||
/* Logfile oeffnen */
|
||||
static int open_logfile(char *file){
|
||||
int log_fd;
|
||||
|
||||
@@ -278,11 +310,11 @@ static clean_struct_ptr get_last_clean(clean_struct_ptr ptr){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Ein neues Clean-Element anfügen. Ein Clean-Element ist eine Datenstruktur, die
|
||||
/* Ein neues Clean-Element anfuegen. Ein Clean-Element ist eine Datenstruktur, die
|
||||
* einen Pointer auf eine Funktion vom Typ
|
||||
* void func(void *data),
|
||||
* einen Zeiger auf beliebige Daten und einen Zeiger auf das nächste Element hält.
|
||||
* Die Funktionen werden beim regulären beenden des Programmes aufgerufen um zum bsp.
|
||||
* einen Zeiger auf beliebige Daten und einen Zeiger auf das naechste Element haelt.
|
||||
* Die Funktionen werden beim regulaeren beenden des Programmes aufgerufen um zum bsp.
|
||||
* datenbankverbindungen zu schließen, etc. */
|
||||
void add_clean(void (*func)(void *data), void *data){
|
||||
clean_struct_ptr p, temp = (clean_struct_ptr) malloc(sizeof(clean_data));
|
||||
@@ -297,8 +329,9 @@ void add_clean(void (*func)(void *data), void *data){
|
||||
}
|
||||
}
|
||||
|
||||
/* 'Säuberung' ausführen */
|
||||
/* 'Saeuberung' ausfuehren */
|
||||
static void clean(){
|
||||
DEBUGOUT1("\nRaeume auf...\n");
|
||||
clean_struct_ptr p = clean_ptr;
|
||||
while(p != NULL){
|
||||
p->func(p->data);
|
||||
|
||||
Reference in New Issue
Block a user