Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4537 → Rev 4678

/branches/dd/uspace/srv/bd/file_bd/file_bd.c
44,11 → 44,12
#include <ipc/bd.h>
#include <async.h>
#include <as.h>
#include <futex.h>
#include <fibril_sync.h>
#include <devmap.h>
#include <sys/types.h>
#include <errno.h>
#include <bool.h>
#include <task.h>
 
#define NAME "file_bd"
 
56,12 → 57,12
static FILE *img;
 
static dev_handle_t dev_handle;
static atomic_t dev_futex = FUTEX_INITIALIZER;
static fibril_mutex_t dev_lock;
 
static int file_bd_init(const char *fname);
static void file_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
static int file_bd_read(off_t blk_idx, off_t size, void *buf);
static int file_bd_write(off_t blk_idx, off_t size, void *buf);
static int file_bd_read(off_t blk_idx, size_t size, void *buf);
static int file_bd_write(off_t blk_idx, size_t size, void *buf);
 
int main(int argc, char **argv)
{
86,6 → 87,7
}
 
printf(NAME ": Accepting connections\n");
task_retval(0);
async_manager();
 
/* Not reached */
106,6 → 108,8
if (img == NULL)
return EINVAL;
 
fibril_mutex_initialize(&dev_lock);
 
return EOK;
}
 
118,7 → 122,7
int flags;
int retval;
off_t idx;
off_t size;
size_t size;
 
/* Answer the IPC_M_CONNECT_ME_TO call. */
ipc_answer_0(iid, EOK);
165,27 → 169,21
}
}
 
static int file_bd_read(off_t blk_idx, off_t size, void *buf)
static int file_bd_read(off_t blk_idx, size_t size, void *buf)
{
size_t n_rd;
 
printf("file_bd_read\n");
futex_down(&dev_futex);
fibril_mutex_lock(&dev_lock);
 
printf("seek\n");
fseek(img, blk_idx * size, SEEK_SET);
printf("read\n");
n_rd = fread(buf, 1, size, img);
printf("done\n");
 
printf("done\n");
 
if (ferror(img)) {
futex_up(&dev_futex);
fibril_mutex_unlock(&dev_lock);
return EIO; /* Read error */
}
 
futex_up(&dev_futex);
fibril_mutex_unlock(&dev_lock);
 
if (n_rd < size)
return EINVAL; /* Read beyond end of disk */
193,21 → 191,21
return EOK;
}
 
static int file_bd_write(off_t blk_idx, off_t size, void *buf)
static int file_bd_write(off_t blk_idx, size_t size, void *buf)
{
size_t n_wr;
 
futex_down(&dev_futex);
fibril_mutex_lock(&dev_lock);
 
fseek(img, blk_idx * size, SEEK_SET);
n_wr = fread(buf, 1, size, img);
 
if (ferror(img) || n_wr < size) {
futex_up(&dev_futex);
fibril_mutex_unlock(&dev_lock);
return EIO; /* Write error */
}
 
futex_up(&dev_futex);
fibril_mutex_unlock(&dev_lock);
 
return EOK;
}