1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
/*
* Copyright (c) 2000, Red Hat, Inc.
*
* This program 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 of the License, or
* (at your option) any later version.
*
* A copy of the GNU General Public License can be found at
* http://www.gnu.org/
*
* Written by DJ Delorie <dj@redhat.com>
*
*/
/* The purpose of this file is to centralize all the logging functions. */
#include "win32.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <time.h>
#include "resource.h"
#include "msg.h"
#include "log.h"
#include "dialog.h"
#include "state.h"
#include "concat.h"
#include "mkdir.h"
struct LogEnt {
LogEnt *next;
int flags;
time_t when;
char msg[1];
};
static LogEnt *first_logent = 0;
static LogEnt **next_logent = &first_logent;
void
log (int flags, char *fmt, ...)
{
char buf[1000];
va_list args;
va_start (args, fmt);
vsprintf (buf, fmt, args);
LogEnt *l = (LogEnt *) malloc (sizeof (LogEnt) + strlen (buf) + 20);
l->next = 0;
l->flags = flags;
time (&(l->when));
*next_logent = l;
next_logent = &(l->next);
char *b = l->msg;
if (flags & LOG_TIMESTAMP)
{
struct tm *tm = localtime (&(l->when));
strftime (b, 1000, "%Y/%m/%d %H:%M:%S ", tm);
b += strlen (b);
}
strcpy (b, buf);
msg ("LOG: %d %s", l->flags, l->msg);
}
void
log_save (int babble, char *filename, int append)
{
static int been_here = 0;
if (been_here)
return;
been_here = 1;
mkdir_p (0, filename);
FILE *f = fopen (filename, append ? "at" : "wt");
if (!f)
{
fatal (IDS_NOLOGFILE, filename);
return;
}
LogEnt *l;
for (l=first_logent; l; l=l->next)
{
if (babble || !(l->flags & LOG_BABBLE))
{
fputs (l->msg, f);
if (l->msg[strlen(l->msg)-1] != '\n')
fputc ('\n', f);
}
}
fclose (f);
been_here = 0;
}
void
exit_setup (int exit_code)
{
static int been_here = 0;
if (been_here)
ExitProcess (1);
been_here = 1;
if (exit_msg)
note (exit_msg);
log (LOG_TIMESTAMP, "Ending XEmacs install");
if (source == IDC_SOURCE_DOWNLOAD || !root_dir)
{
log_save (LOG_BABBLE, "setup.log.full", 0);
log_save (0, "setup.log", 1);
}
else
{
log_save (LOG_BABBLE, concat (root_dir, "/setup.log.full", 0), 0);
log_save (0, concat (root_dir, "/setup.log", 0), 1);
}
ExitProcess (exit_code);
}
|