ZOO-Project
service.h
Go to the documentation of this file.
1 /*
2  * Author : GĂ©rald FENOY
3  *
4  * Copyright (c) 2009-2024 GeoLabs SARL
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 
25 #ifndef ZOO_SERVICE_H
26 #define ZOO_SERVICE_H 1
27 
28 #pragma once
29 
30 #include "version.h"
31 #ifdef WIN32
32 #define ZOO_DLL_EXPORT __declspec( dllexport )
33 #else
34 #define ZOO_DLL_EXPORT
35 #endif
36 
37 // ISO8601 compatible date format (RFC 3339)
38 #define zDateFormat "%Y-%m-%dT%H:%M:%SZ"
39 
40 // Debug Messages date format
41 #define zLogDateFormat "%Y-%m-%d %H:%M:%S"
42 
43 #include <sys/time.h>
44  // knut: add bool if necessary
45 #ifndef __cplusplus
46 #ifndef WIN32
47 #include <stdbool.h>
48 #else
49 typedef int bool;
50 #define false 0
51 #define true 1
52 #endif
53 #endif
54 #ifndef __bool_true_false_are_defined
55 #define __bool_true_false_are_defined 1
56 #endif
57 
58 #ifdef WIN32
59 #define strtok_r strtok_s
60 #define strncasecmp _strnicmp
61 #define strcasecmp _stricmp
62 #if defined(_MSC_VER) && _MSC_VER < 1900
63 #define snprintf _snprintf
64 #endif
65 #define zStrdup _strdup
66 #define zMkdir _mkdir
67 #define zGetpid _getpid
68 #define zOpen _open
69 #define zClose _close
70 #define zUnlink _unlink
71 #define zDup _dup
72 #define zDup2 _dup2
73 #define zWrite _write
74 #define zSleep Sleep
75 #define zGetCwd _getcwd
76 #include <sys/timeb.h>
77 
78 struct ztimeval {
79  long tv_sec; /* seconds */
80  long tv_usec; /* and microseconds */
81 };
82 static int zGettimeofday(struct ztimeval* tp, void* tzp)
83 {
84  if (tp == 0) {
85  return -1;
86  }
87 
88  struct _timeb theTime;
89  _ftime(&theTime);
90  tp->tv_sec = theTime.time;
91  tp->tv_usec = theTime.millitm * 1000;
92 
93  return 0; // The gettimeofday() function shall return 0 on success
94 }
95 
96 #define zStatStruct struct _stati64
97 #define zStat _stati64
98 
99 #else
100 #include <sys/stat.h>
104 #define zStrdup strdup
105 
108 static int zMkdir(const char* pccPath){
109  return mkdir(pccPath,0777);
110 }
114 #define zOpen open
115 
118 #define zClose close
119 
122 #define zUnlink unlink
123 
126 #define zDup dup
127 
130 #define zDup2 dup2
131 
134 #define zWrite write
135 #include "unistd.h"
139 static int zSleep(const long millisecond){
140  return usleep(millisecond*1000);
141 }
145 #define zGettimeofday gettimeofday
146 
149 #define ztimeval timeval
150 
153 #define zGetpid getpid
154 
155 #define zStatStruct struct stat64
156 #define zStat stat64
157 
158 #define zGetCwd getcwd
159 
160 #endif
161 
162 #ifdef __cplusplus
163 extern "C" {
164 #endif
165 
166 #ifdef WIN32
167 #ifdef USE_MS
168 #include <mapserver.h>
169 #endif
170 #endif
171 #include <stdlib.h>
172 #include <stdarg.h>
173 #include <ctype.h>
174 
175 #include <stdio.h>
176 
177 #include <string.h>
178 #ifndef WIN32
179 #include <ctype.h>
180 #include <stdbool.h>
181 #endif
182 
186 #define SERVICE_ACCEPTED 0
187 
190 #define SERVICE_STARTED 1
191 
194 #define SERVICE_PAUSED 2
195 
198 #define SERVICE_SUCCEEDED 3
199 
202 #define SERVICE_FAILED 4
203 
206 #define SERVICE_DISMISSED 5
207 
210 #define SERVICE_DEPLOYED 6
211 
214 #define SERVICE_UNDEPLOYED 7
215 
219 #define TIME_SIZE 40
220 
224 #define ZOO_DEBUG_LEVEL_ALL -1
225 
228 #define ZOO_DEBUG_LEVEL_TRACE 0
229 
232 #define ZOO_DEBUG_LEVEL_DEBUG 1
233 
236 #define ZOO_DEBUG_LEVEL_INFO 2
237 
240 #define ZOO_DEBUG_LEVEL_SUCCESS 3
241 
244 #define ZOO_DEBUG_LEVEL_WARNING 4
245 
248 #define ZOO_DEBUG_LEVEL_ERROR 5
249 
252 #define ZOO_DEBUG_LEVEL_FATAL 6
253 
256 #define ZOO_DEBUG_LEVEL_OFF 7
257 
261 static const char* pccLogLevel[8]={
262  "TRACE",
263  "DEBUG",
264  "INFO",
265  "SUCCESS",
266  "WARNING",
267  "ERROR",
268  "CRITICAL",
269  "OFF"
270 };
271 
275 extern int iZooLogLevel;
276 
293 extern int iMinZooLogLevel;
294 
304 #define ZOO_LOG_MESSAGE(message) _ZOO_DEBUG(message,__FILE__,__func__,__LINE__)
305 
314 #define ZOO_LOG_MESSAGE_WITH_LEVEL(level,message,...) do {\
315  if(level<=iMinZooLogLevel)\
316  break;\
317  _ZOO_LOG_MSG(level,__FILE__,__func__,__LINE__,message,##__VA_ARGS__);\
318 } while(0)
319 
323 #define ZOO_TRACE(message,...) \
324  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_TRACE,message,##__VA_ARGS__)
325 
328 #define ZOO_DEBUG(message,...) \
329  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_DEBUG,message,##__VA_ARGS__)
330 
333 #define ZOO_INFO(message,...) \
334  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_INFO,message,##__VA_ARGS__)
335 
338 #define ZOO_SUCCESS(message,...) \
339  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_SUCCESS,message,##__VA_ARGS__)
340 
343 #define ZOO_WARNING(message,...) \
344  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_WARNING,message,##__VA_ARGS__)
345 
348 #define ZOO_ERROR(message,...) \
349  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_ERROR,message,##__VA_ARGS__)
350 
353 #define ZOO_FATAL(message,...) \
354  ZOO_LOG_MESSAGE_WITH_LEVEL(ZOO_DEBUG_LEVEL_FATAL,message,##__VA_ARGS__)
355 
387 #define ZOO_COLOR_START "\e[0;"
388 
392 #define ZOO_COLOR_START_BOLD "\e[1;"
393 
397 #define ZOO_COLOR_STANDARD "3"
398 
402 #define ZOO_COLOR_HIGH_INTENSITY "9"
403 
404 #define ZOO_COLOR_BLACK "0m"
405 #define ZOO_COLOR_RED "1m"
406 #define ZOO_COLOR_GREEN "2m"
407 #define ZOO_COLOR_YELLOW "3m"
408 #define ZOO_COLOR_BLUE "4m"
409 #define ZOO_COLOR_MAGENTA "5m"
410 #define ZOO_COLOR_CYAN "6m"
411 #define ZOO_COLOR_WHITE "7m"
412 
413 #define ZOO_COLOR_START_BACKGROUND "\e[4"
414 #define ZOO_COLOR_START_BACKGROUND_HIGH_INTENSITY "\e[0;10"
415 
416 #define ZOO_COLOR_RESET "\e[0m"
417 
418 #include "time.h"
443 #define _ZOO_DEBUG(message,pccFile,pccFunc,iLine) \
444 do {\
445  if(iZooLogLevel<=iMinZooLogLevel)\
446  break;\
447  \
448  int iSaTTY=isatty(2); \
449  const struct tm *pcsTm; \
450  time_t ttNow; \
451  size_t stLen; \
452  struct ztimeval sztv; \
453  ttNow = time ( NULL ); \
454  pcsTm = localtime ( &ttNow ); \
455  char* pcaLocalTime = (char*)malloc((TIME_SIZE+1)*sizeof(char)); \
456  zGettimeofday(&sztv, NULL); \
457  int iMillisec = int(sztv.tv_usec/1000.0); \
458  if (iMillisec>=1000) { \
459  iMillisec -=1000; \
460  sztv.tv_sec++; \
461  } \
462  stLen = strftime ( pcaLocalTime, TIME_SIZE, zLogDateFormat, pcsTm ); \
463  char pcExtra[8]={0}; \
464  int iLength=8; \
465  int iCounter=0; \
466  for(int iCnt=strlen(pccLogLevel[iZooLogLevel]);iCnt<8;iCnt++){ \
467  pcExtra[iCounter]=' '; \
468  iCounter++; \
469  } \
470  char* pcaFormated=NULL; \
471  char acFormated[64]={0}; \
472  char* apcaArgv[7]; \
473  int aiTypes[7]={0,0,0,0,0,0,0}; \
474  int iInternalCnt=0; \
475  for(int iCnt=0;iCnt<strlen(ZOO_LOG_FORMAT);iCnt++){ \
476  if(ZOO_LOG_FORMAT[iCnt]=='%'){ \
477  int iLen=strlen(acFormated); \
478  acFormated[iLen]=ZOO_LOG_FORMAT[iCnt]; \
479  acFormated[iLen+1]='s'; \
480  const char* pcColor="\e[0;97m"; \
481  switch(iZooLogLevel){ \
482  case ZOO_DEBUG_LEVEL_TRACE:\
483  pcColor=ZOO_COLOR_START_BOLD\
484  ZOO_COLOR_STANDARD \
485  ZOO_COLOR_WHITE;\
486  break;\
487  case ZOO_DEBUG_LEVEL_DEBUG:\
488  pcColor=ZOO_COLOR_START_BOLD\
489  ZOO_COLOR_HIGH_INTENSITY\
490  ZOO_COLOR_CYAN;\
491  break;\
492  case ZOO_DEBUG_LEVEL_INFO:\
493  pcColor=ZOO_COLOR_START_BOLD\
494  ZOO_COLOR_HIGH_INTENSITY\
495  ZOO_COLOR_WHITE;\
496  break;\
497  case ZOO_DEBUG_LEVEL_SUCCESS:\
498  pcColor=ZOO_COLOR_START_BOLD\
499  ZOO_COLOR_HIGH_INTENSITY\
500  ZOO_COLOR_GREEN;\
501  break;\
502  case ZOO_DEBUG_LEVEL_WARNING:\
503  pcColor=ZOO_COLOR_START_BOLD\
504  ZOO_COLOR_HIGH_INTENSITY\
505  ZOO_COLOR_YELLOW;\
506  break;\
507  case ZOO_DEBUG_LEVEL_ERROR:\
508  pcColor=ZOO_COLOR_START_BOLD\
509  ZOO_COLOR_HIGH_INTENSITY\
510  ZOO_COLOR_RED;\
511  break;\
512  case ZOO_DEBUG_LEVEL_FATAL:\
513  pcColor=ZOO_COLOR_START_BACKGROUND\
514  ZOO_COLOR_RED\
515  ZOO_COLOR_START_BOLD\
516  ZOO_COLOR_HIGH_INTENSITY\
517  ZOO_COLOR_WHITE;\
518  break;\
519  } \
520  if(ZOO_LOG_FORMAT[iCnt+1]=='d'){ \
521  /* DATE Format: %s.%03d */ \
522  apcaArgv[iInternalCnt]=(char*) malloc(37*sizeof(char)); \
523  if(iSaTTY>0)\
524  sprintf(apcaArgv[iInternalCnt],\
525  ZOO_COLOR_START_BOLD\
526  ZOO_COLOR_STANDARD\
527  ZOO_COLOR_GREEN\
528  "%s.%03d"\
529  ZOO_COLOR_RESET,\
530  pcaLocalTime,iMillisec); \
531  else\
532  sprintf(apcaArgv[iInternalCnt],"%s.%03d",pcaLocalTime,iMillisec); \
533  } \
534  else if(ZOO_LOG_FORMAT[iCnt+1]=='l'){ \
535  /* Debug level: %s %s */ \
536  apcaArgv[iInternalCnt]=(char*) malloc(36*sizeof(char)); \
537  if(iSaTTY>0)\
538  sprintf(apcaArgv[iInternalCnt],\
539  "%s%s%s"\
540  ZOO_COLOR_RESET,\
541  pcColor,\
542  pccLogLevel[iZooLogLevel],\
543  pcExtra); \
544  else\
545  sprintf(apcaArgv[iInternalCnt],"%s %s",pccLogLevel[iZooLogLevel],pcExtra); \
546  } \
547  else if(ZOO_LOG_FORMAT[iCnt+1]=='p'){ \
548  /* Process identifier: %p */ \
549  apcaArgv[iInternalCnt]=(char*) malloc(10*sizeof(char)); \
550  sprintf(apcaArgv[iInternalCnt],"%d",getpid()); \
551  } \
552  else if(ZOO_LOG_FORMAT[iCnt+1]=='f'){ \
553  /* File name: %f */ \
554  apcaArgv[iInternalCnt]=(char*) malloc((strlen(pccFile)+8)*sizeof(char)); \
555  if(iSaTTY>0)\
556  sprintf(apcaArgv[iInternalCnt],\
557  ZOO_COLOR_START\
558  ZOO_COLOR_STANDARD\
559  ZOO_COLOR_CYAN\
560  "%s",\
561  pccFile); \
562  else\
563  sprintf(apcaArgv[iInternalCnt],"%s",pccFile); \
564  } \
565  else if(ZOO_LOG_FORMAT[iCnt+1]=='u'){ \
566  /* Function name: %u */ \
567  apcaArgv[iInternalCnt]=(char*) malloc((strlen(pccFunc)+1)*sizeof(char)); \
568  sprintf(apcaArgv[iInternalCnt],"%s",pccFunc); \
569  } \
570  else if(ZOO_LOG_FORMAT[iCnt+1]=='i'){ \
571  /* Line number: %i */ \
572  apcaArgv[iInternalCnt]=(char*) malloc(14*sizeof(char)); \
573  if(iSaTTY>0)\
574  sprintf(apcaArgv[iInternalCnt],\
575  "%d"\
576  ZOO_COLOR_RESET,\
577  iLine); \
578  else\
579  sprintf(apcaArgv[iInternalCnt],"%d",iLine); \
580  } \
581  else if(ZOO_LOG_FORMAT[iCnt+1]=='m'){ \
582  /* Message: %m */ \
583  apcaArgv[iInternalCnt]=(char*) malloc((strlen(message)+25)*sizeof(char)); \
584  if(iSaTTY>0)\
585  sprintf(apcaArgv[iInternalCnt],\
586  "%s%s"\
587  ZOO_COLOR_RESET,\
588  pcColor,message); \
589  else\
590  sprintf(apcaArgv[iInternalCnt],"%s",message); \
591  } \
592  iInternalCnt++; \
593  iCnt++; \
594  }else{ \
595  int iLen=0; \
596  if(acFormated[0]!=0)\
597  iLen=strlen(acFormated);\
598  acFormated[iLen]=ZOO_LOG_FORMAT[iCnt];\
599  acFormated[iLen+1]=0;\
600  } \
601  } \
602  /* Minimal should be 2 (for the file+line) */ \
603  switch(iInternalCnt) {\
604  case 1: \
605  fprintf(stderr,(char*)acFormated,\
606  apcaArgv[0] \
607  ); \
608  break; \
609  case 2: \
610  fprintf(stderr,(char*)acFormated,\
611  apcaArgv[0], \
612  apcaArgv[1] \
613  ); \
614  break; \
615  case 3: \
616  fprintf(stderr,(char*)acFormated,\
617  apcaArgv[0], \
618  apcaArgv[1], \
619  apcaArgv[2] \
620  ); \
621  break; \
622  case 4: \
623  fprintf(stderr,(char*)acFormated,\
624  apcaArgv[0], \
625  apcaArgv[1], \
626  apcaArgv[2], \
627  apcaArgv[3] \
628  ); \
629  break; \
630  case 5: \
631  fprintf(stderr,(char*)acFormated,\
632  apcaArgv[0], \
633  apcaArgv[1], \
634  apcaArgv[2], \
635  apcaArgv[3], \
636  apcaArgv[4] \
637  ); \
638  break; \
639  case 6: \
640  fprintf(stderr,(char*)acFormated,\
641  apcaArgv[0], \
642  apcaArgv[1], \
643  apcaArgv[2], \
644  apcaArgv[3], \
645  apcaArgv[4], \
646  apcaArgv[5] \
647  ); \
648  break; \
649  default: \
650  fprintf(stderr,(char*)acFormated,\
651  apcaArgv[0], \
652  apcaArgv[1], \
653  apcaArgv[2], \
654  apcaArgv[3], \
655  apcaArgv[4], \
656  apcaArgv[5], \
657  apcaArgv[6] \
658  ); \
659  break; \
660  }\
661  /* myPrint(acFormated,apcaArgv) */ \
662  free(pcaLocalTime); \
663  for(int iCnt=iInternalCnt-1;iCnt>=0;iCnt--){ \
664  free(apcaArgv[iCnt]); \
665  } \
666 } while(0)
667 
671 #define ELEMENTS_SIZE (sizeof(char*)+(((2*sizeof(char*))+sizeof(maps*))*3)+sizeof(char*)+((sizeof(map*) + sizeof(iotype*))*2)+(2*sizeof(elements*)))
672 
675 //#define MAP_SIZE (2*sizeof(char*))+sizeof(NULL) // knut: size of NULL pointer may be different from regular pointer (platform dependent)
676 #define MAP_SIZE (2*sizeof(char*))+sizeof(map*)
677 
680 //#define IOTYPE_SIZE MAP_SIZE+sizeof(NULL)
681 #define IOTYPE_SIZE sizeof(map*) + sizeof(iotype*)
682 
685 //#define MAPS_SIZE (2*sizeof(char*))+sizeof(map*)+MAP_SIZE
686 #define MAPS_SIZE sizeof(char*)+sizeof(map*)+(2*sizeof(maps*))
687 
690 //#define SERVICE_SIZE (ELEMENTS_SIZE*2)+(MAP_SIZE*2)+sizeof(char*)
691 #define SERVICE_SIZE sizeof(char*) + 3*sizeof(map*) + 2*sizeof(elements*)
692 
695 //#define SERVICES_SIZE SERVICE_SIZE+sizeof(services*)
696 #define SERVICES_SIZE sizeof(service*)+sizeof(services*)
697 
700 //#define REGISTRY_SIZE SERVICES_SIZE+sizeof(char*)
701 #define REGISTRY_SIZE sizeof(char*)+sizeof(services*)+sizeof(registry*)
702 
703 #define SHMSZ 27
704 
705 #include "version.h"
706 
707 #ifdef DEBUG_STACK
708  void debugStack(const char* file,const int line){
709  int stack;
710  fprintf(stderr,"stack %p (%s: %d) \n",&stack,file,line);
711  }
712 #endif
713 
717  typedef struct map{
718  char* name;
719  char* value;
720  struct map* next;
721  } map;
722 
723 #ifdef WIN32
724 #define NULLMAP ((map*) 0)
725 // knut: see new definition above
726 //#define bool int
727 //#define true 1
728 //#define false 0
729 #else
730 #define NULLMAP NULL
731 #endif
732 
738  typedef struct maps{
739  char* name;
740  struct map* content;
741  struct maps* child;
742  struct maps* next;
743  } maps;
744 
750  typedef struct iotype{
751  struct map* content;
752  struct iotype* next;
753  } iotype;
754 
760  typedef struct elements{
761  char* name;
762  struct map* content;
763  struct map* metadata;
765  char* format;
766  struct iotype* defaults;
767  struct iotype* supported;
768  struct elements* child;
769  struct elements* next;
770  } elements;
771 
775  typedef struct service{
776  char* name;
777  struct map* content;
778  struct map* metadata;
780  struct elements* inputs;
781  struct elements* outputs;
782  } service;
783 
787  typedef struct services{
788  struct service* content;
789  struct services* next;
790  } services;
791 
795  typedef struct registry{
796  char *name;
797  struct services* content;
798  struct registry* next;
799  } registry;
800 
804  static const char* ZOO_STATUS[] = {
805  "SERVICE_ACCEPTED",
806  "SERVICE_STARTED",
807  "SERVICE_PAUSED",
808  "SERVICE_SUCCEEDED",
809  "SERVICE_FAILED",
810  "SERVICE_DISMISSED",
811  "SERVICE_DEPLOYED",
812  "SERVICE_UNDEPLOYED",
813  NULL
814  };
815 
816  // knut
818  /*
819  * StatusOK is not a WPS exception, it is added
820  * here for convenience.
821  */
823  /*
824  * See WPS 1.0 specification, Table 38 and Table 62.
825  */
834  /*
835  * See WPS 2.0 specification, Tables 41, 46, 48, and 50.
836  */
850  };
851 
856  static const char* const WPSExceptionCode[] = {
857  "StatusOK",
858  "MissingParameterValue",
859  "InvalidParameterValue",
860  "NoApplicableCode",
861  "NotEnoughStorage",
862  "ServerBusy",
863  "FileSizeExceeded",
864  "StorageNotSupported",
865  "VersionNegotiationFailed",
866  "NoSuchProcess",
867  "NoSuchMode",
868  "NoSuchInput",
869  "NoSuchOutput",
870  "DataNotAccessible",
871  "SizeExceeded",
872  "TooManyInputs",
873  "TooManyOutputs",
874  "NoSuchFormat",
875  "WrongInputData",
876  "InternalServerError",
877  "NoSuchJob",
878  "ResultNotReady",
879  "InvalidQueryParameterValue",
880  "DuplicatedProcess",
881  "ImmutableProcess",
882  "UnsupportedMediaType",
883  "WorkflowNotFound"
884  };
885 
886 
891  static const int OAPIPCorrespondancesLength = 9;
892 
897  static const int OAPIPCorrespondances[9][2] = {
898  {9,0},
899  {20,1},
900  {21,2},
901  {22,3},
902  {12,8},
903  {23,4},
904  {24,5},
905  {25,6},
906  {26,7}
907  };
908 
918  static const int OAPIPExceptionLimits[1][2] = {
919  {5,1}
920  };
921 
926  static const char* const OAPIPExceptionCode[] = {
927  "no-such-process",
928  "no-such-job",
929  "result-not-ready",
930  "invalid-query-parameter-value",
931  "duplicated-process",
932  "immutable-process",
933  "unsupported-media-type",
934  "workflow-not-found",
935  "no-such-output"
936  };
937 
941  static const char* const OAPIPSupportedContentTypes[] = {
942  "application/json",
943  "application/cwl",
944  "application/cwl+yaml",
945  "application/ogcapppkg+json",
946  NULL
947  };
948 
953  static const char* const WPSExceptionText[] = {
954  "No problem detected",
955  "Operation request does not include a parameter value, and this server did not declare a default value for that parameter.",
956  "Operation request contains an invalid parameter value.",
957  "No other exceptionCode specified by this service and server applies to this exception.",
958  "The server does not have enough space available to store the inputs and outputs associated with the request.",
959  "The server is too busy to accept and queue the request at this time.",
960  "The file size of one of the input parameters was too large for this process to handle.",
961  "Execute operation request included transmission=”reference” for one of the outputs, but storage is not offered by this server.",
962  "Service version for a ComplexData xlink:href input was not supported by the referenced server, and version negotiation failed.",
963  "One of the identifiers passed does not match with any of the processes offered by this server.",
964  "The process does not permit the desired execution mode.",
965  "One or more of the input identifiers passed does not match with any of the input identifiers of this process.",
966  "One or more of the output identifiers passed does not match with any of the input identifiers of this process.",
967  "One of the referenced input data sets was inaccessible.",
968  "The size of one of the input parameters was too large for this process to handle.",
969  "Too many input items have been specified.",
970  "Too many output items have been specified.",
971  "One or more of the input or output formats specified in the request did not match with any of the formats defined for that particular input or output.",
972  "One or more of inputs for which the service was able to retrieve the data but could not read it.",
973  "",
974  "The JobID from the request does not match any of the Jobs running on this server.",
975  "The result for the requested JobID has not yet been generated."
976  };
977 
978  ZOO_DLL_EXPORT void setMinZooLogLevel(char*);
979  ZOO_DLL_EXPORT int _ZOO_LOG_MSG(int, const char*, const char*, int, const char *, ...)
980  __attribute__((format(printf, 5, 6)));
981  ZOO_DLL_EXPORT int zooDebugPrint( const char * format, ... );
982  ZOO_DLL_EXPORT void _dumpMap(map*);
983  ZOO_DLL_EXPORT void dumpMap(map*);
984  ZOO_DLL_EXPORT void dumpMaps(maps* m);
985  ZOO_DLL_EXPORT void dumpMapToFile(map*,FILE*); // (used only internally)
986  ZOO_DLL_EXPORT void dumpMapsToFile(maps*,char*,int);
987  ZOO_DLL_EXPORT map* createMap(const char*,const char*);
988  ZOO_DLL_EXPORT maps* createMaps(const char*);
989  ZOO_DLL_EXPORT int count(map*);
991  ZOO_DLL_EXPORT int countMapName(map*,const char*);
992  ZOO_DLL_EXPORT int countMapNameValue(map*,const char*);
993  ZOO_DLL_EXPORT bool hasKey(map*,const char*);
994  ZOO_DLL_EXPORT maps* getMaps(maps*,const char*);
995  ZOO_DLL_EXPORT map* getMap(map*,const char*);
997  ZOO_DLL_EXPORT map* getMapFromMaps(maps*,const char*,const char*);
998  ZOO_DLL_EXPORT void freeMap(map**);
999  ZOO_DLL_EXPORT void freeMaps(maps** mo);
1002  ZOO_DLL_EXPORT elements* createElements(const char*);
1003  ZOO_DLL_EXPORT void setElementsName(elements**,char*);
1004  ZOO_DLL_EXPORT bool hasElement(elements*,const char*);
1008  ZOO_DLL_EXPORT void setServiceName(service**,char*);
1011  ZOO_DLL_EXPORT void addToMap(map*,const char*,const char*);
1012  ZOO_DLL_EXPORT void addToMapA(map*,const char*,const char*);
1013  ZOO_DLL_EXPORT void addIntToMap(map*,const char*,const int);
1014  ZOO_DLL_EXPORT void addIntToMapArray(map*,const char*,int,const unsigned long);
1015  ZOO_DLL_EXPORT map* addToMapWithSize(map*,const char*,const char*,int);
1016  ZOO_DLL_EXPORT void addMapToMap(map**,map*);
1018  ZOO_DLL_EXPORT map* getMapOrFill(map**,const char*,const char*);
1019  ZOO_DLL_EXPORT bool contains(map*,map*);
1021  ZOO_DLL_EXPORT void loadMapBinary(map**,map*,int);
1025  ZOO_DLL_EXPORT map* getMapArray(map*,const char*,int);
1026  ZOO_DLL_EXPORT char* getMapArrayKey(map*,const char*,int);
1027  ZOO_DLL_EXPORT void setMapArray(map*,const char*,int,const char*);
1030  ZOO_DLL_EXPORT void setMapInMaps(maps*,const char*,const char*,const char*);
1042  ZOO_DLL_EXPORT void inheritMap(map**,map*);
1046  ZOO_DLL_EXPORT void mapsToCharXXX(maps*,char***);
1047  ZOO_DLL_EXPORT void charxxxToMaps(char***,maps**);
1048  // OGC-API - Processes - Part 1: Core processes list restriction
1049  ZOO_DLL_EXPORT void updateCnt(maps*, const char*, const char*);
1050  ZOO_DLL_EXPORT bool compareCnt(maps*, const char*, const char*);
1051 #if defined(_MSC_VER) && _MSC_VER < 1800
1052  // snprintf for Visual Studio compiler;
1053  // it is also used by services (e.g., GetStatus), therefore exported to shared library
1054  ZOO_DLL_EXPORT int snprintf(char *buffer, size_t n, const char *format, ...);
1055 #endif
1056 
1057  // knut: some new utility functions; logMessage is primarily intended for debugging
1058  ZOO_DLL_EXPORT bool nonempty(map* map);
1059  ZOO_DLL_EXPORT bool hasvalue(maps* source, const char* node, const char* key, map** kvp);
1060 #ifdef __cplusplus
1061  ZOO_DLL_EXPORT void setErrorMessage(maps*& conf, const char* service, WPSException exc, const char* message = NULL);
1062  ZOO_DLL_EXPORT void logMessage(const char* source, const char* function, int line, const char* file = NULL, const char* message = NULL);
1063 #endif
1064  #define zooLogMsg(file,message) logMessage(__FILE__, __func__, __LINE__, (file), (message))
1065  #define zooLog logMessage(__FILE__, __func__, __LINE__)
1066  ZOO_DLL_EXPORT int isValidUuid(const char*);
1067 
1068  // knut : function for pre-allocated memory for a map value;
1069  // processing algorithms may be able to write directly to this space, thereby avoiding unneccesary copying of data
1070  ZOO_DLL_EXPORT char* allocateMapValue(map* node, size_t num_bytes);
1071 
1072  ZOO_DLL_EXPORT char* getValueFromMaps(maps*,const char*);
1073  ZOO_DLL_EXPORT void _translateChar (char*, char, char);
1074 #ifdef __cplusplus
1075 }
1076 #endif
1077 
1078 #endif
1079 
1080 #ifdef LOG_CONSOLE_ENABLED
1081  void logConsoleMessage(const char*);
1082 #endif
freeIOType
ZOO_DLL_EXPORT void freeIOType(iotype **)
Free allocated memory of an iotype.
Definition: service.c:598
NoSuchInput
@ NoSuchInput
Definition: service.h:839
services
struct services services
Services chained list.
NoSuchOutput
@ NoSuchOutput
Definition: service.h:840
dupMaps
ZOO_DLL_EXPORT maps * dupMaps(maps **)
Duplicate a Maps.
Definition: service.c:1063
addMapToIoType
ZOO_DLL_EXPORT void addMapToIoType(iotype **, map *)
Add a map to iotype.
Definition: service.c:892
NoSuchMode
@ NoSuchMode
Definition: service.h:838
iotype
Not named linked list.
Definition: service.h:750
inheritIOType
ZOO_DLL_EXPORT void inheritIOType(iotype **, iotype *)
Apply inheritance to an out iotype from a reference in iotype.
Definition: service.c:1843
ZOO_STATUS
static const char * ZOO_STATUS[]
Statuses list.
Definition: service.h:804
freeMap
ZOO_DLL_EXPORT void freeMap(map **)
Free allocated memory of a map.
Definition: service.c:512
getLastMap
ZOO_DLL_EXPORT map * getLastMap(map *)
Access the last map.
Definition: service.c:478
FileSizeExceeded
@ FileSizeExceeded
Definition: service.h:831
dumpMapsToFile
ZOO_DLL_EXPORT void dumpMapsToFile(maps *, char *, int)
Dump a maps to a file, see _dumpMapsToFile().
Definition: service.c:274
NotEnoughStorage
@ NotEnoughStorage
Definition: service.h:829
elements::next
struct elements * next
the pointer to the next element if any (or NULL)
Definition: service.h:769
TooManyOutputs
@ TooManyOutputs
Definition: service.h:844
freeMaps
ZOO_DLL_EXPORT void freeMaps(maps **mo)
Free allocated memory of a maps.
Definition: service.c:536
OAPIPExceptionCode
static const char *const OAPIPExceptionCode[]
OGC API - Processes exception codes.
Definition: service.h:926
hasKey
ZOO_DLL_EXPORT bool hasKey(map *, const char *)
Verify if a key exist in a map.
Definition: service.c:422
TooManyInputs
@ TooManyInputs
Definition: service.h:843
n
pair PAIR FOUND n
Definition: service_conf.y:613
elements::content
struct map * content
the content map
Definition: service.h:762
getMapArray
ZOO_DLL_EXPORT map * getMapArray(map *, const char *, int)
Access a specific map array element.
Definition: service.c:1125
NoSuchProcess
@ NoSuchProcess
Definition: service.h:837
getMap
ZOO_DLL_EXPORT map * getMap(map *, const char *)
Access a specific map.
Definition: service.c:460
addToElements
ZOO_DLL_EXPORT void addToElements(elements **, elements *)
Add an elements to another elements.
Definition: service.c:1585
inheritElements
ZOO_DLL_EXPORT void inheritElements(elements **, elements *)
Apply inheritance to an out elements from a reference in elements.
Definition: service.c:1866
setServiceName
ZOO_DLL_EXPORT void setServiceName(service **, char *)
Set the name of a service.
Definition: service.c:1600
dumpMapToFile
ZOO_DLL_EXPORT void dumpMapToFile(map *, FILE *)
Dump a map to a file.
Definition: service.c:214
logMessage
void logMessage(const char *pccSource, const char *pccFunction, int iLne, const char *pccFile, const char *pccMessage)
Print debug message.
Definition: service.c:2052
ServerBusy
@ ServerBusy
Definition: service.h:830
map::value
char * value
the value
Definition: service.h:719
setMinZooLogLevel
ZOO_DLL_EXPORT void setMinZooLogLevel(char *)
Set the minimum log level for ZOO-Kernel.
Definition: service.c:75
OAPIPCorrespondancesLength
static const int OAPIPCorrespondancesLength
The length of the OAPIPCorrespondances array.
Definition: service.h:891
ResultNotReady
@ ResultNotReady
Definition: service.h:849
snprintf
snprintf(current_maps->name,(strlen($1)+1),"%s", $1)
addMapsToMaps
ZOO_DLL_EXPORT void addMapsToMaps(maps **, maps *)
Add a maps at the end of another maps.
Definition: service.c:1090
dumpMap
ZOO_DLL_EXPORT void dumpMap(map *)
Dump a map on stderr, see _dumpMap()
Definition: service.c:200
service
Metadata information about a full Service.
Definition: service.h:775
services::content
struct service * content
the content service pointer
Definition: service.h:788
elements
Metadata information about input or output.
Definition: service.h:760
service::additional_parameters
struct map * additional_parameters
the additional parameters map
Definition: service.h:779
VersionNegotiationFailed
@ VersionNegotiationFailed
Definition: service.h:833
getMapArrayKey
ZOO_DLL_EXPORT char * getMapArrayKey(map *, const char *, int)
Get the key name for a specific map array element.
Definition: service.c:1152
registry
struct registry registry
Profile registry.
OAPIPExceptionLimits
static const int OAPIPExceptionLimits[1][2]
OGC API - Processes exception limits.
Definition: service.h:918
maps
struct maps maps
linked list of map pointer
ztimeval
#define ztimeval
The crossplatform timeval alias.
Definition: service.h:149
createEmptyElements
ZOO_DLL_EXPORT elements * createEmptyElements()
Create an empty elements.
Definition: service.c:1333
NoSuchFormat
@ NoSuchFormat
Definition: service.h:845
StorageNotSupported
@ StorageNotSupported
Definition: service.h:832
getMapType
ZOO_DLL_EXPORT map * getMapType(map *)
Access the map "type".
Definition: service.c:1225
getMapFromMaps
ZOO_DLL_EXPORT map * getMapFromMaps(maps *, const char *, const char *)
Access a specific map from a maps.
Definition: service.c:497
services::next
struct services * next
the pointer to the next services*
Definition: service.h:789
addServiceToRegistry
ZOO_DLL_EXPORT bool addServiceToRegistry(registry **, char *, service *)
Add a service to the registry.
Definition: service.c:1717
compareCnt
ZOO_DLL_EXPORT bool compareCnt(maps *, const char *, const char *)
Compare a value with conf / lenv / serviceCnt.
Definition: service.c:2306
createIoType
ZOO_DLL_EXPORT iotype * createIoType()
Create a new iotype*.
Definition: service.c:286
elements::supported
struct iotype * supported
the supported iotype
Definition: service.h:767
WrongInputData
@ WrongInputData
Definition: service.h:846
registry::name
char * name
the name
Definition: service.h:796
OAPIPCorrespondances
static const int OAPIPCorrespondances[9][2]
WPS exception codes to OGC API - Processes ones.
Definition: service.h:897
_dumpMap
ZOO_DLL_EXPORT void _dumpMap(map *)
Dump a map on stderr.
Definition: service.c:185
dumpElementsAsYAML
ZOO_DLL_EXPORT void dumpElementsAsYAML(elements *, int)
Dump an elements on stderr using the YAML syntaxe.
Definition: service.c:1433
contains
ZOO_DLL_EXPORT bool contains(map *, map *)
Verify if a map is contained in another map.
Definition: service.c:934
elements::name
char * name
the name
Definition: service.h:761
service::outputs
struct elements * outputs
the outputs elements
Definition: service.h:781
createMap
ZOO_DLL_EXPORT map * createMap(const char *, const char *)
Create a new map.
Definition: service.c:300
allocateMapValue
ZOO_DLL_EXPORT char * allocateMapValue(map *node, size_t num_bytes)
Definition: service.c:2178
map
struct map map
KVP linked list.
countMapName
ZOO_DLL_EXPORT int countMapName(map *, const char *)
Count number of a specific map in a map.
Definition: service.c:361
hasElement
ZOO_DLL_EXPORT bool hasElement(elements *, const char *)
Verify if an elements contains a name equal to the given key.
Definition: service.c:565
WPSExceptionText
static const char *const WPSExceptionText[]
WPS exception text (associated with the exception code)
Definition: service.h:953
addMapToMap
ZOO_DLL_EXPORT void addMapToMap(map **, map *)
Add a map at the end of another map.
Definition: service.c:862
registry::content
struct services * content
the content services pointer
Definition: service.h:797
iotype
struct iotype iotype
Not named linked list.
addIntToMapArray
ZOO_DLL_EXPORT void addIntToMapArray(map *, const char *, int, const unsigned long)
Add a key and an integer value to an existing map array.
Definition: service.c:1212
DataNotAccessible
@ DataNotAccessible
Definition: service.h:841
getServiceFromRegistry
ZOO_DLL_EXPORT service * getServiceFromRegistry(registry *, char *, char *)
Access a service in the registry.
Definition: service.c:1800
countMapNameValue
ZOO_DLL_EXPORT int countMapNameValue(map *, const char *)
Count number of a specific map value in a map.
Definition: service.c:378
dumpService
ZOO_DLL_EXPORT void dumpService(service *)
Dump a service on stderr.
Definition: service.c:1614
maps::next
struct maps * next
the pointer to the next maps if any or NULL
Definition: service.h:742
nonempty
ZOO_DLL_EXPORT bool nonempty(map *map)
Verify that a map has a value.
Definition: service.c:2000
freeRegistry
ZOO_DLL_EXPORT void freeRegistry(registry **)
Free memory allocated for the registry.
Definition: service.c:1774
MissingParameterValue
@ MissingParameterValue
Definition: service.h:826
dumpMaps
ZOO_DLL_EXPORT void dumpMaps(maps *m)
Dump a maps on stderr, see dumpMap().
Definition: service.c:227
zMkdir
static int zMkdir(const char *pccPath)
The crossplatform mkdir alias.
Definition: service.h:108
InvalidParameterValue
@ InvalidParameterValue
Definition: service.h:827
getValueFromMaps
ZOO_DLL_EXPORT char * getValueFromMaps(maps *, const char *)
Definition: service.c:2201
maps
linked list of map pointer
Definition: service.h:738
pccLogLevel
static const char * pccLogLevel[8]
The global log level names.
Definition: service.h:261
addToMap
ZOO_DLL_EXPORT void addToMap(map *, const char *, const char *)
Add key value pair to an existing map.
Definition: service.c:705
createMaps
ZOO_DLL_EXPORT maps * createMaps(const char *)
Create a new maps with the given name.
Definition: service.c:314
WPSException
WPSException
Definition: service.h:817
SizeExceeded
@ SizeExceeded
Definition: service.h:842
setErrorMessage
void setErrorMessage(maps *&pmsaConf, const char *pccService, WPSException weExc, const char *pccMessage)
Definition: service.c:2030
getElements
ZOO_DLL_EXPORT elements * getElements(elements *, const char *)
Access a specific elements named key.
Definition: service.c:582
service::inputs
struct elements * inputs
the inputs elements
Definition: service.h:780
createService
ZOO_DLL_EXPORT service * createService()
Allocate memory for a service.
Definition: service.c:658
mapsToCharXXX
ZOO_DLL_EXPORT void mapsToCharXXX(maps *, char ***)
Convert a maps to a char*** (only used for Fortran support)
Definition: service.c:1934
iotype::content
struct map * content
the content map
Definition: service.h:751
services
Services chained list.
Definition: service.h:787
updateCnt
ZOO_DLL_EXPORT void updateCnt(maps *, const char *, const char *)
Update the counter value (in conf / lenv / serviceCnt.
Definition: service.c:2282
zooDebugPrint
ZOO_DLL_EXPORT int ZOO_DLL_EXPORT int zooDebugPrint(const char *format,...)
countMaps
ZOO_DLL_EXPORT int countMaps(maps *)
Count number of maps in a maps.
Definition: service.c:345
WPSExceptionCode
static const char *const WPSExceptionCode[]
Standard WPS exception codes.
Definition: service.h:856
map
KVP linked list.
Definition: service.h:717
map::name
char * name
the key
Definition: service.h:718
getMaps
ZOO_DLL_EXPORT maps * getMaps(maps *, const char *)
Access a specific maps.
Definition: service.c:442
maps::content
struct map * content
the content map
Definition: service.h:740
addMapsArrayToMaps
ZOO_DLL_EXPORT int addMapsArrayToMaps(maps **, maps *, char *)
Add a Maps containing a MapArray to a Maps.
Definition: service.c:1248
loadMapBinary
ZOO_DLL_EXPORT void loadMapBinary(map **, map *, int)
Load binary values from a map (in) and add them to another map (out)
Definition: service.c:996
dumpRegistry
ZOO_DLL_EXPORT void dumpRegistry(registry *)
Print the registry on stderr.
Definition: service.c:1696
createElements
ZOO_DLL_EXPORT elements * createElements(const char *)
Create a named elements.
Definition: service.c:1353
elements::additional_parameters
struct map * additional_parameters
the additional parameters map
Definition: service.h:764
getIoTypeFromElement
ZOO_DLL_EXPORT iotype * getIoTypeFromElement(elements *, char *, map *)
Access a specific iotype from an elements.
Definition: service.c:960
iotype::next
struct iotype * next
the pointer to the next iotype if any or NULL
Definition: service.h:752
charxxxToMaps
ZOO_DLL_EXPORT void charxxxToMaps(char ***, maps **)
Convert a char*** to a maps (only used for Fortran support)
Definition: service.c:1970
service
struct service service
Metadata information about a full Service.
dumpServiceAsYAML
ZOO_DLL_EXPORT void dumpServiceAsYAML(service *)
Dump a service on stderr using the YAML syntaxe.
Definition: service.c:1644
registry::next
struct registry * next
the next registry pointer
Definition: service.h:798
map::next
struct map * next
the pointer to the next map if any or NULL
Definition: service.h:720
elements::format
char * format
the format: LiteralData or ComplexData or BoundingBoxData
Definition: service.h:765
isValidUuid
ZOO_DLL_EXPORT int isValidUuid(const char *)
Verify if a string is a valid UUID in the standard format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 c...
Definition: service.c:45
addIntToMap
ZOO_DLL_EXPORT void addIntToMap(map *, const char *, const int)
Add a key and an integer value to an existing map.
Definition: service.c:803
dumpElements
ZOO_DLL_EXPORT void dumpElements(elements *)
Dump an elements on stderr.
Definition: service.c:1391
ZOO_DLL_EXPORT
#define ZOO_DLL_EXPORT
Definition: service.h:34
maps::child
struct maps * child
the child maps
Definition: service.h:741
elements::child
struct elements * child
the pointer to the children element if any (or NULL)
Definition: service.h:768
elements
struct elements elements
Metadata information about input or output.
OAPIPSupportedContentTypes
static const char *const OAPIPSupportedContentTypes[]
OGC API - Processes supported Content-Type list.
Definition: service.h:941
iZooLogLevel
int iZooLogLevel
The log level is used to define the severity of messages that will be logged.
Definition: service.c:34
dupElements
ZOO_DLL_EXPORT elements * dupElements(elements *)
Duplicate an elements.
Definition: service.c:1517
_translateChar
ZOO_DLL_EXPORT void _translateChar(char *, char, char)
Replace a char by another one in a string.
Definition: service.c:2237
count
ZOO_DLL_EXPORT int count(map *)
Count number of map in a map.
Definition: service.c:329
zSleep
static int zSleep(const long millisecond)
The crossplatform sleep alias.
Definition: service.h:139
NoSuchJob
@ NoSuchJob
Definition: service.h:848
elements::metadata
struct map * metadata
the metadata map
Definition: service.h:763
freeElements
ZOO_DLL_EXPORT void freeElements(elements **)
Free allocated memory of an elements.
Definition: service.c:616
setMapInMaps
ZOO_DLL_EXPORT void setMapInMaps(maps *, const char *, const char *, const char *)
Set a key value pair to a map contained in a Maps.
Definition: service.c:1304
maps::name
char * name
the maps name
Definition: service.h:739
StatusOK
@ StatusOK
Definition: service.h:822
registry
Profile registry.
Definition: service.h:795
service::metadata
struct map * metadata
the metadata map
Definition: service.h:778
service::content
struct map * content
the content map
Definition: service.h:777
loadMapBinaries
ZOO_DLL_EXPORT void loadMapBinaries(map **, map *)
Load binary values from a map (in) and add them to another map (out).
Definition: service.c:1035
getMapOrFill
ZOO_DLL_EXPORT map * getMapOrFill(map **, const char *, const char *)
Access a specific map or set its value.
Definition: service.c:911
service::name
char * name
the name
Definition: service.h:776
freeService
ZOO_DLL_EXPORT void freeService(service **)
Free allocated memory of a service.
Definition: service.c:675
InternalServerError
@ InternalServerError
Definition: service.h:847
iMinZooLogLevel
int iMinZooLogLevel
The minimal global log level is used to filter messages based on their severity.
Definition: service.c:35
addToMapWithSize
ZOO_DLL_EXPORT map * addToMapWithSize(map *, const char *, const char *, int)
Add a key and a binary value to an existing map.
Definition: service.c:830
NoApplicableCode
@ NoApplicableCode
Definition: service.h:828
setElementsName
ZOO_DLL_EXPORT void setElementsName(elements **, char *)
Set the name of an elements.
Definition: service.c:1374
elements::defaults
struct iotype * defaults
the default iotype
Definition: service.h:766
inheritMap
ZOO_DLL_EXPORT void inheritMap(map **, map *)
Apply inheritance to an out map from a reference in map.
Definition: service.c:1823
_ZOO_LOG_MSG
ZOO_DLL_EXPORT int _ZOO_LOG_MSG(int, const char *, const char *, int, const char *,...) __attribute__((format(printf
setMapArray
ZOO_DLL_EXPORT void setMapArray(map *, const char *, int, const char *)
Add a key value in a MapArray for a specific index.
Definition: service.c:1172
dupService
ZOO_DLL_EXPORT service * dupService(service *)
Duplicate a service.
Definition: service.c:1677
inheritance
ZOO_DLL_EXPORT void inheritance(registry *, service **)
Apply inheritance to a service based on a registry.
Definition: service.c:1898
addToMapA
ZOO_DLL_EXPORT void addToMapA(map *, const char *, const char *)
Add key value pair to an existing map or append the value.
Definition: service.c:731
hasvalue
ZOO_DLL_EXPORT bool hasvalue(maps *source, const char *node, const char *key, map **kvp)
Verify that a particular map value exists in a maps data structure, and obtain that value.
Definition: service.c:2016
zGettimeofday
#define zGettimeofday
The crossplatform gettimeofday alias.
Definition: service.h:145