Пример #1
0
static void whio_dev_fileno_finalize( whio_dev * dev )
{
    if( dev )
    {
	dev->api->close( dev );
	whio_dev_free(dev);
    }
}
Пример #2
0
whio_dev * whefs_dev_for_inode( whefs_fs * fs, whefs_id_type nid, bool writeMode )
{
    /*WHEFS_DBG("trying to open dev for inode #%u", nid ); */
    whio_dev * dev;
    whefs_inode * ino;
    void const * writeKey;
    int rc;
    whio_dev_inode_meta * meta;
    if( ! whefs_inode_id_is_valid( fs, nid ) ) return 0;
    dev = whio_dev_alloc();
    if( ! dev ) return 0;
    ino = NULL;
    writeKey = (writeMode ? dev : 0);
    rc = whefs_inode_open( fs, nid, &ino, writeKey );
    if( rc != whefs_rc.OK )
    {
	WHEFS_DBG_ERR("whefs_inode_open(fs,[inode #%"WHEFS_ID_TYPE_PFMT"],inode,%d) failed with rc %d!", nid, writeMode, rc );
	whio_dev_free( dev );
	return 0;
    }
    /*WHEFS_DBG("Opened inode #%u[%s]", ino->id, ino->name ); */
    meta = whio_dev_inode_meta_alloc();
    if( ! meta )
    {
	whefs_inode_close( fs, ino, writeKey );
	whio_dev_free(dev);
	return 0;
    }
    *dev = whio_dev_inode_empty;
    *meta = whio_dev_inode_meta_empty;
    dev->impl.data = meta;
    meta->fs = fs;
    meta->rw = writeMode;
    meta->bs = whefs_fs_options_get(fs)->block_size;
    meta->inode = ino;
#if 0
    if( writeMode )
    {
	whefs_inode_flush( fs, meta->inode ); /* make sure on-disk matches */
    }
#endif
    whefs_fs_closer_dev_add( fs, dev );
    return dev;
}
Пример #3
0
/**
   Implementation for whio_dev_for_fileno() and whio_dev_for_filename().

   If fname is 0 or empty then fdopen(fileno,mode) is used, otherwise
   fopen(fname,mode) is used.
*/
static whio_dev * whio_dev_for_file_impl( char const * fname, int filenum, char const * mode )
{
    if( ((!fname || !*fname) && (filenum<1)) || (!mode || !*mode) )
    {
        return 0;
    }
    /** Maintenance reminder:

        i would like to move these two allocs to below the fopen(),
        but if we open the file first then we have to check whether we
        created the file, and delete it if we did not.
    */
    whio_dev * dev = whio_dev_alloc();
    if( ! dev )
    {
        return 0;
    }
    whio_dev_fileno * meta = whio_dev_fileno_alloc();
    if( ! meta )
    {
	whio_dev_free(dev);
	return 0;
    }
    FILE * f = (fname && *fname) ? fopen(fname,mode) : fdopen( filenum, mode );
    if( ! f )
    {
        whio_dev_free(dev);
        whio_dev_fileno_free(meta);
	return 0;
    }
    *dev = whio_dev_fileno_empty;
    *meta = whio_dev_fileno_meta_empty;
    dev->impl.data = meta;
    meta->fp = f;
    meta->fileno = fileno(f);
    meta->filename = fname;
    meta->iomode = whio_mode_to_iomode( mode );
    return dev;
}
Пример #4
0
static void whio_dev_IODEV_TYPE_finalize( whio_dev * dev )
{
    if( dev )
    {
        // Close the device and free up all resources.
        dev->api->close(dev);
        // Cleanup of internal data may optionally be done in close(),
        // depending on the requirements of the device (e.g. is it
        // re-openable?).
        free( dev->impl.data );
        dev->impl.data = 0;
        whio_dev_free(dev);
    }
}
Пример #5
0
static void whio_dev_inode_finalize( whio_dev * dev )
{
    if( dev && ((void const *)&whio_dev_inode_meta_empty == dev->impl.typeID))
    {
	if(0)
	{
	    whio_dev_inode_meta * meta = (whio_dev_inode_meta*)dev->impl.data;
	    WHEFS_DBG_FYI("Finalizing %s i/o device for inode #%u. "
			  "inode->data_size=%u posabs=%u",
			  meta->rw ? "read/write" : "read-only",
			  meta->inode->id,
			  meta->inode->data_size, meta->posabs
			  );
	    }
	dev->api->close( dev );
	whio_dev_free( dev );
    }
}
Пример #6
0
/**
   Creates an IODEV_TYPE. The arguments are:

   FILL THIS OUT.
*/
whio_dev * whio_dev_IODEV_TYPE_create( ... /* add your arguments here */ )
{
    whio_dev * dev = whio_dev_alloc(); // this is our 'this' object
    if( ! dev ) return 0;

    // Set up our internal metadata:
    typedef whio_dev_IODEV_TYPE_meta MetaType;
    MetaType * meta = (MetaType*)malloc(sizeof(MetaType));
    if( ! meta )
    {
        whio_dev_free(dev);
        return 0;
    }
    *dev = whio_dev_IODEV_TYPE_init;
    *meta = whio_dev_IODEV_TYPE_meta_init;
    dev->impl.data = meta;

    // Initialize dev->impl.meta with any private data here.

    return dev;
}
Пример #7
0
whio_dev * whio_dev_subdev_create( whio_dev * parent, whio_size_t lowerBound, whio_size_t upperBound )
{
    if( ! parent || (upperBound && (upperBound <= lowerBound)) ) return 0;
    else {
        whio_dev * dev = whio_dev_alloc();
        if( ! dev ) return 0;
        else {
            whio_dev_subdev_meta * meta = whio_dev_subdev_meta_alloc();
            if( ! meta )
            {
                whio_dev_free(dev);
                return 0;
            }
            *dev = whio_dev_subdev_empty;
            *meta = whio_dev_subdev_meta_empty;
            dev->impl.data = meta;
            meta->dev = parent;
            meta->lower = lowerBound;
            meta->pos = lowerBound;
            meta->upper = upperBound;
            return dev;
        }
    }
}