Exemplo n.º 1
0
whio_stream * whio_stream_for_filename( char const * src, char const * mode )
{
    if( ! src || ! mode ) return 0;
    FILE * fp = fopen( src, mode );
    if( ! fp ) return 0;
    whio_stream * st = whio_stream_for_FILE(fp, true);
    if( ! st )
    {
	fclose(fp);
    }
    else
    {
        whio_stream_FILEINFO * meta = (whio_stream_FILEINFO*)st->impl.data;
        meta->iomode = whio_mode_to_iomode( mode );
    }
    return st;
}
Exemplo n.º 2
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;
}