Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!seismo!ll-xn!ames!necntc!ncoast!allbery
From: mouse@mcgill-vision.UUCP (der Mouse )
Newsgroups: comp.sources.misc
Subject: filedisk: make a file into a filesystem (2 of 2) (BSD4.3)
Message-ID: <2742@ncoast.UUCP>
Date: Mon, 29-Jun-87 20:10:12 EDT
Article-I.D.: ncoast.2742
Posted: Mon Jun 29 20:10:12 1987
Date-Received: Wed, 1-Jul-87 03:44:37 EDT
Sender: allbery@ncoast.UUCP
Lines: 392
Approved: allbery@ncoast.UUCP
X-Archive: comp.sources.misc/8706/9
This is part 2 of 2. Read the README (in part 1) to see what it's part
2 of. I had to split up even this tiny thing because someone, either
sun or seismo (not sure which), has a 10000 byte limit on mail (yes,
only ten thousand bytes).
der Mouse
(mouse@mcgill-vision.uucp)
#! /bin/sh
#
# Shar: Shell Archiver
#
# This archive created Sun Jun 28 17:50:43 1987
# Run this through sh to create:
# filedisk.c
# fdconn.c
# fddisc.c
echo x - filedisk.c \(4378 characters\)
sed 's/^X//' > filedisk.c << \SHAR_EOF
X/*
X * Filesystem-in-a-file pseudo-disk driver.
X */
X
X#include "filedisk.h"
X
X#if NFILEDISK > 0
X
X#include "../h/param.h"
X#include "../h/systm.h"
X#include "../h/ioctl.h"
X#include "../h/buf.h"
X#include "../h/conf.h"
X#include "../h/dir.h"
X#include "../h/file.h"
X#include "../h/inode.h"
X#include "../h/namei.h"
X#include "../h/user.h"
X#include "../h/proc.h"
X#include "../h/uio.h"
X#include "../h/mount.h"
X#include "../h/fs.h"
X#include "../h/kernel.h"
X
Xstatic struct fdinfo {
X int alive;
X int unit;
X struct inode *ino;
X int nblocks; } info[NFILEDISK];
Xstatic int didinit = 0;
X
X#define OKUNIT(u) (((u)>=0)&&((u) 0, (u)mounts can't happen */
X for (mp= &mount[0];mp<&mount[NMOUNT];mp++)
X { if (mp->m_bufp != 0)
X { dev = mp->m_dev;
X if ( (bdevsw[major(dev)].d_strategy == filediskstrategy) &&
X (minor(dev) == unit) )
X { splx(s);
X return(1);
X }
X }
X }
X splx(s);
X return(0);
X}
X
Xfilediskioctl(dev,cmd,data,flag)
Xdev_t dev;
Xint cmd;
Xcaddr_t data;
Xint flag;
X{
X int unit;
X int rv;
X struct inode *ip;
X register struct nameidata *ndp;
X
X#ifdef lint
X flag = flag;
X#endif
X unit = minor(dev);
X rv = EIO;
X switch (cmd)
X { case LIOC_FSF_SET:
X if (! suser())
X { rv = EPERM;
X break;
X }
X if (info[unit].alive)
X { rv = EBUSY;
X break;
X }
X ndp = &u.u_nd;
X ndp->ni_segflg = UIO_USERSPACE;
X ndp->ni_dirp = *(char **)data;
X ndp->ni_nameiop = LOOKUP | FOLLOW;
X ip = namei(ndp);
X if (ip == 0)
X { rv = u.u_error;
X break;
X }
X if ((ip->i_mode&IFMT) != IFREG)
X { iput(ip);
X rv = EINVAL;
X break;
X }
X info[unit].ino = ip;
X info[unit].nblocks = btodb(ip->i_size);
X info[unit].alive = 1;
X iunlock(ip);
X rv = 0;
X break;
X case LIOC_FSF_CLEAR:
X if (! suser())
X { rv = EPERM;
X break;
X }
X if (unit_mounted(unit))
X { rv = EBUSY;
X break;
X }
X if (info[unit].alive)
X { info[unit].alive = 0;
X irele(info[unit].ino);
X rv = 0;
X }
X else
X { rv = ENXIO;
X }
X break;
X }
X return(rv);
X}
X
Xfilediskdump()
X{
X return(ENXIO);
X}
X
Xfiledisksize(dev)
Xdev_t dev;
X{
X int unit;
X
X unit = minor(dev);
X if ((unit < 0) || (unit >= NFILEDISK) || !info[unit].alive)
X { return(-1);
X }
X return(info[unit].nblocks);
X}
X
Xfilediskreset(uban)
Xint uban;
X{
X printf("filedisk reset on %d?\n",uban);
X}
X
Xstatic int buf_ok(bp)
Xstruct buf *bp;
X{
X int unit;
X int nblk;
X
X#define FAIL() return((bp->b_flags|=B_ERROR),(iodone(bp)),0)
X unit = minor(bp->b_dev);
X if (bp->b_bcount & (DEV_BSIZE-1))
X { FAIL();
X }
X nblk = btodb(bp->b_bcount);
X if (! info[unit].alive)
X { FAIL();
X }
X if ( (bp->b_blkno < 0) ||
X (bp->b_blkno+nblk > info[unit].nblocks) )
X { FAIL();
X }
X if (! info[unit].ino)
X { FAIL();
X }
X return(1);
X#undef FAIL
X}
X
Xstatic doionow(bp)
Xstruct buf *bp;
X{
X int unit = minor(bp->b_dev);
X struct inode *ip = info[unit].ino;
X
X ilock(ip);
X if (bp->b_flags & B_READ)
X { bp->b_error = rdwri( UIO_READ,
X ip,
X bp->b_un.b_addr,
X bp->b_bcount,
X dbtob(bp->b_blkno),
X 1,
X &bp->b_resid );
X if (bp->b_error)
X { bp->b_flags |= B_ERROR;
X }
X }
X else
X { bp->b_error = rdwri( UIO_WRITE,
X ip,
X bp->b_un.b_addr,
X bp->b_bcount,
X dbtob(bp->b_blkno),
X 1,
X &bp->b_resid );
X if (bp->b_error)
X { bp->b_flags |= B_ERROR;
X }
X }
X iunlock(ip);
X iodone(bp);
X}
X
X#endif
SHAR_EOF
if test 4378 -ne "`wc -c filedisk.c`"
then
echo shar: error transmitting filedisk.c \(should have been 4378 characters\)
fi
echo x - fdconn.c \(664 characters\)
sed 's/^X//' > fdconn.c << \SHAR_EOF
X#include
X#include
X#include
X
Xchar **argvec;
X
X/* usage: fdconn */
X
Xchar dname[64];
Xint dfd;
X
Xmain(ac,av)
Xint ac;
Xchar **av;
X{
X int unit;
X
X argvec = av;
X if (ac != 3)
X { fprintf(stderr,"Usage: %s unit file\n",argvec[0]);
X exit(1);
X }
X unit = atoi(av[1]);
X sprintf(dname,"/dev/rfiledisk%d",unit);
X dfd = open(dname,O_RDWR,0);
X if (dfd < 0)
X { fprintf(stderr,"%s: cannot open %s: ",argvec[0],dname);
X perror((char *)0);
X exit(1);
X }
X if (ioctl(dfd,LIOC_FSF_SET,&av[2]) < 0)
X { fprintf(stderr,"%s: cannot connect %s to %s: ",argvec[0],dname,av[2]);
X perror((char *)0);
X exit(1);
X }
X exit(0);
X}
SHAR_EOF
if test 664 -ne "`wc -c fdconn.c`"
then
echo shar: error transmitting fdconn.c \(should have been 664 characters\)
fi
echo x - fddisc.c \(636 characters\)
sed 's/^X//' > fddisc.c << \SHAR_EOF
X#include
X#include
X#include
X
Xchar **argvec;
X
X/* usage: fddisc */
X
Xchar dname[64];
Xint dfd;
X
Xmain(ac,av)
Xint ac;
Xchar **av;
X{
X int unit;
X
X argvec = av;
X if (ac != 2)
X { fprintf(stderr,"Usage: %s unit\n",argvec[0]);
X exit(1);
X }
X unit = atoi(av[1]);
X sprintf(dname,"/dev/rfiledisk%d",unit);
X dfd = open(dname,O_RDWR,0);
X if (dfd < 0)
X { fprintf(stderr,"%s: cannot open %s: ",argvec[0],dname);
X perror((char *)0);
X exit(1);
X }
X if (ioctl(dfd,LIOC_FSF_CLEAR,0) < 0)
X { fprintf(stderr,"%s: cannot disconnect %s: ",argvec[0],dname);
X perror((char *)0);
X exit(1);
X }
X exit(0);
X}
SHAR_EOF
if test 636 -ne "`wc -c fddisc.c`"
then
echo shar: error transmitting fddisc.c \(should have been 636 characters\)
fi
exit 0
# end of shell archive