Logo Search packages:      
Sourcecode: palo version File versions  Download package

offset.c

/* 
 * 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"

/* this is the stupidest "file system" imaginable -- it applies an */
/* offset to the seek pointers and optionally checks against a length */

struct offsets {
    int fd;
    int start;
    int length;
} ofd [MAX_FD];

static int offset_read(int fd, char *buf, unsigned count, unsigned devaddr)
{
    struct offsets *o = &ofd[fd];

     if (Debug) printf("offset_read(%d, 0x%p, %d, %d)\r\n",
                fd, buf, count, devaddr);

    /* LATER -- truncate 'count' according to max device size */
    if (o->length > 0 && devaddr + count > o->length)
    {
      printf("offset_read(%d, 0x%p, %d, %d) can't seek past %d\r\n",
                  fd, buf, count, devaddr, o->length);
      return -1;
    }

    return seekread(o->fd, buf, count, devaddr + o->start);
}

static void offset_describe(int fd, int *bufalign,
                        int *blocksize)
{
    describe(ofd[fd].fd, bufalign, blocksize);
}

/* returns true if OK */
int offset_open(int otherfd, int offset, int length)
{
    int fd = fileio_open(offset_describe, offset_read);

    if (fd >= 0)
    {
      struct offsets *o = &ofd[fd];

      o->fd = otherfd;
      o->start = offset;
      o->length = length;
    }

     if (Debug) printf("offset_open(%d, %d, %d) = %d\n",
      otherfd, offset, length, fd);

    return fd;
}

/* $Id: offset.c,v 1.2.2.1 2000/06/05 03:58:48 bame Exp $ */

Generated by  Doxygen 1.6.0   Back to index