Initial revision
[chise/xemacs-chise.git.1] / netinstall / log.cc
diff --git a/netinstall/log.cc b/netinstall/log.cc
new file mode 100644 (file)
index 0000000..0ffc8e5
--- /dev/null
@@ -0,0 +1,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 cygwin 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);
+}