summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/3.0-upgrade/Makefile6
-rw-r--r--tools/3.0-upgrade/README31
-rw-r--r--tools/3.0-upgrade/cvt-wtmp.c284
3 files changed, 0 insertions, 321 deletions
diff --git a/tools/3.0-upgrade/Makefile b/tools/3.0-upgrade/Makefile
deleted file mode 100644
index 3c78cd4..0000000
--- a/tools/3.0-upgrade/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# $FreeBSD$
-
-PROG= cvt-wtmp
-NOMAN= YES
-
-.include <bsd.prog.mk>
diff --git a/tools/3.0-upgrade/README b/tools/3.0-upgrade/README
deleted file mode 100644
index 42761ac..0000000
--- a/tools/3.0-upgrade/README
+++ /dev/null
@@ -1,31 +0,0 @@
-$FreeBSD$
-
-By 1996/12/04, the utmp element size has been changed, in order to
-allow for longer usernames. This change renders all existing wtmp
-files unusable. The cvt-wtmp utility is provided as an aid to convert
-your old wtmp files into the new format, so you don't lose the
-existing track record.
-
-The tool cannot handle gzip'ed wtmp backups, so unzip them first if
-you need. Then simply call it as:
-
- ./cvt-wtmp /var/log/wtmp*
-
-The old wtmp files are being renamed to <file>.bak, so nothing will be
-lost even in case of a failure. If you are only about to test whether
-the tool will grok your files correctly, you can run it as:
-
- ./cvt-wtmp -n /var/log/wtmp*
-
-The tool tries an ``educated guess'', based on the reasonability of
-the timestamp values in the wtmp file. If it fails to recognize the
-format of your wtmp, it normally bails out, or at least ignores
-garbage records. In this case, rename the .bak files to the original
-name, and try to force the conversion:
-
- ./cvt-wtmp -f /var/log/wtmp.xxx
-
-Make sure to verify the result however!
-
-
-Dresden, Jan 2, 1996 Joerg <joerg@FreeBSD.org>
diff --git a/tools/3.0-upgrade/cvt-wtmp.c b/tools/3.0-upgrade/cvt-wtmp.c
deleted file mode 100644
index c5d3b54..0000000
--- a/tools/3.0-upgrade/cvt-wtmp.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (c) 1996 Joerg Wunsch
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- *
- */
-
-/*
- * Heuristics to convert old wtmp format to new one.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-#include <unistd.h>
-#include <utmp.h>
-
-
-#define OUT_NAMESIZE 8
-#define OUT_LINESIZE 8
-#define OUT_HOSTSIZE 16
-
-struct olastlog {
- time_t ll_time;
- char ll_line[OUT_LINESIZE];
- char ll_host[OUT_HOSTSIZE];
-};
-
-struct outmp {
- char ut_line[OUT_LINESIZE];
- char ut_name[OUT_NAMESIZE];
- char ut_host[OUT_HOSTSIZE];
- long ut_time;
-};
-
-void usage(void);
-void convert(const char *, int, int);
-
-/*
- * NB: We cannot convert lastlog yet, but we don't need either.
- */
-
-void
-usage(void)
-{
- errx(EX_USAGE, "usage: cvt-wtmp [-f] [-n] /var/log/wtmp*");
-}
-
-
-int
-main(int argc, char **argv)
-{
- int errs, i, nflag, forceflag, rv;
-
- errs = nflag = forceflag = 0;
- while ((i = getopt(argc, argv, "fn")) != -1)
- switch (i)
- {
- case 'f':
- forceflag++;
- break;
-
- case 'n':
- nflag++;
- break;
-
- default:
- errs++;
- }
- argc -= optind;
- argv += optind;
-
- if (argc <= 0 || errs)
- usage();
-
- for (;argc > 0; argc--, argv++)
- convert(*argv, nflag, forceflag);
-
- return 0;
-}
-
-void
-convert(const char *name, int nflag, int forceflag)
-{
- struct stat sb;
- struct timeval tv[2];
- char xname[1024], yname[1024];
- unsigned char buf[128]; /* large enough to hold one wtmp record */
- int fd1, fd2;
- size_t off, shouldbe;
- int old, new;
- time_t now, early, *t;
- struct tm tm;
- struct utmp u;
- struct outmp *ou;
- enum { OLD, NEW } which = OLD; /* what we're defaulting to */
-
- if (stat(name, &sb) == -1)
- {
- warn("Cannot stat file \"%s\", continuing.", name);
- return;
- }
-
- now = time(NULL);
- /* some point in time very early, before 386BSD 0.0 */
- tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0;
- tm.tm_mday = 1; tm.tm_mon = 2; tm.tm_year = 92;
- tm.tm_isdst = 0;
- early = mktime(&tm);
-
- tv[0].tv_sec = sb.st_atimespec.tv_sec;
- tv[0].tv_usec = sb.st_atimespec.tv_nsec / 1000;
- tv[1].tv_sec = sb.st_mtimespec.tv_sec;
- tv[1].tv_usec = sb.st_mtimespec.tv_nsec / 1000;
-
- /* unzipping is handled best externally */
- if (strlen(name) > 3 && memcmp(&name[strlen(name) - 3], ".gz", 3) == 0)
- {
- warnx("Cannot handle gzipped files, ignoring \"%s\".", name);
- return;
- }
-
- (void) snprintf(xname, sizeof xname, "%s.new", name);
- if (!nflag && (fd1 = open(xname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
- err(EX_CANTCREAT, "Can't create new wtmp file");
-
- if ((fd2 = open(name, O_RDONLY, 0)) == -1)
- err(EX_UNAVAILABLE, "input file magically disappeared, i'm confused");
-
- old = new = 0; off = 0;
- memset(buf, 0, sizeof buf);
-
- while (read(fd2, &buf[off], sizeof(time_t)) == sizeof(time_t))
- {
- t = (time_t *)&buf[off];
- off += sizeof(time_t);
- if (off < sizeof(struct outmp))
- /* go on */
- continue;
- if (*t < early || *t > now)
- {
- /* unreasonable, collect another entry */
- if (off > sizeof buf)
- {
- if (!forceflag)
- {
- (void) unlink(xname);
- errx(EX_UNAVAILABLE, "I can't seem to make sense out of file \"%s\",\n"
- "Could have forced using -f.",
- name);
- }
- else
- {
- warnx("Record # %d in file \"%s\" seems bogus\n"
- "(time: %d, previous time: %d, now: %d),\n"
- "continuing anyway.",
- old + new + 1, name, *t, early, now);
- if (which == NEW)
- {
- (void)lseek(fd2, sizeof(struct utmp) - sizeof buf, SEEK_CUR);
- goto write_new;
- }
- else
- {
- (void)lseek(fd2, sizeof(struct outmp) - sizeof buf, SEEK_CUR);
- goto write_old;
- }
- }
- }
- continue;
- }
- /* time is reasonable, we seem to have collected a full entry */
- if (off == sizeof(struct utmp))
- {
- /* new wtmp record */
- which = NEW;
- write_new:
- new++;
- if (!nflag)
- {
- if (write(fd1, buf, sizeof(struct utmp)) != sizeof(struct utmp))
- err(EX_IOERR, "writing file \"%s\"", xname);
- }
- }
- else if (off == sizeof(struct outmp))
- {
- /* old fart */
- which = OLD;
- write_old:
- old++;
- if (!nflag)
- {
- ou = (struct outmp *)buf;
- memset(&u, 0, sizeof u);
- memcpy(&u.ut_line, ou->ut_line, OUT_LINESIZE);
- memcpy(&u.ut_name, ou->ut_name, OUT_NAMESIZE);
- memcpy(&u.ut_host, ou->ut_host, OUT_HOSTSIZE);
- memcpy(&u.ut_time, &ou->ut_time, sizeof u.ut_time);
- if (write(fd1, &u, sizeof(struct utmp)) != sizeof(struct utmp))
- err(EX_IOERR, "writing file \"%s\"", xname);
- }
- }
- else
- {
- if (!forceflag)
- {
- warnx("Illegal record in file \"%s\", ignoring.", name);
- off = 0;
- continue;
- }
- else
- {
- warnx("Illegal record in file \"%s\", considering it %s one.",
- name, (which == OLD? "an old": "a new"));
- shouldbe = (which == OLD? sizeof(struct outmp): sizeof(struct utmp));
- if (off < shouldbe)
- (void)read(fd2, &buf[off], shouldbe - off);
- else
- (void)lseek(fd2, shouldbe - off, SEEK_CUR);
- if (which == OLD)
- goto write_old;
- else
- goto write_new;
- }
- }
- off = 0;
- /*
- * Since the wtmp file is in chronologically acsending order, we
- * can move the `early' time as we go. Allow for one hour
- * time-of-day adjustments.
- */
- early = *t - 3600;
- memset(buf, 0, sizeof buf);
- }
- close(fd2);
-
- printf("File \"%s\": %d old and %d new records found.\n",
- name, old, new);
-
- if (nflag)
- return;
-
- (void) close(fd1);
- (void) snprintf(yname, sizeof yname, "%s.bak", name);
-
- if (rename(name, yname) == -1)
- err(EX_OSERR, "Cannot rename \"%s\" to \"%s\"", name, yname);
-
- if (rename(xname, name) == -1)
- err(EX_OSERR, "Cannot rename \"%s\" to \"%s\"", xname, name);
-
- if (utimes(name, tv) == -1)
- warn("Cannot adjust access and modification times for \"%s\"", name);
-}
-
OpenPOWER on IntegriCloud