blob: 29dddfd551452c9dbb679bd022a281dac46d5010 [file] [log] [blame]
/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) Hewlett-Packard (Paul Bame) paul_bame@hp.com
*/
#include "bootloader.h"
struct fileio
{
describe_t describef;
read_t readf;
};
static struct fileio *fileio = 0;
/* return first available file descriptor or -1 if none
* could probably die instead of bothering with -1...
*/
int fileio_open(describe_t describef, read_t readf)
{
int d = -1;
int i;
if (fileio == 0)
{
unsigned sz = sizeof fileio[0] * MAX_FD;
fileio = (struct fileio *)malloc(sz);
memset(fileio, 0, sz);
}
for (i = 0; i < MAX_FD; i++)
{
if (fileio[i].describef == 0)
{
d = i;
fileio[i].describef = describef;
fileio[i].readf = readf;
break;
}
}
if (Debug)
printf("assigning fd # %d\n", d);
return d;
}
void fileio_close(unsigned int fd)
{
if (fd > MAX_FD)
return;
if (Debug)
printf("closing fd # %d\n", fd);
memset(&fileio[fd], 0, sizeof(fileio[0]));
}
int seekread(int fd, char *buf, unsigned nbytes, __u64 devaddr)
{
int r = -1;
if (0) printf("seekread(%d, 0x%p, %d, 0x%llx)\r\n", fd, buf, nbytes, devaddr);
if (fileio[fd].readf != 0)
r = (*fileio[fd].readf)(fd, buf, nbytes, devaddr);
if (0) printf("seekread(%d) returning %d\r\n", fd, r);
return r;
}
void describe(int fd, int *bufalign, int *blocksize)
{
(*fileio[fd].describef)(fd, bufalign, blocksize);
}