aboutsummaryrefslogtreecommitdiff
path: root/sysutils/linuxfdisk/files/linuxfdisk-sys_bsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/linuxfdisk/files/linuxfdisk-sys_bsd.c')
-rw-r--r--sysutils/linuxfdisk/files/linuxfdisk-sys_bsd.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/sysutils/linuxfdisk/files/linuxfdisk-sys_bsd.c b/sysutils/linuxfdisk/files/linuxfdisk-sys_bsd.c
new file mode 100644
index 000000000000..22767ba366b7
--- /dev/null
+++ b/sysutils/linuxfdisk/files/linuxfdisk-sys_bsd.c
@@ -0,0 +1,72 @@
+#include <sys/param.h>
+#include <sys/disklabel.h>
+#if __FreeBSD_version < 500000
+#include <sys/diskslice.h>
+#else
+#include <sys/disk.h>
+#include <errno.h>
+#endif
+#include <stddef.h>
+#include "common.h"
+
+unsigned int
+sys_bsd_sectorsize(int fd)
+{
+#ifdef DIOCGSECTORSIZE
+ unsigned int d;
+ if (ioctl(fd, DIOCGSECTORSIZE, &d) == 0)
+ return d;
+#else
+ struct disklabel dl;
+ if (ioctl(fd, DIOCGDINFO, &dl) == 0)
+ return dl.d_secsize;
+#endif
+ return 0;
+}
+
+int
+sys_bsd_getsectors(int fd, unsigned long *s)
+{
+ /* XXX */
+#if defined(DIOCGMEDIASIZE) && defined(DIOCGSECTORSIZE)
+ off_t fullsize;
+ unsigned sectsize;
+ if (ioctl(fd, DIOCGMEDIASIZE, &fullsize) ||
+ ioctl(fd, DIOCGSECTORSIZE, &sectsize))
+ return -1;
+ *s = fullsize / sectsize;
+ return 0;
+#else
+ struct disklabel dl;
+ if (ioctl(fd, DIOCGDINFO, &dl) < 0)
+ return -1;
+ *s = (unsigned long) dl.d_ncylinders *
+ (unsigned long) dl.d_ntracks *
+ (unsigned long) dl.d_nsectors;
+ return 0;
+#endif
+}
+
+int
+sys_bsd_ptsync(int fd)
+{
+#ifdef DIOCSYNCSLICEINFO
+ return ioctl(fd, DIOCSYNCSLICEINFO, NULL);
+#else
+ errno = EINVAL;
+ return -1;
+#endif
+}
+
+int
+sys_bsd_getgeometry(int fd, struct hd_geometry *g)
+{
+ /* XXX */
+ struct disklabel dl;
+ if (ioctl(fd, DIOCGDINFO, &dl) < 0)
+ return -1;
+ g->cylinders = dl.d_ncylinders;
+ g->heads = dl.d_ntracks;
+ g->sectors = dl.d_nsectors;
+ return 0;
+}