|
|
Xinu for VAX
/* dsopen.c - dsopen */
#include <conf.h>
#include <kernel.h>
#include <disk.h>
#include <lfile.h>
#include <dir.h>
/*------------------------------------------------------------------------
* dsopen -- open/create a file on the specified disk device
*------------------------------------------------------------------------
*/
#ifdef Ndf
dsopen(devptr, filenam, mode)
struct devsw *devptr;
char *filenam;
char *mode;
{
struct dir *dirptr;
struct flblk *flptr;
struct fdes *fdptr;
DBADDR dba;
int mbits, findex;
int retcode;
char ps;
disable(ps);
dirptr = dsdirec(devptr->dvnum);
if ( (mbits=ckmode(mode)) == SYSERR)
retcode = SYSERR;
else if( (int)(fdptr=dfdsrch(devptr->dvioblk,filenam,mbits))
== SYSERR)
retcode = SYSERR;
else if ( (findex=dfalloc()) == SYSERR)
retcode = SYSERR;
else {
flptr = &fltab[findex];
flptr->fl_dev = devptr->dvnum;
flptr->fl_dent = fdptr;
flptr->fl_mode = mbits & FLRW;
flptr->fl_iba = fdptr->fdiba;
ibget(flptr->fl_dev, flptr->fl_iba, &(flptr->fl_iblk));
flptr->fl_pos = 0L;
flptr->fl_dch = FALSE;
dba = flptr->fl_iblk.ib_dba[flptr->fl_ipnum = 0];
if (dba != DBNULL) {
read(flptr->fl_dev, flptr->fl_buff, dba);
flptr->fl_bptr = flptr->fl_buff;
} else
flptr->fl_bptr = &flptr->fl_buff[DBUFSIZ];
retcode = flptr->fl_id;
}
restore(ps);
return(retcode);
}
#endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.