1/*
2 * Copyright 1996, University Corporation for Atmospheric Research
3 *      See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 */
5
6#include <config.h>
7#include <stdlib.h>
8
9#include "netcdf.h"
10#include "ncio.h"
11#include "fbits.h"
12
13/* With the advent of diskless io, we need to provide
14   for multiple ncio packages at the same time,
15   so we have multiple versions of ncio_create.
16*/
17
18/* Define known ncio packages */
19extern int posixio_create(const char*,int,size_t,off_t,size_t,size_t*,void*,ncio**,void** const);
20extern int posixio_open(const char*,int,off_t,size_t,size_t*,void*,ncio**,void** const);
21
22extern int stdio_create(const char*,int,size_t,off_t,size_t,size_t*,void*,ncio**,void** const);
23extern int stdio_open(const char*,int,off_t,size_t,size_t*,void*,ncio**,void** const);
24
25#ifdef USE_FFIO
26extern int ffio_create(const char*,int,size_t,off_t,size_t,size_t*,void*,ncio**,void** const);
27extern int ffio_open(const char*,int,off_t,size_t,size_t*,void*,ncio**,void** const);
28#endif
29
30#ifdef USE_DISKLESS
31#  ifdef USE_MMAP
32     extern int mmapio_create(const char*,int,size_t,off_t,size_t,size_t*,void*,ncio**,void** const);
33     extern int mmapio_open(const char*,int,off_t,size_t,size_t*,void*,ncio**,void** const);
34#  endif
35     extern int memio_create(const char*,int,size_t,off_t,size_t,size_t*,void*,ncio**,void** const);
36     extern int memio_open(const char*,int,off_t,size_t,size_t*,void*,ncio**,void** const);
37#endif
38
39int
40ncio_create(const char *path, int ioflags, size_t initialsz,
41                       off_t igeto, size_t igetsz, size_t *sizehintp,
42        void* parameters,
43                       ncio** iopp, void** const mempp)
44{
45#ifdef USE_DISKLESS
46    if(fIsSet(ioflags,NC_DISKLESS)) {
47#  ifdef USE_MMAP
48      if(fIsSet(ioflags,NC_MMAP))
49        return mmapio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,parameters,iopp,mempp);
50      else
51#  endif /*USE_MMAP*/
52        return memio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,parameters,iopp,mempp);
53    }
54#endif
55
56#ifdef USE_STDIO
57    return stdio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,parameters,iopp,mempp);
58#elif defined(USE_FFIO)
59    return ffio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,parameters,iopp,mempp);
60#else
61    return posixio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,parameters,iopp,mempp);
62#endif
63}
64
65int
66ncio_open(const char *path, int ioflags,
67                     off_t igeto, size_t igetsz, size_t *sizehintp,
68      void* parameters,
69                     ncio** iopp, void** const mempp)
70{
71    /* Diskless open has the following constraints:
72       1. file must be classic version 1 or 2
73     */
74#ifdef USE_DISKLESS
75    if(fIsSet(ioflags,NC_DISKLESS)) {
76#  ifdef USE_MMAP
77      if(fIsSet(ioflags,NC_MMAP))
78        return mmapio_open(path,ioflags,igeto,igetsz,sizehintp,parameters,iopp,mempp);
79      else
80#  endif /*USE_MMAP*/
81        return memio_open(path,ioflags,igeto,igetsz,sizehintp,parameters,iopp,mempp);
82    }
83#endif
84#ifdef USE_STDIO
85    return stdio_open(path,ioflags,igeto,igetsz,sizehintp,parameters,iopp,mempp);
86#elif defined(USE_FFIO)
87    return ffio_open(path,ioflags,igeto,igetsz,sizehintp,parameters,iopp,mempp);
88#else
89    return posixio_open(path,ioflags,igeto,igetsz,sizehintp,parameters,iopp,mempp);
90#endif
91}
92
93/**************************************************/
94/* wrapper functions for the ncio dispatch table */
95
96int
97ncio_rel(ncio *const nciopoff_t offset, int rflags)
98{
99    return nciop->rel(nciop,offset,rflags);
100}
101
102int
103ncio_get(ncio *const nciopoff_t offset, size_t extent,
104 int rflags, void **const vpp)
105{
106    return nciop->get(nciop,offset,extent,rflags,vpp);
107}
108
109int
110ncio_move(ncio *const nciopoff_t tooff_t from, size_t nbytes, int rflags)
111{
112    return nciop->move(nciop,to,from,nbytes,rflags);
113}
114
115int
116ncio_sync(ncio *const nciop)
117{
118    return nciop->sync(nciop);
119}
120
121int
122ncio_filesize(ncio *nciopoff_t *filesizep)
123{
124    return nciop->filesize(nciop,filesizep);
125}
126
127int
128ncio_pad_length(ncionciopoff_t length)
129{
130    return nciop->pad_length(nciop,length);
131}
132
133int
134ncio_close(ncio *nciop, int doUnlink)
135{
136    /* close and release all resources associated
137       with nciop, including nciop
138    */
139    int status = nciop->close(nciop,doUnlink);
140    return status;
141}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed