www.pudn.com > hipl.1.0.1.rar > agent_gtk.c
/*
HIP Agent
License: GNU/GPL
Authors: Antti Partanen
*/
/******************************************************************************/
/* INCLUDES */
#include "agent.h"
/******************************************************************************/
/** Catch SIGINT. */
void sig_catch_int(int signum)
{
static int force_exit = 0;
signal(signum, sig_catch_int);
agent_exit();
if (force_exit < 1) HIP_DEBUG("SIGINT (CTRL-C) caught, exiting agent...\n");
else if (force_exit < 2) HIP_DEBUG("SIGINT (CTRL-C) caught, still once to terminate brutally.\n");
else
{
HIP_DEBUG("SIGINT (CTRL-C) caught, terminating!\n");
exit(1);
}
force_exit++;
}
/* END OF FUNCTION */
/******************************************************************************/
/** Catch SIGTSTP. */
void sig_catch_tstp(int signum)
{
signal(signum, sig_catch_tstp);
HIP_DEBUG("SIGTSTP (CTRL-Z?) caught, don't do that...\n");
}
/* END OF FUNCTION */
/******************************************************************************/
/** Catch SIGCHLD. */
void sig_catch_chld(int signum)
{
/* Variables. */
union wait status;
int pid, i;
signal(signum, sig_catch_chld);
/* Get child process status, so it wont be left as zombie for long time. */
while ((pid = wait3(&status, WNOHANG, 0)) > 0)
{
/* Maybe do something.. */
}
}
/* END OF FUNCTION */
/******************************************************************************/
/** Catch SIGTERM. */
void sig_catch_term(int signum)
{
signal(signum, sig_catch_tstp);
HIP_ERROR("SIGTERM caught, force exit now!\n");
exit (1);
}
/* END OF FUNCTION */
/******************************************************************************/
/**
main().
*/
int main(int argn, char *argv[])
{
/* Variables. */
int err = 0, fd;
/* Write pid to file. */
/* unlink(HIP_AGENT_LOCK_FILE);
fd = open(HIP_AGENT_LOCK_FILE, O_RDWR | O_CREAT, 0644);
if (fd > 0)
{
char str[64];
/* Dont lock now, make this feature available later. */
// if (lockf(i, F_TLOCK, 0) < 0) exit (1);
/* Only first instance continues. */
// sprintf(str, "%d\n", getpid());
// write(fd, str, strlen(str)); /* record pid to lockfile */
// }
/* Initialize string variables. */
HIP_IFEL(str_var_init(), -1, "Failed to initialize strvars!\n");
/* Create config path. */
str_var_set("config-path", "%s/.hipagent", getenv("HOME"));
mkdir(str_var_get("config-path"), 0700);
/* Create config filename. */
str_var_set("config-file", "%s/.hipagent/config", getenv("HOME"));
/* Create database filename. */
str_var_set("db-file", "%s/.hipagent/database", getenv("HOME"));
/* Check command line options. */
term_set_mode(TERM_MODE_NONE);
err = -1;
if (argn == 2)
{
if (argv[1][0] == '-')
{
if (argv[1][1] == 's')
{
term_set_mode(TERM_MODE_SERVER);
err = 0;
}
}
}
if (argn == 3)
{
if (argv[1][0] == '-')
{
if (argv[1][1] == 'c')
{
term_set_mode(TERM_MODE_CLIENT);
term_set_server_addr(argv[2]);
err = 0;
}
}
}
if (argn == 1) err = 0;
HIP_IFEL(err, -1, "Invalid command line parameters.\n");
/* Read config. */
err = config_read(str_var_get("config-file"));
if (err) HIP_ERROR("Could not read config file.\n");
lang_init(str_var_get("lang"));
/* Set some random seed. */
srand(time(NULL));
/* Set signalling. */
signal(SIGINT, sig_catch_int);
signal(SIGCHLD, sig_catch_chld);
signal(SIGTERM, sig_catch_term);
/* Initialize GUI. */
HIP_DEBUG("##### 1. Initializing GUI...\n");
HIP_IFEL(gui_init(), -1, "Failed to initialize GUI!\n");
/* Initialize database. */
HIP_DEBUG("##### 2. Initializing database...\n");
HIP_IFEL(hit_db_init(str_var_get("db-file")), -1, "Failed to load agent database!\n");
/* Initialize connection to HIP daemon. */
HIP_DEBUG("##### 3. Initializing connection to HIP daemon...\n");
#ifndef CONFIG_HIP_DEBUG
HIP_IFEL(connhipd_init(), -1, "Failed to open connection to HIP daemon!\n");
#else
/*
If in debug mode, try to execute daemon from GUI,
if connection to daemon fails.
*/
err = connhipd_init();
/*
If connection to daemon failed, assume that daemon
is not running and try to fork it.
*/
if (err != 0 && 0)
{
HIP_DEBUG("Trying to execute daemon...\n");
err = fork();
if (err < 0) HIP_DEBUG("fork() failed!\n");
else if (err > 0)
{
/* Wait for daemon to start. */
sleep(2);
/* Initialize connection to HIP daemon. */
err = connhipd_init();
}
else if(err == 0)
{
err = execlp("./hipd/hipd", "", (char *)0);
if (err != 0)
{
HIP_DEBUG("Executing HIP daemon failed!\n");
exit(1);
}
}
}
#endif
HIP_DEBUG("##### 4. Executing GUI main.\n");
gui_main();
agent_exit();
out_err:
connhipd_quit();
hit_db_quit(str_var_get("db-file"));
lang_quit();
str_var_quit();
HIP_DEBUG("##### X. Exiting application...\n");
return (err);
}
/* END OF FUNCTION */
/* END OF SOURCE FILE */
/******************************************************************************/