Metropoli BBS
VIEWER: rw.c MODE: TEXT (ASCII)
//
// $Header: D:/ext2-os2/vfs/RCS/rw.c,v 1.4 1995/08/16 17:30:40 Willm Exp Willm $
//

// Linux ext2 file system driver for OS/2 2.x and WARP - Allows OS/2 to     
// access your Linux ext2fs partitions as normal drive letters.
// OS/2 implementation : Copyright (C) 1995  Matthieu WILLM
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#define INCL_DOS
#define INCL_DOSERRORS
#include <os2.h>		// From the "Developer Connection Device Driver Kit" version 2.0
#include <fsh.h>

#include <os2/types.h>
#include <os2/os2proto.h>
#include <linux/stat.h>
#include <linux/fs.h>
#include <linux/fs_proto.h>


int VFS_readdir(struct file *file, struct dirent *dirent) {

    /**********************************************************************/
    /*** Tests if it's really a directory                               ***/
    /**********************************************************************/
    if (!S_ISDIR(file->f_inode->i_mode)) {
        return ERROR_ACCESS_DENIED;
    }
    /**********************************************************************/

    return (file->f_op->readdir(file->f_inode, file,
			 dirent, 1) > 0 ? NO_ERROR : ERROR_HANDLE_EOF);
}



int VFS_read(struct file *file, char *buf, loff_t len, unsigned long *pLen) {
    int  err;
    long read;

    read = file->f_op->read(file->f_inode, file, buf, len);
    if (read >= 0) {
        *pLen = (UINT32)read;
        err   = NO_ERROR;
    } else {
#ifdef FS_TRACE
        kernel_printf("ext2_file_read returned %d", err);
#endif
        *pLen = 0;
        err   = map_err((int)read);
    }
    return err;
}


int VFS_write(struct file *file, char *buf, loff_t len, unsigned long *pLen) {
    int  err;
    long written;


    written = file->f_op->write (file->f_inode, file, buf, (long)len);
    if (written < 0) {
#ifdef FS_TRACE
        kernel_printf("ext2_file_write returned %lu", written);
#endif
        err   = map_err((int)written);
        *pLen = 0;
    } else {
        err   = NO_ERROR;
        *pLen = written;
    } /* endif */
    return err;
}
[ RETURN TO DIRECTORY ]