summaryrefslogtreecommitdiffstats
path: root/usr.sbin/installboot/util.c
diff options
context:
space:
mode:
authorjsing <jsing@openbsd.org>2014-01-18 03:07:05 +0000
committerjsing <jsing@openbsd.org>2014-01-18 03:07:05 +0000
commit7762a34bea7c67d99ecb6c2d3cae4fbd5adf1134 (patch)
treeb2d8d2893e1b37d64ba81644e67b678e48701b97 /usr.sbin/installboot/util.c
parentAdd a -r flag that allows for the mount point of the root filesystem to be (diff)
downloadwireguard-openbsd-7762a34bea7c67d99ecb6c2d3cae4fbd5adf1134.tar.xz
wireguard-openbsd-7762a34bea7c67d99ecb6c2d3cae4fbd5adf1134.zip
Make installboot(8) easier to use - copy the second stage boot loader to
the default location used by the given architecture. This eliminates the need to copy it over manually prior to running installboot.
Diffstat (limited to 'usr.sbin/installboot/util.c')
-rw-r--r--usr.sbin/installboot/util.c58
1 files changed, 57 insertions, 1 deletions
diff --git a/usr.sbin/installboot/util.c b/usr.sbin/installboot/util.c
index 77cdc048180..42221e65e6d 100644
--- a/usr.sbin/installboot/util.c
+++ b/usr.sbin/installboot/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.1 2014/01/18 02:47:27 jsing Exp $ */
+/* $OpenBSD: util.c,v 1.2 2014/01/18 03:07:05 jsing Exp $ */
/*
* Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
@@ -17,13 +17,69 @@
*/
#include <sys/param.h>
+#include <sys/stat.h>
#include <err.h>
+#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "installboot.h"
+#define BUFSIZE 2048
+
+void
+filecopy(const char *srcfile, const char *dstfile)
+{
+ char *buf, tempfile[MAXPATHLEN];
+ struct stat sb;
+ ssize_t sz, n;
+ int sfd, dfd;
+
+ if ((buf = malloc(BUFSIZE)) == NULL)
+ err(1, "malloc");
+
+ sfd = open(srcfile, O_RDONLY);
+ if (sfd == -1)
+ err(1, "open");
+ if (fstat(sfd, &sb) == -1)
+ err(1, "fstat");
+ sz = sb.st_size;
+
+ snprintf(tempfile, sizeof(tempfile), "%s.XXXXXXXX", dstfile);
+ dfd = mkstemp(tempfile);
+ if (dfd == -1)
+ err(1, "mkstemp");
+
+ if (chown(tempfile, 0, 0) == -1)
+ err(1, "chown");
+ if (chmod(tempfile, 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)
+ err(1, "read");
+ sz -= n;
+ if (write(dfd, buf, n) != n)
+ err(1, "write");
+ }
+
+ 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 *
fileprefix(const char *base, const char *path)
{