1/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
2   See the COPYRIGHT file for more information. */
3
4#ifndef OCINTERNAL_H
5#define OCINTERNAL_H
6
7#include "config.h"
8
9
10#if defined(_WIN32) || defined(_WIN64)
11#include <malloc.h>
12#endif
13
14/* Required for getcwd, other functions. */
15#ifdef _MSC_VER
16#include <direct.h>
17#define getcwd _getcwd
18#endif
19
20#ifdef _AIX
21#include <netinet/in.h>
22#endif
23
24#include <stdlib.h>
25#include <assert.h>
26#include <string.h>
27#ifdef HAVE_STRINGS_H
28#include <strings.h>
29#endif
30#ifdef HAVE_STDARG_H
31#include <stdarg.h>
32#endif
33#ifdef HAVE_UNISTD_H
34#include <unistd.h>
35#endif
36#ifdef HAVE_SYS_TYPES_H
37#include <sys/types.h>
38#endif
39
40#define CURL_DISABLE_TYPECHECK 1
41#include <curl/curl.h>
42
43#include "oclist.h"
44#include "ocbytes.h"
45#include "ocuri.h"
46
47#ifndef HAVE_STRNDUP
48/* Not all systems have strndup, so provide one*/
49#define strndup ocstrndup
50#endif
51
52#define OCCACHEPOS
53
54#ifndef HAVE_STRNDUP
55/* Not all systems have strndup, so provide one*/
56#define strndup ocstrndup
57#endif
58
59#define OCPATHMAX 8192
60
61#ifndef nullfree
62#define nullfree(x) {if((x)!=NULL) free(x);}
63#endif
64
65/* Forwards */
66typedef struct OCstate OCstate;
67typedef struct OCnode OCnode;
68typedef struct OCdata OCdata;
69struct OCTriplestore;
70
71/* Define the internal node classification values */
72#define OC_None  0
73#define OC_State 1
74#define OC_Node  2
75#define OC_Data  3
76
77/* Define a magic number to mark externally visible oc objects */
78#define OCMAGIC ((unsigned int)0x0c0c0c0c) /*clever, huh*/
79
80/* Max rc file line size */
81#define MAXRCLINESIZE 4096
82
83/* Max number of triples from an rc file */
84#define MAXRCLINES 4096
85
86/* Define a struct that all oc objects must start with */
87/* OCheader must be defined here to make it available in other headers */
88typedef struct OCheader {
89    unsigned int magic;
90    unsigned int occlass;
91OCheader;
92
93#include "oc.h"
94#include "ocx.h"
95#include "ocnode.h"
96#include "ocdata.h"
97#include "occonstraints.h"
98#include "ocutil.h"
99#include "oclog.h"
100#include "xxdr.h"
101#include "ocdatatypes.h"
102#include "occompile.h"
103
104#ifndef nulldup
105#define nulldup(s) (s==NULL?NULL:strdup(s))
106#endif
107
108/*
109 * Macros for dealing with flag bits.
110 */
111#define fset(t,f)       ((t) |= (f))
112#define fclr(t,f)       ((t) &= ~(f))
113#define fisset(t,f)     ((t) & (f))
114
115#define nullstring(s) (s==NULL?"(null)":s)
116#define PATHSEPARATOR "."
117
118#define OCDIR "oc"
119
120/* Define infinity for memory size */
121#if SIZEOF_SIZE_T == 4
122#define OCINFINITY ((size_t)0xffffffff)
123#else
124#define OCINFINITY ((size_t)0xffffffffffffffff)
125#endif
126
127/* Extend the OCdxd type for internal use */
128#define OCVER 3
129
130/* Default initial memory packet size */
131#define DFALTPACKETSIZE 0x20000 /*approximately 100k bytes*/
132
133/* Default maximum memory packet size */
134#define DFALTMAXPACKETSIZE 0x3000000 /*approximately 50M bytes*/
135
136/* Default user agent string (will have version appended)*/
137#define DFALTUSERAGENT "oc"
138
139/* Hold known curl flags */
140
141enum OCCURLFLAGTYPE {CF_UNKNOWN=0,CF_OTHER=1,CF_STRING=2,CF_LONG=3};
142struct OCCURLFLAG {
143    const char* name;
144    int flag;
145    int value;
146    enum OCCURLFLAGTYPE type;
147};
148
149struct OCTriplestore {
150    int ntriples;
151    struct OCTriple {
152        char host[MAXRCLINESIZE]; /* includes port if specified */
153        char key[MAXRCLINESIZE];
154        char value[MAXRCLINESIZE];
155   } triples[MAXRCLINES];
156};
157
158/* Collect global state info in one place */
159extern struct OCGLOBALSTATE {
160    int initialized;
161    struct {
162        int proto_file;
163        int proto_https;
164    } curl;
165    char* tempdir; /* track a usable temp dir */
166    char* home; /* track $HOME for use in creating $HOME/.oc dir */
167    struct {
168 int ignore; /* if 1, then do not use any rc file */
169 int loaded;
170        struct OCTriplestore daprc; /* the rc file triple store fields*/
171        char* rcfile; /* specified rcfile; overrides anything else */
172    } rc;
173ocglobalstate;
174
175/*! Specifies the OCstate = non-opaque version of OClink */
176struct OCstate {
177    OCheader header; /* class=OC_State */
178    OClisttrees; /* list<OCNODE*> ; all root objects */
179    OCURIuri; /* base URI*/
180    OCbytespacket; /* shared by all trees during construction */
181    struct OCerrdata {/* Hold info for an error return from server */
182 char* code;
183 char* message;
184 long  httpcode;
185 char  curlerrorbuf[CURL_ERROR_SIZE]; /* CURLOPT_ERRORBUFFER*/
186    } error;
187    CURLcurl; /* curl handle*/
188    char curlerror[CURL_ERROR_SIZE];
189    struct OCcurlflags {
190        int proto_file; /* Is file: supported? */
191        int proto_https; /* is https: supported? */
192 int compress; /*CURLOPT_ENCODING*/
193 int verbose; /*CURLOPT_ENCODING*/
194 int timeout; /*CURLOPT_TIMEOUT*/
195 int maxredirs; /*CURLOPT_MAXREDIRS*/
196 char* useragent; /*CURLOPT_USERAGENT*/
197 /* track which of these are created by oc */
198#define COOKIECREATED 1
199#define NETRCCREATED 2
200 int createdflags;
201 char* cookiejar; /*CURLOPT_COOKIEJAR,CURLOPT_COOKIEFILE*/
202 char* netrc; /*CURLOPT_NETRC,CURLOPT_NETRC_FILE*/
203    } curlflags;
204    struct OCSSL {
205 int   verifypeer; /* CURLOPT_SSL_VERIFYPEER;
206                             do not do this when cert might be self-signed
207                             or temporarily incorrect */
208 int   verifyhost; /* CURLOPT_SSL_VERIFYHOST; for client-side verification */
209        char* certificate; /*CURLOPT_SSLCERT*/
210 char* key; /*CURLOPT_SSLKEY*/
211 char* keypasswd; /*CURLOPT_SSLKEYPASSWD*/
212        char* cainfo; /* CURLOPT_CAINFO; certificate authority */
213 char* capath;  /*CURLOPT_CAPATH*/
214    } ssl;
215    struct OCproxy {
216 char *host; /*CURLOPT_PROXY*/
217 int port; /*CURLOPT_PROXYPORT*/
218 char* userpwd; /*CURLOPT_PROXYUSERPWD*/
219    } proxy;
220    struct OCcredentials {
221 char *userpwd; /*CURLOPT_USERPWD*/
222    } creds;
223    void* usercurldata;
224    long ddslastmodified;
225    long datalastmodified;
226};
227
228/*! OCtree holds extra state info about trees */
229
230typedef struct OCtree
231{
232    OCdxd  dxdclass;
233    char* constraint;
234    char* text;
235    struct OCnoderoot; /* cross link */
236    struct OCstatestate; /* cross link */
237    OClistnodes; /* all nodes in tree*/
238    /* when dxdclass == OCDATADDS */
239    struct {
240 char*   memory;   /* allocated memory if OC_ONDISK is not set */
241        char*   filename; /* If OC_ONDISK is set */
242        FILE*   file;
243        off_t   datasize; /* xdr size on disk or in memory */
244        off_t   bod;      /* offset of the beginning of packet data */
245        off_t   ddslen;   /* length of ddslen (assert(ddslen <= bod)) */
246        XXDR*   xdrs; /* access either memory or file */
247        OCdatadata;
248    } data;
249OCtree;
250
251/* (Almost) All shared procedure definitions are kept here
252   except for: ocdebug.h ocutil.h
253   The true external interface is defined in oc.h
254*/
255
256#if 0
257/* Location: ceparselex.c*/
258extern int cedebug;
259extern OClistCEparse(OCstate*,char* input);
260#endif
261
262extern OCerror ocopen(OCstate** statep, const char* url);
263extern void occlose(OCstatestate);
264extern OCerror ocfetch(OCstate*, const char*, OCdxdOCflagsOCnode**);
265extern int oc_network_order;
266extern int oc_invert_xdr_double;
267extern OCerror ocinternalinitialize(void);
268
269extern OCerror ocupdatelastmodifieddata(OCstatestate);
270
271extern OCerror ocset_useragent(OCstatestate, const char* agent);
272extern OCerror ocset_netrc(OCstatestate, const char* path);
273
274/* From ocrc.c */
275extern OCerror ocrc_load(); /* find, read, and compile */
276extern OCerror ocrc_process(OCstatestate); /* extract relevant triples */
277extern char* ocrc_lookup(char* key, char* url);
278extern struct OCTripleocrc_triple_iterate(char* key, char* url, struct OCTripleprevp);
279extern int ocparseproxy(OCstatestate, char* v);
280
281#endif /*COMMON_H*/


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