diff --git a/src/cdf.c b/src/cdf.c index c3fd265d8aee8e48fdedfbe68df36667c1d7f9c7..354e766d75acd357cb1695a60cef24837cd32fc7 100644 --- a/src/cdf.c +++ b/src/cdf.c @@ -127,7 +127,7 @@ cdfOpenFile(const char *filename, const char *mode, int *filetype) if (*filetype == CDI_FILETYPE_NC4) writemode |= NC_NETCDF4; else if (*filetype == CDI_FILETYPE_NC4C) - writemode |= NC_NETCDF4 | NC_CLASSIC_MODEL; + writemode |= (NC_NETCDF4 | NC_CLASSIC_MODEL); #endif cdf_create(filename, writemode, &ncid); if (CDI_Version_Info) cdfComment(ncid); diff --git a/src/cdf_int.c b/src/cdf_int.c index 6bdb89b75bac25e89a770700563f9ce5000148a0..f1eb4bfbee6e36456f6475c96815d7686d6240d4 100644 --- a/src/cdf_int.c +++ b/src/cdf_int.c @@ -12,19 +12,42 @@ #ifdef HAVE_LIBNETCDF +static bool +has_uri(const char *uri) +{ + char *pos = strstr(uri, "://"); + if (pos) + { + const int len = pos - uri; + if (strncmp(uri, "file", len) == 0 || strncmp(uri, "https", len) == 0 || strncmp(uri, "s3", len) == 0) return true; + } + + return false; +} + void cdf_create(const char *path, int cmode, int *ncidp) { - size_t initialsz = 0, chunksizehint = 0; + int status = -1; + size_t chunksizehint = 0; + + if (has_uri(path)) + { + status = nc_create(path, cmode, ncidp); + } + else + { + size_t initialsz = 0; #if defined(__SX__) || defined(ES) - chunksizehint = 16777216; /* 16 MB */ + chunksizehint = 16777216; // 16 MB #endif - if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint; + if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint; - cdi_nc__create_funcp my_nc__create = (cdi_nc__create_funcp) namespaceSwitchGet(NSSWITCH_NC__CREATE).func; - int status = my_nc__create(path, cmode, initialsz, &chunksizehint, ncidp); + cdi_nc__create_funcp my_nc__create = (cdi_nc__create_funcp) namespaceSwitchGet(NSSWITCH_NC__CREATE).func; + status = my_nc__create(path, cmode, initialsz, &chunksizehint, ncidp); + } if (CDF_Debug || status != NC_NOERR) Message("ncid=%d mode=%d chunksizehint=%zu file=%s", *ncidp, cmode, chunksizehint, path);