mirror of
https://github.com/Stichting-MINIX-Research-Foundation/pkgsrc-ng.git
synced 2025-09-28 06:26:12 -04:00
118 lines
2.8 KiB
Plaintext
118 lines
2.8 KiB
Plaintext
$NetBSD: patch-ah,v 1.3 2013/06/17 06:09:06 dholland Exp $
|
|
|
|
- Don't declare own errno.
|
|
- DragonFly BSD's partinfo is not the standard BSD partinfo.
|
|
- NetBSD no longer supports the partinfo ioctl. Use the
|
|
available alternatives, which is kind of messy.
|
|
|
|
--- blkdev.c.orig 2003-08-03 23:07:29.000000000 +0000
|
|
+++ blkdev.c
|
|
@@ -44,10 +44,20 @@
|
|
# endif
|
|
#endif
|
|
|
|
+#if defined(__DragonFly__)
|
|
+# include <sys/diskslice.h>
|
|
+# define BSD_BLKDEV
|
|
+#elif defined(__NetBSD__)
|
|
+# include <sys/disklabel.h>
|
|
+# include <sys/disk.h>
|
|
+# include <sys/param.h> /* for DEV_BSIZE, XXX */
|
|
+# define BSD_BLKDEV
|
|
+#else
|
|
#ifdef HAVE_SYS_DISKLABEL_H
|
|
# include <sys/disklabel.h>
|
|
# define BSD_BLKDEV
|
|
#endif
|
|
+#endif
|
|
|
|
#ifndef LINUX_BLKDEV
|
|
# ifndef BSD_BLKDEV
|
|
@@ -63,7 +73,6 @@
|
|
#include "wipe.h"
|
|
#include "blkdev.h"
|
|
|
|
-extern int errno;
|
|
extern int exit_code;
|
|
extern char *argvzero;
|
|
extern struct opt_s options;
|
|
@@ -128,7 +137,13 @@ public int destroy_blkdev(struct file_s
|
|
int code;
|
|
|
|
#ifdef BSD_BLKDEV
|
|
+#ifdef DIOCGPART
|
|
struct partinfo pinfo;
|
|
+#else
|
|
+ struct disklabel lab;
|
|
+ struct dkwedge_info dkw;
|
|
+ int use_dkw;
|
|
+#endif
|
|
#endif
|
|
|
|
#ifdef NO_BLKDEV
|
|
@@ -160,12 +175,26 @@ public int destroy_blkdev(struct file_s
|
|
}
|
|
|
|
#ifdef BSD_BLKDEV
|
|
+# ifdef DIOCGPART
|
|
if (ioctl(f->fd, DIOCGPART, &pinfo))
|
|
{
|
|
fprintf(stderr, "\r%s: ioctl failed, can't get disklabel for `%s': %s\n",
|
|
argvzero, f->name, strerror(errno));
|
|
exit_code = errno; return FAILED;
|
|
}
|
|
+# else
|
|
+ if (ioctl(f->fd, DIOCGDINFO, &lab) == 0) {
|
|
+ use_dkw = 0;
|
|
+ }
|
|
+ else if (ioctl(f->fd, DIOCGWEDGEINFO, &dkw) == 0) {
|
|
+ use_dkw = 1;
|
|
+ }
|
|
+ else {
|
|
+ fprintf(stderr, "\r%s: ioctl failed, can't get disklabel for `%s': %s\n",
|
|
+ argvzero, f->name, strerror(errno));
|
|
+ exit_code = errno; return FAILED;
|
|
+ }
|
|
+# endif
|
|
#endif
|
|
|
|
if (options.sectors == 0)
|
|
@@ -182,15 +211,35 @@ public int destroy_blkdev(struct file_s
|
|
options.sectors = tmp;
|
|
#endif
|
|
|
|
-#ifdef BSD_BLKDEV
|
|
+#if defined(BSD_BLKDEV)
|
|
+# if defined(__DragonFly__)
|
|
+ options.sectors = pinfo.media_blocks;
|
|
+# else
|
|
+# if defined(DIOCGPART)
|
|
options.sectors = pinfo.part->p_size;
|
|
+# else
|
|
+ options.sectors = use_dkw ?
|
|
+ dkw.dkw_size : lab.d_partitions[DISKPART(f->st.st_rdev)].p_size;
|
|
+# endif
|
|
+# endif
|
|
#endif
|
|
}
|
|
|
|
if (options.sector_size == 0)
|
|
{
|
|
-#ifdef BSD_BLKDEV
|
|
+#if defined(__DragonFly__)
|
|
+ options.sector_size = pinfo.media_blocks;
|
|
+#elif defined(BSD_BLKDEV)
|
|
+# if defined(DIOCGPART)
|
|
options.sector_size = pinfo.disklab->d_secsize;
|
|
+# else
|
|
+ /*
|
|
+ * XXX: we ought to use DIOCGDISKINFO to get the sector size,
|
|
+ * but that requires proplib and probably 500+ lines of code.
|
|
+ * So punt and use DEV_BSIZE...
|
|
+ */
|
|
+ options.sector_size = use_dkw ? DEV_BSIZE : lab.d_secsize;
|
|
+# endif
|
|
#else
|
|
options.sector_size = SECTOR_SIZE;
|
|
#endif
|