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