netcdf-c/ncdump/tst_rcmerge.c
Dennis Heimbigner aabbdbf64c Make public a limited API for programmatic access to internal .rc tables
re: https://github.com/Unidata/netcdf-c/issues/2337
re: https://github.com/Unidata/netcdf-c/issues/2407

Add two functions to netcdf.h to allow programs to get/set
selected entries into the internal .rc tables. This should fix
the above issues by allowing HTTP.CAINFO to be set to the
certificates directory.  Note that the changes should be
performed as early as possible in the program because some of
the .rc table entries may get cached internally and changing the
entry after that caching occurs may have no effect.

The new signatures are as follows:

1. Get the value of a simple .rc entry of the form "key=value".
Note that caller must free the returned value, which might be NULL.
````
char* nc_rc_get(char* const * key);

@param key table entry key
@return value if .rc table has entry of the form key=value
@return NULL if no such entry is found.
````

2. Insert/Overwrite the specified key=value pair in the .rc table.
````
int nc_rc_set(const char* key, const char* value);

@param key table entry key -- may not be NULL
@param value table entry value -- may not be NULL
@return NC_NOERR if no error
@return NC_EINVAL if error
````

Addendum:

re: https://github.com/Unidata/netcdf-c/issues/2407

Modify dhttp.c to use the .rc entry HTTP.CAINFO if defined.
2022-06-17 14:35:12 -06:00

52 lines
1.0 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "netcdf.h"
#include "ncrc.h"
#include "nc4internal.h"
static void
printrc(NCglobalstate* ngs)
{
size_t i,nentries = 0;
NCRCinfo* info = NULL;
NCRCentry* entry = NULL;
info = ngs->rcinfo;
if(info->ignore) {
fprintf(stderr,".rc ignored\n");
return;
}
/* Print out the .rc entries */
if((nentries = NC_rcfile_length(info))==0) {
printf("<empty>\n");
exit(0);
}
for(i=0;i<nentries;i++) {
entry = NC_rcfile_ith(info,i);
if(entry == NULL) abort();
if(entry->host != NULL) {
printf("[%s ",entry->host);
if(entry->urlpath != NULL)
printf("/%s] ",entry->urlpath);
printf("]");
}
printf("|%s|->|%s|\n",entry->key,entry->value);
}
}
int
main(int argc, char** argv)
{
NCglobalstate* ngs = NC_getglobalstate();
/* Cause the .rc files to be read and merged */
nc_initialize();
if((ngs = NC_getglobalstate())==NULL) abort();
printrc(ngs);
return 0;
}