diff options
author | 2015-11-13 02:27:17 +0000 | |
---|---|---|
committer | 2015-11-13 02:27:17 +0000 | |
commit | 0468c08fb6167cb97b9d5edc07c92bba65e584e4 (patch) | |
tree | 0c4b9dc84f000e307d08bc2e202fee697a9757cb | |
parent | 4-step pledge in a program noone really uses anymore. (diff) | |
download | wireguard-openbsd-0468c08fb6167cb97b9d5edc07c92bba65e584e4.tar.xz wireguard-openbsd-0468c08fb6167cb97b9d5edc07c92bba65e584e4.zip |
Move from opening/closing disk for every i/o to opening the disk once
and saving the fd in the global 'disk' structure. Stop passing around
fd's and just use the global.
Makes pledge() feasible.
Prompted by and ok deraadt@
-rw-r--r-- | sbin/fdisk/cmd.c | 19 | ||||
-rw-r--r-- | sbin/fdisk/disk.c | 72 | ||||
-rw-r--r-- | sbin/fdisk/disk.h | 12 | ||||
-rw-r--r-- | sbin/fdisk/fdisk.c | 11 | ||||
-rw-r--r-- | sbin/fdisk/gpt.c | 54 | ||||
-rw-r--r-- | sbin/fdisk/gpt.h | 8 | ||||
-rw-r--r-- | sbin/fdisk/mbr.c | 30 | ||||
-rw-r--r-- | sbin/fdisk/mbr.h | 8 | ||||
-rw-r--r-- | sbin/fdisk/user.c | 19 |
9 files changed, 96 insertions, 137 deletions
diff --git a/sbin/fdisk/cmd.c b/sbin/fdisk/cmd.c index 9c2de8b3d3b..ba2feca8b37 100644 --- a/sbin/fdisk/cmd.c +++ b/sbin/fdisk/cmd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd.c,v 1.84 2015/11/03 14:20:00 krw Exp $ */ +/* $OpenBSD: cmd.c,v 1.85 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -397,7 +397,7 @@ int Xwrite(char *args, struct mbr *mbr) { struct dos_mbr dos_mbr; - int fd, i, n; + int i, n; for (i = 0, n = 0; i < NDOSPART; i++) if (mbr->part[i].id == 0xA6) @@ -408,37 +408,28 @@ Xwrite(char *args, struct mbr *mbr) return (CMD_CONT); } - fd = DISK_open(disk.name, O_RDWR); MBR_make(mbr, &dos_mbr); printf("Writing MBR at offset %lld.\n", (long long)mbr->offset); - if (MBR_write(fd, mbr->offset, &dos_mbr) == -1) { - int saved_errno = errno; + if (MBR_write(mbr->offset, &dos_mbr) == -1) { warn("error writing MBR"); - close(fd); - errno = saved_errno; return (CMD_CONT); } if (letoh64(gh.gh_sig) == GPTSIGNATURE) { printf("Writing GPT.\n"); - if (GPT_write(fd) == -1) { - int saved_errno = errno; + if (GPT_write() == -1) { warn("error writing GPT"); - close(fd); - errno = saved_errno; return (CMD_CONT); } } else if (reinited) { /* Make sure GPT doesn't get in the way. */ - MBR_zapgpt(fd, &dos_mbr, DL_GETDSIZE(&dl) - 1); + MBR_zapgpt(&dos_mbr, DL_GETDSIZE(&dl) - 1); } /* Refresh in memory copy to reflect what was just written. */ MBR_parse(&dos_mbr, mbr->offset, mbr->reloffset, mbr); - close(fd); - return (CMD_CLEAN); } diff --git a/sbin/fdisk/disk.c b/sbin/fdisk/disk.c index d6829094fb3..f191e60c596 100644 --- a/sbin/fdisk/disk.c +++ b/sbin/fdisk/disk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disk.c,v 1.49 2015/11/11 15:39:18 krw Exp $ */ +/* $OpenBSD: disk.c,v 1.50 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -36,49 +36,37 @@ struct disk disk; struct disklabel dl; -int -DISK_open(char *disk, int mode) +void +DISK_open(void) { struct stat st; - int fd; + u_int64_t sz, spc; - fd = opendev(disk, mode, OPENDEV_PART, NULL); - if (fd == -1) - err(1, "%s", disk); - if (fstat(fd, &st) == -1) - err(1, "%s", disk); + disk.fd = opendev(disk.name, O_RDWR, OPENDEV_PART, NULL); + if (disk.fd == -1) + err(1, "%s", disk.name); + if (fstat(disk.fd, &st) == -1) + err(1, "%s", disk.name); if (!S_ISCHR(st.st_mode) && !S_ISREG(st.st_mode)) errx(1, "%s is not a character device or a regular file", disk); - return (fd); -} - -void -DISK_getlabelgeometry(void) -{ - u_int64_t sz, spc; - int fd; - /* Get label geometry. */ - if ((fd = DISK_open(disk.name, O_RDONLY)) != -1) { - if (ioctl(fd, DIOCGPDINFO, &dl) == -1) { - warn("DIOCGPDINFO"); - } else { - disk.cylinders = dl.d_ncylinders; - disk.heads = dl.d_ntracks; - disk.sectors = dl.d_nsectors; - /* MBR handles only first UINT32_MAX sectors. */ - spc = (u_int64_t)disk.heads * disk.sectors; - sz = DL_GETDSIZE(&dl); - if (sz > UINT32_MAX) { - disk.cylinders = UINT32_MAX / spc; - disk.size = disk.cylinders * spc; - } else - disk.size = sz; - unit_types[SECTORS].conversion = dl.d_secsize; - } - close(fd); + if (ioctl(disk.fd, DIOCGPDINFO, &dl) == -1) { + warn("DIOCGPDINFO"); + } else { + disk.cylinders = dl.d_ncylinders; + disk.heads = dl.d_ntracks; + disk.sectors = dl.d_nsectors; + /* MBR handles only first UINT32_MAX sectors. */ + spc = (u_int64_t)disk.heads * disk.sectors; + sz = DL_GETDSIZE(&dl); + if (sz > UINT32_MAX) { + disk.cylinders = UINT32_MAX / spc; + disk.size = disk.cylinders * spc; + } else + disk.size = sz; + unit_types[SECTORS].conversion = dl.d_secsize; } } @@ -116,7 +104,7 @@ DISK_printgeometry(char *units) * The caller must free() the memory it gets. */ char * -DISK_readsector(int fd, off_t where) +DISK_readsector(off_t where) { int secsize; char *secbuf; @@ -126,7 +114,7 @@ DISK_readsector(int fd, off_t where) secsize = dl.d_secsize; where *= secsize; - off = lseek(fd, where, SEEK_SET); + off = lseek(disk.fd, where, SEEK_SET); if (off != where) return (NULL); @@ -134,7 +122,7 @@ DISK_readsector(int fd, off_t where) if (secbuf == NULL) return (NULL); - len = read(fd, secbuf, secsize); + len = read(disk.fd, secbuf, secsize); if (len == -1 || len != secsize) { free(secbuf); return (NULL); @@ -149,7 +137,7 @@ DISK_readsector(int fd, off_t where) * errno if the write fails. */ int -DISK_writesector(int fd, char *secbuf, off_t where) +DISK_writesector(char *secbuf, off_t where) { int secsize; ssize_t len; @@ -159,9 +147,9 @@ DISK_writesector(int fd, char *secbuf, off_t where) secsize = dl.d_secsize; where *= secsize; - off = lseek(fd, where, SEEK_SET); + off = lseek(disk.fd, where, SEEK_SET); if (off == where) - len = write(fd, secbuf, secsize); + len = write(disk.fd, secbuf, secsize); if (len == -1 || len != secsize) { /* short read or write */ diff --git a/sbin/fdisk/disk.h b/sbin/fdisk/disk.h index c77dc16c2f6..e65b4cfac9f 100644 --- a/sbin/fdisk/disk.h +++ b/sbin/fdisk/disk.h @@ -1,4 +1,4 @@ -/* $OpenBSD: disk.h,v 1.19 2015/03/30 17:11:49 krw Exp $ */ +/* $OpenBSD: disk.h,v 1.20 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -20,18 +20,18 @@ #define _DISK_H struct disk { - char *name; + char *name; + int fd; u_int32_t cylinders; u_int32_t heads; u_int32_t sectors; u_int32_t size; }; -int DISK_open(char *, int); -void DISK_getlabelgeometry(void); +void DISK_open(void); int DISK_printgeometry(char *); -char *DISK_readsector(int, off_t); -int DISK_writesector(int, char *, off_t); +char *DISK_readsector(off_t); +int DISK_writesector(char *, off_t); extern struct disk disk; extern struct disklabel dl; diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c index e19396bfbc7..5646c5926a5 100644 --- a/sbin/fdisk/fdisk.c +++ b/sbin/fdisk/fdisk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fdisk.c,v 1.80 2015/11/11 15:39:18 krw Exp $ */ +/* $OpenBSD: fdisk.c,v 1.81 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -149,8 +149,7 @@ main(int argc, char *argv[]) else disk.name = argv[0]; - /* Start with the disklabel geometry and get the sector size. */ - DISK_getlabelgeometry(); + DISK_open(); if (b_arg > 0 && i_flag == 0) { warnx("-b specified without -i"); @@ -199,9 +198,7 @@ main(int argc, char *argv[]) /* Create initial/default MBR. */ if (i_flag == 0) { - fd = DISK_open(disk.name, O_RDONLY); - error = MBR_read(fd, 0, &dos_mbr); - close(fd); + error = MBR_read(0, &dos_mbr); if (error) errx(1, "Can't read sector 0!"); MBR_parse(&dos_mbr, 0, 0, &initial_mbr); @@ -252,5 +249,7 @@ main(int argc, char *argv[]) if (e_flag) USER_edit(0, 0); + close(disk.fd); + return (0); } diff --git a/sbin/fdisk/gpt.c b/sbin/fdisk/gpt.c index 72a9a250b7d..a0e604ef5d8 100644 --- a/sbin/fdisk/gpt.c +++ b/sbin/fdisk/gpt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gpt.c,v 1.4 2015/11/12 21:31:36 krw Exp $ */ +/* $OpenBSD: gpt.c,v 1.5 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 2015 Markus Muller <mmu@grummel.net> * Copyright (c) 2015 Kenneth R Westerback <krw@openbsd.org> @@ -45,14 +45,14 @@ struct gpt_header gh; struct gpt_partition gp[NGPTPARTITIONS]; int -GPT_get_header(int fd, off_t where) +GPT_get_header(off_t where) { char *secbuf; uint64_t partlastlba; int partspersec; uint32_t orig_gh_csum, new_gh_csum; - secbuf = DISK_readsector(fd, where); + secbuf = DISK_readsector(where); if (secbuf == 0) return (1); @@ -146,7 +146,7 @@ GPT_get_header(int fd, off_t where) } int -GPT_get_partition_table(int fd, off_t where) +GPT_get_partition_table(off_t where) { ssize_t len; off_t off; @@ -167,13 +167,13 @@ GPT_get_partition_table(int fd, off_t where) memset(&gp, 0, sizeof(gp)); where *= dl.d_secsize; - off = lseek(fd, where, SEEK_SET); + off = lseek(disk.fd, where, SEEK_SET); if (off == -1) { DPRINTF("seek to gpt partition table @ sector %llu failed\n", (unsigned long long)where / dl.d_secsize); return (1); } - len = read(fd, &gp, secs * dl.d_secsize); + len = read(disk.fd, &gp, secs * dl.d_secsize); if (len == -1 || len != secs * dl.d_secsize) { DPRINTF("gpt partition table read failed.\n"); return (1); @@ -193,31 +193,23 @@ GPT_get_partition_table(int fd, off_t where) int GPT_get_gpt(void) { - int fd, privalid, altvalid; - - fd = DISK_open(disk.name, O_RDONLY); + int privalid, altvalid; /* * primary header && primary partition table || * alt header && alt partition table */ - privalid = GPT_get_header(fd, GPTSECTOR); + privalid = GPT_get_header(GPTSECTOR); + if (privalid == 0) + privalid = GPT_get_partition_table(gh.gh_part_lba); if (privalid == 0) - privalid = GPT_get_partition_table(fd, gh.gh_part_lba); - if (privalid == 0) { - close(fd); return (0); - } - altvalid = GPT_get_header(fd, DL_GETDSIZE(&dl) - 1); + altvalid = GPT_get_header(DL_GETDSIZE(&dl) - 1); + if (altvalid == 0) + altvalid = GPT_get_partition_table(gh.gh_part_lba); if (altvalid == 0) - altvalid = GPT_get_partition_table(fd, gh.gh_part_lba); - if (altvalid == 0) { - close(fd); return (0); - } - - close(fd); return (1); } @@ -383,7 +375,7 @@ GPT_init(void) } int -GPT_write(int fd) +GPT_write(void) { char *secbuf; const int secsize = unit_types[SECTORS].conversion; @@ -406,12 +398,12 @@ GPT_write(int fd) gh.gh_csum = 0; gh.gh_csum = crc32((unsigned char *)&gh, letoh32(gh.gh_size)); - secbuf = DISK_readsector(fd, 1); + secbuf = DISK_readsector(1); if (secbuf == NULL) return (-1); memcpy(secbuf, &gh, sizeof(gh)); - DISK_writesector(fd, secbuf, 1); + DISK_writesector(secbuf, 1); free(secbuf); gh.gh_lba_self = htole64(altgh); @@ -420,12 +412,12 @@ GPT_write(int fd) gh.gh_csum = 0; gh.gh_csum = crc32((unsigned char *)&gh, letoh32(gh.gh_size)); - secbuf = DISK_readsector(fd, altgh); + secbuf = DISK_readsector(altgh); if (secbuf == NULL) return (-1); memcpy(secbuf, &gh, sizeof(gh)); - DISK_writesector(fd, secbuf, altgh); + DISK_writesector(secbuf, altgh); free(secbuf); /* @@ -435,9 +427,9 @@ GPT_write(int fd) * XXX ALWAYS NGPTPARTITIONS! * XXX ASSUME gp is multiple of sector size! */ - off = lseek(fd, secsize * 2, SEEK_SET); + off = lseek(disk.fd, secsize * 2, SEEK_SET); if (off == secsize * 2) - len = write(fd, &gp, sizeof(gp)); + len = write(disk.fd, &gp, sizeof(gp)); else len = -1; if (len == -1 || len != sizeof(gp)) { @@ -445,9 +437,9 @@ GPT_write(int fd) return (-1); } - off = lseek(fd, secsize * altgp, SEEK_SET); + off = lseek(disk.fd, secsize * altgp, SEEK_SET); if (off == secsize * altgp) - len = write(fd, &gp, sizeof(gp)); + len = write(disk.fd, &gp, sizeof(gp)); else len = -1; @@ -457,7 +449,7 @@ GPT_write(int fd) } /* Refresh in-kernel disklabel from the updated disk information. */ - ioctl(fd, DIOCRLDINFO, 0); + ioctl(disk.fd, DIOCRLDINFO, 0); return (0); } diff --git a/sbin/fdisk/gpt.h b/sbin/fdisk/gpt.h index 1caca02305b..a428709dedc 100644 --- a/sbin/fdisk/gpt.h +++ b/sbin/fdisk/gpt.h @@ -1,4 +1,4 @@ -/* $OpenBSD: gpt.h,v 1.2 2015/10/26 15:08:26 krw Exp $ */ +/* $OpenBSD: gpt.h,v 1.3 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 2015 Markus Muller <mmu@grummel.net> * Copyright (c) 2015 Kenneth R Westerback <krw@openbsd.org> @@ -16,11 +16,11 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -int GPT_get_hdr(int, off_t); -int GPT_get_partition_table(int, off_t); +int GPT_get_hdr(off_t); +int GPT_get_partition_table(off_t); int GPT_get_gpt(void); int GPT_init(void); -int GPT_write(int); +int GPT_write(void); void GPT_print(char *); void GPT_print_part(int, char *); diff --git a/sbin/fdisk/mbr.c b/sbin/fdisk/mbr.c index 0d291481665..8a713ae942e 100644 --- a/sbin/fdisk/mbr.c +++ b/sbin/fdisk/mbr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mbr.c,v 1.59 2015/11/12 23:49:37 krw Exp $ */ +/* $OpenBSD: mbr.c,v 1.60 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -214,11 +214,11 @@ MBR_print(struct mbr *mbr, char *units) } int -MBR_read(int fd, off_t where, struct dos_mbr *dos_mbr) +MBR_read(off_t where, struct dos_mbr *dos_mbr) { char *secbuf; - secbuf = DISK_readsector(fd, where); + secbuf = DISK_readsector(where); if (secbuf == NULL) return (-1); @@ -229,11 +229,11 @@ MBR_read(int fd, off_t where, struct dos_mbr *dos_mbr) } int -MBR_write(int fd, off_t where, struct dos_mbr *dos_mbr) +MBR_write(off_t where, struct dos_mbr *dos_mbr) { char *secbuf; - secbuf = DISK_readsector(fd, where); + secbuf = DISK_readsector(where); if (secbuf == NULL) return (-1); @@ -242,10 +242,10 @@ MBR_write(int fd, off_t where, struct dos_mbr *dos_mbr) * write the sector back to "disk". */ memcpy(secbuf, dos_mbr, sizeof(*dos_mbr)); - DISK_writesector(fd, secbuf, where); + DISK_writesector(secbuf, where); /* Refresh in-kernel disklabel from the updated disk information. */ - ioctl(fd, DIOCRLDINFO, 0); + ioctl(disk.fd, DIOCRLDINFO, 0); free(secbuf); @@ -261,11 +261,9 @@ MBR_pcopy(struct mbr *mbr) { struct dos_partition dos_parts[NDOSPART]; struct dos_mbr dos_mbr; - int i, fd, error; + int i, error; - fd = DISK_open(disk.name, O_RDONLY); - error = MBR_read(fd, 0, &dos_mbr); - close(fd); + error = MBR_read(0, &dos_mbr); if (error == -1) return; @@ -283,7 +281,7 @@ MBR_pcopy(struct mbr *mbr) * confused. */ void -MBR_zapgpt(int fd, struct dos_mbr *dos_mbr, uint64_t lastsec) +MBR_zapgpt(struct dos_mbr *dos_mbr, uint64_t lastsec) { struct dos_partition dos_parts[NDOSPART]; char *secbuf; @@ -297,25 +295,25 @@ MBR_zapgpt(int fd, struct dos_mbr *dos_mbr, uint64_t lastsec) (dos_parts[i].dp_typ == DOSPTYP_EFISYS)) return; - secbuf = DISK_readsector(fd, GPTSECTOR); + secbuf = DISK_readsector(GPTSECTOR); if (secbuf == NULL) return; memcpy(&sig, secbuf, sizeof(sig)); if (letoh64(sig) == GPTSIGNATURE) { memset(secbuf, 0, sizeof(sig)); - DISK_writesector(fd, secbuf, GPTSECTOR); + DISK_writesector(secbuf, GPTSECTOR); } free(secbuf); - secbuf = DISK_readsector(fd, lastsec); + secbuf = DISK_readsector(lastsec); if (secbuf == NULL) return; memcpy(&sig, secbuf, sizeof(sig)); if (letoh64(sig) == GPTSIGNATURE) { memset(secbuf, 0, sizeof(sig)); - DISK_writesector(fd, secbuf, lastsec); + DISK_writesector(secbuf, lastsec); } free(secbuf); } diff --git a/sbin/fdisk/mbr.h b/sbin/fdisk/mbr.h index 0673f87fb45..7bb8bfb6f02 100644 --- a/sbin/fdisk/mbr.h +++ b/sbin/fdisk/mbr.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mbr.h,v 1.26 2015/10/26 15:08:26 krw Exp $ */ +/* $OpenBSD: mbr.h,v 1.27 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -34,10 +34,10 @@ void MBR_parse(struct dos_mbr *, off_t, off_t, struct mbr *); void MBR_make(struct mbr *, struct dos_mbr *); void MBR_init(struct mbr *); void MBR_init_GPT(struct mbr *); -int MBR_read(int, off_t, struct dos_mbr *); -int MBR_write(int, off_t, struct dos_mbr *); +int MBR_read(off_t, struct dos_mbr *); +int MBR_write(off_t, struct dos_mbr *); void MBR_pcopy(struct mbr *); -void MBR_zapgpt(int, struct dos_mbr *, uint64_t); +void MBR_zapgpt(struct dos_mbr *, uint64_t); void MBR_init_GPT(struct mbr *); int MBR_protective_mbr(struct mbr *); diff --git a/sbin/fdisk/user.c b/sbin/fdisk/user.c index 40d40a73253..b02b712d86a 100644 --- a/sbin/fdisk/user.c +++ b/sbin/fdisk/user.c @@ -1,4 +1,4 @@ -/* $OpenBSD: user.c,v 1.45 2015/10/26 15:08:26 krw Exp $ */ +/* $OpenBSD: user.c,v 1.46 2015/11/13 02:27:17 krw Exp $ */ /* * Copyright (c) 1997 Tobias Weingartner @@ -24,7 +24,6 @@ #include <string.h> #include <unistd.h> -#include "disk.h" #include "part.h" #include "mbr.h" #include "misc.h" @@ -62,15 +61,13 @@ USER_edit(off_t offset, off_t reloff) struct dos_mbr dos_mbr; struct mbr mbr; char *cmd, *args; - int i, st, fd, error; + int i, st, error; /* One level deeper */ editlevel += 1; /* Read MBR & partition */ - fd = DISK_open(disk.name, O_RDONLY); - error = MBR_read(fd, offset, &dos_mbr); - close(fd); + error = MBR_read(offset, &dos_mbr); if (error == -1) goto done; @@ -122,7 +119,6 @@ again: if (st == CMD_SAVE) { if (Xwrite(NULL, &mbr) == CMD_CONT) goto again; - close(fd); } else printf("Aborting changes to current MBR.\n"); } @@ -136,15 +132,14 @@ void USER_print_disk(void) { off_t offset, firstoff; - int fd, i, error; + int i, error; struct dos_mbr dos_mbr; struct mbr mbr; - fd = DISK_open(disk.name, O_RDONLY); offset = firstoff = 0; do { - error = MBR_read(fd, offset, &dos_mbr); + error = MBR_read(offset, &dos_mbr); if (error == -1) break; MBR_parse(&dos_mbr, offset, firstoff, &mbr); @@ -166,8 +161,4 @@ USER_print_disk(void) firstoff = offset; } } while (offset); - - error = close(fd); - if (error == -1) - err(1, "Unable to close disk"); } |