summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsing <jsing@openbsd.org>2014-06-09 15:50:08 +0000
committerjsing <jsing@openbsd.org>2014-06-09 15:50:08 +0000
commit6a1403f6b8b1bbcbd5c56cd55e30c00a2500b956 (patch)
tree0cdac873d35a621a38ae57f6a4627dc1102f5cbb
parentDoh, traps 128 and 129 need to point to sigsys, not unknown_vector. (diff)
downloadwireguard-openbsd-6a1403f6b8b1bbcbd5c56cd55e30c00a2500b956.tar.xz
wireguard-openbsd-6a1403f6b8b1bbcbd5c56cd55e30c00a2500b956.zip
Change the installboot file copying process so that it carefully
overwrites the existing file, before truncating it to the final length. This means that we will keep the same inode and potentially retain the same disk data block allocation between runs. This will aid users who multiboot since it makes it less likely that the PBR will change, although as before, there is no guarantee. Obviously if the second stage boot loader grows or shrinks then the PBR will change regardless.
-rw-r--r--usr.sbin/installboot/i386_installboot.c5
-rw-r--r--usr.sbin/installboot/util.c27
2 files changed, 13 insertions, 19 deletions
diff --git a/usr.sbin/installboot/i386_installboot.c b/usr.sbin/installboot/i386_installboot.c
index fff16853700..ad1d65c4ff0 100644
--- a/usr.sbin/installboot/i386_installboot.c
+++ b/usr.sbin/installboot/i386_installboot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: i386_installboot.c,v 1.2 2014/04/27 13:41:50 krw Exp $ */
+/* $OpenBSD: i386_installboot.c,v 1.3 2014/06/09 15:50:08 jsing Exp $ */
/* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
/*
@@ -137,6 +137,9 @@ md_installboot(int devfd, char *dev)
warnx("disklabel type unknown");
bootldr = fileprefix(root, bootldr);
+ if (verbose)
+ fprintf(stderr, "%s %s to %s\n",
+ (nowrite ? "would copy" : "copying"), stage2, bootldr);
if (!nowrite)
filecopy(stage2, bootldr);
diff --git a/usr.sbin/installboot/util.c b/usr.sbin/installboot/util.c
index faa44ff3e3f..a8fa8fa085f 100644
--- a/usr.sbin/installboot/util.c
+++ b/usr.sbin/installboot/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.3 2014/01/19 03:48:07 jsing Exp $ */
+/* $OpenBSD: util.c,v 1.4 2014/06/09 15:50:08 jsing Exp $ */
/*
* Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
@@ -32,34 +32,29 @@
void
filecopy(const char *srcfile, const char *dstfile)
{
- char *buf, tempfile[MAXPATHLEN];
struct stat sb;
ssize_t sz, n;
int sfd, dfd;
+ char *buf;
if ((buf = malloc(BUFSIZE)) == NULL)
err(1, "malloc");
sfd = open(srcfile, O_RDONLY);
if (sfd == -1)
- err(1, "open");
+ err(1, "open %s", srcfile);
if (fstat(sfd, &sb) == -1)
err(1, "fstat");
sz = sb.st_size;
- snprintf(tempfile, sizeof(tempfile), "%s.XXXXXXXX", dstfile);
- dfd = mkstemp(tempfile);
+ dfd = open(dstfile, O_WRONLY|O_CREAT);
if (dfd == -1)
- err(1, "mkstemp");
-
- if (chown(tempfile, 0, 0) == -1)
+ err(1, "open %s", dstfile);
+ if (fchown(dfd, 0, 0) == -1)
err(1, "chown");
- if (chmod(tempfile, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1)
+ if (fchmod(dfd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1)
err(1, "chmod");
- if (verbose)
- fprintf(stderr, "Copying %s to %s\n", srcfile, tempfile);
-
while (sz > 0) {
n = MIN(sz, BUFSIZE);
if ((n = read(sfd, buf, n)) == -1)
@@ -69,15 +64,11 @@ filecopy(const char *srcfile, const char *dstfile)
err(1, "write");
}
+ ftruncate(dfd, sb.st_size);
+
close(dfd);
close(sfd);
free(buf);
-
- if (verbose)
- fprintf(stderr, "Renaming %s to %s\n", tempfile, dstfile);
-
- if (rename(tempfile, dstfile) == -1)
- err(1, "rename");
}
char *