1256381Smarkm/*- 2256381Smarkm * Copyright (c) 2013 Mark R V Murray 3256381Smarkm * All rights reserved. 4256381Smarkm * 5256381Smarkm * Redistribution and use in source and binary forms, with or without 6256381Smarkm * modification, are permitted provided that the following conditions 7256381Smarkm * are met: 8256381Smarkm * 1. Redistributions of source code must retain the above copyright 9256381Smarkm * notice, this list of conditions and the following disclaimer 10256381Smarkm * in this position and unchanged. 11256381Smarkm * 2. Redistributions in binary form must reproduce the above copyright 12256381Smarkm * notice, this list of conditions and the following disclaimer in the 13256381Smarkm * documentation and/or other materials provided with the distribution. 14256381Smarkm * 15256381Smarkm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16256381Smarkm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17256381Smarkm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18256381Smarkm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19256381Smarkm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20256381Smarkm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21256381Smarkm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22256381Smarkm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23256381Smarkm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24256381Smarkm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25256381Smarkm * 26256381Smarkm */ 27256381Smarkm 28256381Smarkm#include <sys/cdefs.h> 29256381Smarkm__FBSDID("$FreeBSD$"); 30256381Smarkm 31256381Smarkm#include "opt_random.h" 32256381Smarkm 33256381Smarkm#ifdef RANDOM_RWFILE 34256381Smarkm 35256381Smarkm#include <sys/param.h> 36256381Smarkm#include <sys/systm.h> 37256381Smarkm#include <sys/kernel.h> 38256381Smarkm#include <sys/proc.h> 39256381Smarkm#include <sys/namei.h> 40256381Smarkm#include <sys/fcntl.h> 41256381Smarkm#include <sys/vnode.h> 42256381Smarkm 43256381Smarkm#include <dev/random/rwfile.h> 44256381Smarkm 45256381Smarkmint 46256381Smarkmrandomdev_read_file(const char *filename, void *buf, size_t length) 47256381Smarkm{ 48256381Smarkm struct nameidata nd; 49256381Smarkm struct thread* td = curthread; 50256381Smarkm int error; 51256381Smarkm ssize_t resid; 52256381Smarkm int flags; 53256381Smarkm 54256381Smarkm NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td); 55256381Smarkm flags = FREAD; 56256381Smarkm error = vn_open(&nd, &flags, 0, NULL); 57256381Smarkm if (error == 0) { 58256381Smarkm NDFREE(&nd, NDF_ONLY_PNBUF); 59256381Smarkm if (nd.ni_vp->v_type != VREG) 60256381Smarkm error = ENOEXEC; 61256381Smarkm else 62256381Smarkm error = vn_rdwr(UIO_READ, nd.ni_vp, buf, length, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); 63256381Smarkm VOP_UNLOCK(nd.ni_vp, 0); 64256381Smarkm vn_close(nd.ni_vp, FREAD, td->td_ucred, td); 65256381Smarkm } 66256381Smarkm 67256381Smarkm return (error); 68256381Smarkm} 69256381Smarkm 70256381Smarkmint 71256381Smarkmrandomdev_write_file(const char *filename, void *buf, size_t length) 72256381Smarkm{ 73256381Smarkm struct nameidata nd; 74256381Smarkm struct thread* td = curthread; 75256381Smarkm int error; 76256381Smarkm ssize_t resid; 77256381Smarkm int flags; 78256381Smarkm 79256381Smarkm NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td); 80256381Smarkm flags = FWRITE | O_CREAT | O_TRUNC; 81256381Smarkm error = vn_open(&nd, &flags, 0, NULL); 82256381Smarkm if (error == 0) { 83256381Smarkm NDFREE(&nd, NDF_ONLY_PNBUF); 84256381Smarkm if (nd.ni_vp->v_type != VREG) 85256381Smarkm error = ENOEXEC; 86256381Smarkm else 87256381Smarkm error = vn_rdwr(UIO_WRITE, nd.ni_vp, buf, length, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); 88256381Smarkm 89256381Smarkm VOP_UNLOCK(nd.ni_vp, 0); 90256381Smarkm vn_close(nd.ni_vp, FREAD, td->td_ucred, td); 91256381Smarkm } 92256381Smarkm 93256381Smarkm return (error); 94256381Smarkm} 95256381Smarkm 96256381Smarkm#endif 97