You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/ksysguard/ksysguardd/NetBSD/logfile.c

176 lines
3.8 KiB

/*
KSysGuard, the KDE System Guard
Copyright (c) 2001 Tobias Koenig <tokoe@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of version 2 of the GNU General Public
License as published by the Free Software Foundation.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Command.h"
#include "ccont.h"
#include "conf.h"
#include "ksysguardd.h"
#include "logfile.h"
static CONTAINER LogFiles = 0;
static unsigned long counter = 1;
typedef struct {
char name[256];
FILE* fh;
unsigned long id;
} LogFileEntry;
extern CONTAINER LogFileList;
/*
================================ public part =================================
*/
void initLogFile(struct SensorModul* sm)
{
char monitor[1024];
ConfigLogFile *entry;
registerCommand("logfile_register", registerLogFile);
registerCommand("logfile_unregister", unregisterLogFile);
registerCommand("logfile_registered", printRegistered);
for (entry = first_ctnr(LogFileList); entry; entry = next_ctnr(LogFileList))
{
FILE* fp;
/* register the log file if we can actually read the file. */
if ((fp = fopen(entry->path, "r")) != NULL)
{
fclose(fp);
snprintf(monitor, 1024, "logfiles/%s", entry->name);
registerMonitor(monitor, "logfile", printLogFile,
printLogFileInfo, sm);
}
}
LogFiles = new_ctnr();
}
void exitLogFile(void)
{
destr_ctnr(LogFiles, free);
}
void printLogFile(const char* cmd)
{
char line[1024];
unsigned long id;
int i;
char ch;
LogFileEntry *entry;
sscanf(cmd, "%*s %lu", &id);
for (entry = first_ctnr(LogFiles); entry; entry = next_ctnr(LogFiles)) {
if (entry->id == id) {
while (fgets(line, sizeof(line), entry->fh) != NULL) {
fprintf(CurrentClient, "%s", line);
}
clearerr(entry->fh);
}
}
fprintf(CurrentClient, "\n");
}
void printLogFileInfo(const char* cmd)
{
fprintf(CurrentClient, "LogFile\n");
}
void registerLogFile(const char* cmd)
{
char name[257];
FILE* file;
LogFileEntry *entry;
ConfigLogFile *conf;
memset(name, 0, sizeof(name));
sscanf(cmd, "%*s %256s", name);
for (conf = first_ctnr(LogFileList); conf; conf = next_ctnr(LogFileList)) {
if (!strcmp(conf->name, name)) {
if ((file = fopen(conf->path, "r")) == NULL) {
print_error("fopen()");
fprintf(CurrentClient, "0\n");
return;
}
fseek(file, 0, SEEK_END);
if ((entry = (LogFileEntry *)malloc(sizeof(LogFileEntry))) == NULL) {
print_error("malloc()");
fprintf(CurrentClient, "0\n");
return;
}
entry->fh = file;
strlcpy(entry->name, conf->name, sizeof(entry->name));
entry->id = counter;
push_ctnr(LogFiles, entry);
fprintf(CurrentClient, "%lu\n", counter);
counter++;
return;
}
}
fprintf(CurrentClient, "0\n");
}
void unregisterLogFile(const char* cmd)
{
unsigned long id;
LogFileEntry *entry;
sscanf(cmd, "%*s %lu", &id);
for (entry = first_ctnr(LogFiles); entry; entry = next_ctnr(LogFiles)) {
if (entry->id == id) {
fclose(entry->fh);
free(remove_ctnr(LogFiles));
fprintf(CurrentClient, "\n");
return;
}
}
fprintf(CurrentClient, "\n");
}
void printRegistered(const char* cmd)
{
LogFileEntry *entry;
for (entry = first_ctnr(LogFiles); entry; entry = next_ctnr(LogFiles))
fprintf(CurrentClient, "%s:%lu\n", entry->name, entry->id);
fprintf(CurrentClient, "\n");
}