openblt

a hobby OS from the late 90s
git clone http://frotz.net/git/openblt.git
Log | Files | Refs | LICENSE

blkdev.c (2260B)


      1 /* Copyright 1999, Sidney Cammeresi. All rights reserved.
      2 ** Distributed under the terms of the OpenBLT License
      3 */
      4 
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 #include <string.h>
      8 #include <blt/libsyms.h>
      9 #include <blt/blkdev.h>
     10 #include <blt/namer.h>
     11 #include <blt/syscall.h>
     12 
     13 weak_alias (_blk_open, blk_open)
     14 weak_alias (_blk_close, blk_close)
     15 weak_alias (_blk_read, blk_read)
     16 weak_alias (_blk_write, blk_write)
     17 
     18 int __blk_ref;
     19 
     20 int _blk_open (const char *name, int flags, blkdev_t **retdev)
     21 {
     22 	char *server;
     23 	int i, len;
     24 	msg_hdr_t mh;
     25 	blkdev_t *dev;
     26 	blktxn_t *txn;
     27 	blkres_t res;
     28 
     29 	for (i = 0; name[i] && (name[i] != '/') && i < BLT_MAX_NAME_LENGTH; i++) ;
     30 	server = malloc (i);
     31 	strncpy (server, name, i);
     32 	server[i] = 0;
     33 
     34 	dev = malloc (sizeof (blkdev_t));
     35 	dev->remote_port = namer_find (server, 1);
     36 
     37 	txn = malloc (len = sizeof (blktxn_t) + strlen (name) - i + 1);
     38 	txn->cmd = BLK_CMD_OPEN;
     39 	strcpy ((char *) (txn + 1), name + i + 1);
     40 
     41 	mh.src = dev->local_port = port_create (dev->remote_port, "blkdev");
     42 	mh.dst = dev->remote_port;
     43 	mh.data = txn;
     44 	mh.size = len;
     45 	old_port_send (&mh);
     46 
     47 	mh.src = dev->remote_port;
     48 	mh.dst = dev->local_port;
     49 	mh.data = &res;
     50 	mh.size = sizeof (blkres_t);
     51 	old_port_recv (&mh);
     52 
     53 	if (res.status)
     54 	{
     55 		free (dev);
     56 		*retdev = NULL;
     57 		return res.status;
     58 	}
     59 
     60 	dev->blksize = res.data[0];
     61 	dev->devno = res.data[1];
     62 	*retdev = dev;
     63 	return 0;
     64 }
     65 
     66 int _blk_close (blkdev_t *dev)
     67 {
     68 	free (dev);
     69 	return 0;
     70 }
     71 
     72 int _blk_read (blkdev_t *dev, void *buf, int block, int count)
     73 {
     74 	int len, ret;
     75 	msg_hdr_t mh;
     76 	blktxn_t txn;
     77 	blkres_t *res;
     78 
     79 	res = malloc (len = sizeof (blkres_t) + dev->blksize);
     80 
     81 	while (count)
     82 	{
     83 		txn.device = dev->devno;
     84 		txn.cmd = BLK_CMD_READ;
     85 		txn.block = block;
     86 		txn.count = count;
     87 		mh.src = dev->local_port;
     88 		mh.dst = dev->remote_port;
     89 		mh.data = &txn;
     90 		mh.size = sizeof (blktxn_t);
     91 		old_port_send (&mh);
     92 
     93 		mh.src = dev->remote_port;
     94 		mh.dst = dev->local_port;
     95 		mh.data = res;
     96 		mh.size = len;
     97 		old_port_recv (&mh);
     98 
     99 		if (res->status)
    100 			goto done;
    101 		memcpy (buf, res + 1, dev->blksize);
    102 		buf = (char *) buf + dev->blksize;
    103 		block++;
    104 		count--;
    105 	}
    106 
    107 done:
    108 	ret = res->status;
    109 	free (res);
    110 	return ret;
    111 }
    112 
    113 int _blk_write (blkdev_t *dev, const void *buf, int block, int count)
    114 {
    115 	return 0;
    116 }
    117