summaryrefslogtreecommitdiffstats
path: root/sbin/geom
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2004-07-05 02:06:44 +0000
committerpjd <pjd@FreeBSD.org>2004-07-05 02:06:44 +0000
commitd117b211a39aed9bac0d62796046910fc1b0f224 (patch)
tree6c55177b2ea40eeba47a5fc3ef6e64105b5244bb /sbin/geom
parent471ab74bb24fc86706d4119e21c90d73160f3881 (diff)
downloadFreeBSD-src-d117b211a39aed9bac0d62796046910fc1b0f224.zip
FreeBSD-src-d117b211a39aed9bac0d62796046910fc1b0f224.tar.gz
MFp4: gmirror(8) is coming soon, and we need g_metadata_read() there.
Diffstat (limited to 'sbin/geom')
-rw-r--r--sbin/geom/misc/subr.c53
-rw-r--r--sbin/geom/misc/subr.h2
2 files changed, 55 insertions, 0 deletions
diff --git a/sbin/geom/misc/subr.c b/sbin/geom/misc/subr.c
index ae639b7..a0525af 100644
--- a/sbin/geom/misc/subr.c
+++ b/sbin/geom/misc/subr.c
@@ -134,6 +134,59 @@ g_get_sectorsize(const char *name)
}
int
+g_metadata_read(const char *name, u_char *md, size_t size, const char *magic)
+{
+ struct std_metadata stdmd;
+ char path[MAXPATHLEN];
+ unsigned sectorsize;
+ off_t mediasize;
+ u_char *sector;
+ int error, fd;
+
+ pathgen(name, path, sizeof(path));
+ sector = NULL;
+ error = 0;
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ return (errno);
+ mediasize = g_get_mediasize(name);
+ if (mediasize == 0) {
+ error = errno;
+ goto out;
+ }
+ sectorsize = g_get_sectorsize(name);
+ if (sectorsize == 0) {
+ error = errno;
+ goto out;
+ }
+ assert(sectorsize >= size);
+ sector = malloc(sectorsize);
+ if (sector == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
+ if (pread(fd, sector, sectorsize, mediasize - sectorsize) !=
+ (ssize_t)sectorsize) {
+ error = errno;
+ goto out;
+ }
+ if (magic != NULL) {
+ std_metadata_decode(sector, &stdmd);
+ if (strcmp(stdmd.md_magic, magic) != 0) {
+ error = EINVAL;
+ goto out;
+ }
+ }
+ bcopy(sector, md, size);
+out:
+ if (sector != NULL)
+ free(sector);
+ close(fd);
+ return (error);
+}
+
+int
g_metadata_store(const char *name, u_char *md, size_t size)
{
char path[MAXPATHLEN];
diff --git a/sbin/geom/misc/subr.h b/sbin/geom/misc/subr.h
index f88af01..ee319a9 100644
--- a/sbin/geom/misc/subr.h
+++ b/sbin/geom/misc/subr.h
@@ -33,6 +33,8 @@ unsigned g_lcm(unsigned a, unsigned b);
off_t g_get_mediasize(const char *name);
unsigned g_get_sectorsize(const char *name);
+int g_metadata_read(const char *name, u_char *md, size_t size,
+ const char *magic);
int g_metadata_store(const char *name, u_char *md, size_t size);
int g_metadata_clear(const char *name, const char *magic);
OpenPOWER on IntegriCloud