1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/*
Copyright (c) 1998-2018 University Corporation for Atmospheric Research/Unidata
See LICENSE.txt for license information.
*/
#include "config.h"
#include "ncdispatch.h"
#include "ncuri.h"
#include "nclog.h"
#include "ncbytes.h"
#include "ncrc.h"
#include "ncoffsets.h"
#include "ncpathmgr.h"
#include "ncxml.h"
#include "nc4internal.h"
/* Required for getcwd, other functions. */
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
/* Required for getcwd, other functions. */
#ifdef _WIN32
#include <direct.h>
#endif
#if defined(ENABLE_BYTERANGE) || defined(ENABLE_DAP) || defined(ENABLE_DAP4)
#include <curl/curl.h>
#endif
#ifdef ENABLE_S3_SDK
#include "ncs3sdk.h"
#endif
#define MAXPATH 1024
/* Define vectors of zeros and ones for use with various nc_get_varX functions */
/* Note, this form of initialization fails under Cygwin */
size_t NC_coord_zero[NC_MAX_VAR_DIMS] = {0};
size_t NC_coord_one[NC_MAX_VAR_DIMS] = {1};
ptrdiff_t NC_stride_one[NC_MAX_VAR_DIMS] = {1};
/*
static nc_type longtype = (sizeof(long) == sizeof(int)?NC_INT:NC_INT64);
static nc_type ulongtype = (sizeof(unsigned long) == sizeof(unsigned int)?NC_UINT:NC_UINT64);
*/
/* Allow dispatch to do general initialization and finalization */
int
NCDISPATCH_initialize(void)
{
int status = NC_NOERR;
int i;
NCglobalstate* globalstate = NULL;
for(i=0;i<NC_MAX_VAR_DIMS;i++) {
NC_coord_zero[i] = 0;
NC_coord_one[i] = 1;
NC_stride_one[i] = 1;
}
globalstate = NC_getglobalstate(); /* will allocate and clear */
/* Capture temp dir*/
{
char* tempdir = NULL;
#if defined _WIN32 || defined __MSYS__ || defined __CYGWIN__
tempdir = getenv("TEMP");
#else
tempdir = "/tmp";
#endif
if(tempdir == NULL) {
fprintf(stderr,"Cannot find a temp dir; using ./\n");
tempdir = ".";
}
globalstate->tempdir= strdup(tempdir);
}
/* Capture $HOME */
{
#if defined(_WIN32) && !defined(__MINGW32__)
char* home = getenv("USERPROFILE");
#else
char* home = getenv("HOME");
#endif
if(home == NULL) {
/* use cwd */
home = malloc(MAXPATH+1);
NCgetcwd(home,MAXPATH);
} else
home = strdup(home); /* make it always free'able */
assert(home != NULL);
NCpathcanonical(home,&globalstate->home);
nullfree(home);
}
/* Capture $CWD */
{
char cwdbuf[4096];
cwdbuf[0] = '\0';
(void)NCgetcwd(cwdbuf,sizeof(cwdbuf));
if(strlen(cwdbuf) == 0) {
/* use tempdir */
strcpy(cwdbuf, globalstate->tempdir);
}
globalstate->cwd = strdup(cwdbuf);
}
ncloginit();
/* Now load RC Files */
ncrc_initialize();
/* Compute type alignments */
NC_compute_alignments();
#if defined(ENABLE_BYTERANGE) || defined(ENABLE_DAP) || defined(ENABLE_DAP4)
/* Initialize curl if it is being used */
{
CURLcode cstat = curl_global_init(CURL_GLOBAL_ALL);
if(cstat != CURLE_OK)
status = NC_ECURL;
}
#endif
return status;
}
int
NCDISPATCH_finalize(void)
{
int status = NC_NOERR;
NC_freeglobalstate();
#if defined(ENABLE_BYTERANGE) || defined(ENABLE_DAP) || defined(ENABLE_DAP4)
curl_global_cleanup();
#endif
#if defined(ENABLE_DAP4)
ncxml_finalize();
#endif
return status;
}
|