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 }