#include "tele.h"

Boolean DialogActive;
Boolean ColorDisplay;
int StatusLine;
Boolean refr;

DB *db;
HASHINFO *hashdb;

char *systemHelpFile(file, buf)
char *file, *buf;
{
	if (!file)
		return NULL;

	/* ścieżka bezwzględna */

	if (file[0] == '/')
		return file;

	/* w innych przypadkach zakładamy, że helpy są w homie */

	snprintf(buf, PATHMAX, "%s/%s/help/%s.TXT", getenv("HOME"), DEFDIR, file);

	if (file_readable(buf))
		return buf;

	return NULL;
}

void systemInitialize(argc, argv)
int argc;
char **argv;
{
	int fd;

	ColorDisplay = FALSE;
	DialogActive = FALSE;

	init_dialog();
	DialogActive = TRUE;

	/* jeżeli katalog istnieje, to i tak go jeszcze raz zalożymy */

	chdir(getenv("HOME"));
	chmod(DEFDIR, S_IRWXU);
	mkdir(DEFDIR, S_IRWXU);
	chdir(DEFDIR);

	/* jeżeli istnieje lock file, baza musi być otwarta w trybie
	 * tylko do odczytu! */

	if (file_readable(DEFDBLOCK))
	{
		db = dbopen(DEFDB, (O_RDONLY|O_CREAT), (S_IRUSR|S_IWUSR),
				DB_HASH, NULL);
		msgConfirm(" Wykryto, że uruchomiona jest inna kopia"
				" programu.\n"
				" Dostęp do bazy danych możliwy jest tylko w"
				" trybie do odczytu.\n");
	}
	else
		db = dbopen(DEFDB, (O_RDWR|O_CREAT), (S_IRUSR|S_IWUSR),
				DB_HASH, NULL);

	if (!db)
	{
		msgConfirm(" Nie można otworzyć bazy danych lub "
				"utworzyć nowej!\n (%s) \n", strerror(errno));
		systemShutdown(1);
	}

	/* tworzymy lockfile */

	fd = open(DEFDBLOCK, O_CREAT, (S_IRUSR|S_IWUSR));
	close(fd);
}

void systemShutdown(status)
int status;
{
	if (status > 1)
		msgFatal("Przechwycono sygnał %d! To źle!", status);
	
	if (DialogActive)
	{
		end_dialog();
		DialogActive = FALSE;
	}

	endwin();

	db->sync(db, NULL);
	db->close(db);
	
	unlink(DEFDBLOCK);
	exit(status);
}

void handle_intr(sig)
int sig;
{
	WINDOW *save = savescr();

	if (!msgYesNo("Czy naprawdę chcesz opuścić program?"))
		systemShutdown(-1);
	else
		restorescr(save);
}

