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