int ncsetlogging(int tf) { int was; if(!nclogginginitialized) ncloginit(); was = nclogging; nclogging = tf; return was; }
int NCCR_initialize(void) { /* Create our dispatch table as the merge of NC4 table plus some overrides */ NC_dispatch_overlay(&NCCR_dispatch_base, NC4_dispatch_table, &NCCR_dispatcher); NCCR_dispatch_table = &NCCR_dispatcher; ncloginit(); return NC_NOERR; }
int NCCR_initialize(void) { /* Create our dispatch table as the merge of NCCR table and NCSUBSTRATE */ /* watch the order because we want NCCR to overwrite NCSUBSTRATE */ NC_dispatch_overlay(&NCCR_dispatch_base, NCSUBSTRATE_dispatch_table, &NCCR_dispatcher); NCCR_dispatch_table = &NCCR_dispatcher; ncloginit(); return NC_NOERR; }
void nclogclose(void) { if(!nclogginginitialized) ncloginit(); if(nclogstream != NULL && !ncsystemfile) { fclose(nclogstream); } if(nclogfile != NULL) free(nclogfile); nclogstream = NULL; nclogfile = NULL; ncsystemfile = 0; }
void nclog(int tag, const char* fmt, ...) { va_list args; char* prefix; if(!nclogginginitialized) ncloginit(); if(!nclogging || nclogstream == NULL) return; prefix = nctagname(tag); fprintf(nclogstream,"%s:",prefix); if(fmt != NULL) { va_start(args, fmt); vfprintf(nclogstream, fmt, args); va_end( args ); } fprintf(nclogstream, "\n" ); fflush(nclogstream); }
int nclogopen(const char* file) { if(!nclogginginitialized) ncloginit(); nclogclose(); if(file == NULL || strlen(file) == 0) { /* use stderr*/ nclogstream = stderr; nclogfile = NULL; ncsystemfile = 1; } else if(strcmp(file,"stdout") == 0) { /* use stdout*/ nclogstream = stdout; nclogfile = NULL; ncsystemfile = 1; } else if(strcmp(file,"stderr") == 0) { /* use stderr*/ nclogstream = stderr; nclogfile = NULL; ncsystemfile = 1; } else { int fd; nclogfile = strdup(file); nclogstream = NULL; /* We need to deal with this file carefully to avoid unauthorized access*/ fd = open(nclogfile,O_WRONLY|O_APPEND|O_CREAT,0600); if(fd >= 0) { nclogstream = fdopen(fd,"a"); } else { free(nclogfile); nclogfile = NULL; nclogstream = NULL; ncsetlogging(0); return 0; } ncsystemfile = 0; } return 1; }
/* See ncd3dispatch.c for other version */ int NCD3_open(const char * path, int mode, int basepe, size_t *chunksizehintp, int useparallel, void* mpidata, NC_Dispatch* dispatch, NC** ncpp) { NCerror ncstat = NC_NOERR; OCerror ocstat = OC_NOERR; NC* drno = NULL; NCDAPCOMMON* dapcomm = NULL; const char* value; char* tmpname = NULL; if(!nc3dinitialized) nc3dinitialize(); if(path == NULL) return NC_EDAPURL; if(dispatch == NULL) PANIC("NC3D_open: no dispatch table"); /* Setup our NC and NCDAPCOMMON state*/ drno = (NC*)calloc(1,sizeof(NC)); if(drno == NULL) {ncstat = NC_ENOMEM; goto done;} /* compute an ncid */ ncstat = add_to_NCList(drno); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} dapcomm = (NCDAPCOMMON*)calloc(1,sizeof(NCDAPCOMMON)); if(dapcomm == NULL) {ncstat = NC_ENOMEM; goto done;} drno->dispatch = dispatch; drno->dispatchdata = dapcomm; dapcomm->controller = (NC*)drno; dapcomm->cdf.separator = "."; dapcomm->cdf.smallsizelimit = DFALTSMALLLIMIT; dapcomm->cdf.cache = createnccache(); #ifdef HAVE_GETRLIMIT { struct rlimit rl; if(getrlimit(RLIMIT_NOFILE, &rl) >= 0) { dapcomm->cdf.cache->cachecount = (size_t)(rl.rlim_cur / 2); } } #endif #ifdef OCCOMPILEBYDEFAULT /* set the compile flag by default */ dapcomm->oc.rawurltext = (char*)emalloc(strlen(path)+strlen("[compile]")+1); strcpy(dapcomm->oc.rawurltext,"[compile]"); strcat(dapcomm->oc.rawurltext, path); #else dapcomm->oc.rawurltext = strdup(path); #endif nc_uriparse(dapcomm->oc.rawurltext,&dapcomm->oc.url); /* parse the client parameters */ nc_uridecodeparams(dapcomm->oc.url); if(!constrainable34(dapcomm->oc.url)) SETFLAG(dapcomm->controls,NCF_UNCONSTRAINABLE); /* Use libsrc code for storing metadata */ tmpname = nulldup(PSEUDOFILE); /* Now, use the file to create the netcdf file */ if(sizeof(size_t) == sizeof(unsigned int)) ncstat = nc_create(tmpname,NC_CLOBBER,&drno->substrate); else ncstat = nc_create(tmpname,NC_CLOBBER|NC_64BIT_OFFSET,&drno->substrate); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* free the filename so it will automatically go away*/ unlink(tmpname); nullfree(tmpname); /* Avoid fill */ nc_set_fill(drno->substrate,NC_NOFILL,NULL); dapcomm->oc.dapconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); dapcomm->oc.dapconstraint->projections = nclistnew(); dapcomm->oc.dapconstraint->selections = nclistnew(); /* Parse constraints to make sure they are syntactically correct */ ncstat = parsedapconstraints(dapcomm,dapcomm->oc.url->constraint,dapcomm->oc.dapconstraint); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Complain if we are unconstrainable but have constraints */ if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { if(dapcomm->oc.url->constraint != NULL && strlen(dapcomm->oc.url->constraint) > 0) { nclog(NCLOGWARN,"Attempt to constrain an unconstrainable data source: %s", dapcomm->oc.url->constraint); } } /* Construct a url for oc minus any parameters */ dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL, (NC_URIALL ^ NC_URICONSTRAINTS)); /* Pass to OC */ ocstat = oc_open(dapcomm->oc.urltext,&dapcomm->oc.conn); if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} nullfree(dapcomm->oc.urltext); /* clean up */ dapcomm->oc.urltext = NULL; /* process control client parameters */ applyclientparamcontrols3(dapcomm); /* Turn on logging; only do this after oc_open*/ if((value = paramvalue34(dapcomm,"log")) != NULL) { ncloginit(); ncsetlogging(1); nclogopen(value); oc_loginit(); oc_setlogging(1); oc_logopen(value); } /* fetch and build the (almost) unconstrained DDS for use as template */ ncstat = fetchtemplatemetadata3(dapcomm); if(ncstat != NC_NOERR) goto done; /* fetch and build the constrained DDS */ ncstat = fetchconstrainedmetadata3(dapcomm); if(ncstat != NC_NOERR) goto done; #ifdef DEBUG2 fprintf(stderr,"constrained dds: %s\n",dumptree(dapcomm->cdf.ddsroot)); #endif /* The following actions are (mostly) WRT to the constrained tree */ /* Accumulate useful nodes sets */ ncstat = computecdfnodesets3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Fix grids */ ncstat = fixgrids3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Locate and mark usable sequences */ ncstat = sequencecheck3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* suppress variables not in usable sequences */ ncstat = suppressunusablevars3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* apply client parameters */ ncstat = applyclientparams34(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Add (as needed) string dimensions*/ ncstat = addstringdims(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} if(nclistlength(dapcomm->cdf.seqnodes) > 0) { /* Build the sequence related dimensions */ ncstat = defseqdims(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} } /* Define the dimsetplus and dimsetall lists */ ncstat = definedimsets3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Re-compute the dimension names*/ ncstat = computecdfdimnames34(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Deal with zero size dimensions */ ncstat = fixzerodims3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Attempt to use the DODS_EXTRA info to turn one of the dimensions into unlimited. Assume computecdfdimnames34 has already been called. */ ncstat = defrecorddim3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} if(dapcomm->cdf.recorddimname != NULL && nclistlength(dapcomm->cdf.seqnodes) > 0) { /*nclog(NCLOGWARN,"unlimited dimension specified, but sequences exist in DDS");*/ PANIC("unlimited dimension specified, but sequences exist in DDS"); } /* Re-compute the var names*/ ncstat = computecdfvarnames3(dapcomm,dapcomm->cdf.ddsroot,dapcomm->cdf.varnodes); if(ncstat) {THROWCHK(ncstat); goto done;} /* Transfer data from the unconstrained DDS data to the unconstrained DDS */ ncstat = dimimprint3(dapcomm); if(ncstat) goto done; /* Process the constraints to map to the constrained CDF tree */ /* (must follow fixgrids3 */ ncstat = mapconstraints3(dapcomm->oc.dapconstraint,dapcomm->cdf.ddsroot); if(ncstat != NC_NOERR) goto done; /* Canonicalize the constraint */ ncstat = fixprojections(dapcomm->oc.dapconstraint->projections); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Fill in segment information */ ncstat = qualifyconstraints3(dapcomm->oc.dapconstraint); if(ncstat != NC_NOERR) goto done; /* using the modified constraint, rebuild the constraint string */ if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { /* ignore all constraints */ dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL,0); } else { char* constraintstring = buildconstraintstring3(dapcomm->oc.dapconstraint); nc_urisetconstraints(dapcomm->oc.url,constraintstring); nullfree(constraintstring); dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL,NC_URICONSTRAINTS); } #ifdef DEBUG fprintf(stderr,"ncdap3: final constraint: %s\n",dapcomm->oc.url->constraint); #endif /* Estimate the variable sizes */ estimatevarsizes3(dapcomm); /* Build the meta data */ ncstat = buildncstructures3(dapcomm); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Do any necessary data prefetch */ if(FLAGSET(dapcomm->controls,NCF_PREFETCH)) { ncstat = prefetchdata3(dapcomm); if(ncstat != NC_NOERR) { del_from_NCList((NC*)drno); /* undefine here */ {THROWCHK(ncstat); goto done;} } } { /* Mark as no longer writable and no longer indef; requires breaking abstraction */ NC* nc; ncstat = NC_check_id(drno->substrate, &nc); /* Mark as no longer writeable */ fClr(nc->nciop->ioflags, NC_WRITE); /* Mark as no longer indef; (do NOT use nc_enddef until diskless is working)*/ fSet(nc->flags, NC_INDEF); } if(ncpp) *ncpp = (NC*)drno; return ncstat; done: if(drno != NULL) NCD3_abort(drno->ext_ncid); if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); return THROW(ncstat); }
void ncsetlogging(int tf) { if(!ncinitlog) ncloginit(); nclogging = tf; }
/* Allow dispatch to do general initialization and finalization */ int NCDISPATCH_initialize(void) { int status = NC_NOERR; int i; memset(&ncrc_globalstate,0,sizeof(NCRCglobalstate)); for(i=0;i<NC_MAX_VAR_DIMS;i++) { nc_sizevector0[i] = 0; nc_sizevector1[i] = 1; nc_ptrdiffvector1[i] = 1; } for(i=0;i<NC_MAX_VAR_DIMS;i++) { NC_coord_one[i] = 1; NC_coord_zero[i] = 0; } /* Capture temp dir*/ { char* tempdir; char* p; char* q; char cwd[4096]; #ifdef _MSC_VER tempdir = getenv("TEMP"); #else tempdir = "/tmp"; #endif if(tempdir == NULL) { fprintf(stderr,"Cannot find a temp dir; using ./\n"); tempdir = getcwd(cwd,sizeof(cwd)); if(tempdir == NULL || *tempdir == '\0') tempdir = "."; } ncrc_globalstate.tempdir= (char*)malloc(strlen(tempdir) + 1); for(p=tempdir,q=ncrc_globalstate.tempdir;*p;p++,q++) { if((*p == '/' && *(p+1) == '/') || (*p == '\\' && *(p+1) == '\\')) {p++;} *q = *p; } *q = '\0'; #ifdef _MSC_VER #else /* Canonicalize */ for(p=ncrc_globalstate.tempdir;*p;p++) { if(*p == '\\') {*p = '/'; }; } *q = '\0'; #endif } /* Capture $HOME */ { char* p; char* q; char* home = getenv("HOME"); if(home == NULL) { /* use tempdir */ home = ncrc_globalstate.tempdir; } ncrc_globalstate.home = (char*)malloc(strlen(home) + 1); for(p=home,q=ncrc_globalstate.home;*p;p++,q++) { if((*p == '/' && *(p+1) == '/') || (*p == '\\' && *(p+1) == '\\')) {p++;} *q = *p; } *q = '\0'; #ifdef _MSC_VER #else /* Canonicalize */ for(p=home;*p;p++) { if(*p == '\\') {*p = '/'; }; } #endif } /* Now load RC File */ status = NC_rcload(); ncloginit(); return status; }