From 88b5b78d59c69968024c810165c41993e4aeaf40 Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Mon, 27 Dec 2004 17:20:06 +0000 Subject: [PATCH] Rewrite piece of code which I committed some time ago that allows to show file name for 'mdconfig -l -u ' command. This allows to preserve API/ABI compatibility with version 0 (that's why I changed version number back to 0) and will allow to merge this change to RELENG_5. MFC after: 5 days --- sbin/mdconfig/mdconfig.c | 6 +++++- sys/dev/md/md.c | 18 ++++++++---------- sys/sys/mdioctl.h | 4 ++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c index d4cca40b1e49..0e6d81804e20 100644 --- a/sbin/mdconfig/mdconfig.c +++ b/sbin/mdconfig/mdconfig.c @@ -60,6 +60,10 @@ main(int argc, char **argv) int cmdline = 0; bzero(&mdio, sizeof(mdio)); + mdio.md_file = malloc(PATH_MAX); + if (mdio.md_file == NULL) + err(1, "could not allocate memory"); + bzero(mdio.md_file, PATH_MAX); for (;;) { ch = getopt(argc, argv, "ab:df:lno:s:S:t:u:x:y:"); if (ch == -1) @@ -223,7 +227,7 @@ main(int argc, char **argv) if (mdio.md_mediasize == 0) errx(1, "must specify -s for -t malloc or -t swap"); if (cmdline == 2 && mdio.md_type == MD_VNODE) - if (mdio.md_file == NULL) + if (mdio.md_file[0] == '\0') errx(1, "must specify -f for -t vnode"); if (action == LIST) { if (mdio.md_options & MD_AUTOUNIT) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 775728f2ed0f..8c35d8561df8 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -862,10 +862,9 @@ mdcreate_vnode(struct md_s *sc, struct md_ioctl *mdio, struct thread *td) struct nameidata nd; int error, flags; - if (strlcpy(sc->file, mdio->md_file, sizeof(sc->file)) >= - sizeof(sc->file)) { - return (ENAMETOOLONG); - } + error = copyinstr(mdio->md_file, sc->file, sizeof(sc->file), NULL); + if (error != 0) + return (error); flags = FREAD|FWRITE; NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, sc->file, td); error = vn_open(&nd, &flags, 0, -1); @@ -1087,8 +1086,7 @@ mdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread case MDIOCDETACH: if (mdio->md_version != MDIOVERSION) return (EINVAL); - if (mdio->md_file[0] != '\0' || mdio->md_mediasize != 0 || - mdio->md_options != 0) + if (mdio->md_mediasize != 0 || mdio->md_options != 0) return (EINVAL); return (mddetach(mdio->md_unit, td)); case MDIOCQUERY: @@ -1102,10 +1100,10 @@ mdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread mdio->md_mediasize = sc->mediasize; mdio->md_sectorsize = sc->sectorsize; if (sc->type == MD_VNODE) { - if (strlcpy(mdio->md_file, sc->file, - sizeof(mdio->md_file)) >= sizeof(mdio->md_file)) { - return (ENAMETOOLONG); - } + error = copyout(sc->file, mdio->md_file, + strlen(sc->file) + 1); + if (error != 0) + return (error); } return (0); case MDIOCLIST: diff --git a/sys/sys/mdioctl.h b/sys/sys/mdioctl.h index afc0cb8e51d2..e45c096085ea 100644 --- a/sys/sys/mdioctl.h +++ b/sys/sys/mdioctl.h @@ -54,20 +54,20 @@ struct md_ioctl { unsigned md_version; /* Structure layout version */ unsigned md_unit; /* unit number */ enum md_types md_type ; /* type of disk */ + char *md_file; /* pathname of file to mount */ off_t md_mediasize; /* size of disk in bytes */ unsigned md_sectorsize; /* sectorsize */ unsigned md_options; /* options */ u_int64_t md_base; /* base address */ int md_fwheads; /* firmware heads */ int md_fwsectors; /* firmware sectors */ - char md_file[PATH_MAX]; /* pathname of file to mount */ int md_pad[MDNPAD]; /* padding for future ideas */ }; #define MD_NAME "md" #define MD_MODNAME "g_md" #define MDCTL_NAME "mdctl" -#define MDIOVERSION 1 +#define MDIOVERSION 0 /* * Before you can use a unit, it must be configured with MDIOCSET.