Warning: Can't use blame annotator:
svn blame failed on trunk/zoo-project/zoo-kernel/zoo_service_loader.c: 200029 - Couldn't perform atomic initialization

source: trunk/zoo-project/zoo-kernel/zoo_service_loader.c @ 553

Last change on this file since 553 was 550, checked in by djay, 10 years ago

Add otb2zcfg and OTB applications support without observer by now. Fix issue with maxOccurs and multiple downloaded value for the same input.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 124.3 KB
RevLine 
1/**
2 * Author : Gérald FENOY
3 *
4 *  Copyright 2008-2013 GeoLabs SARL. All rights reserved.
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
26
27extern "C" int yylex ();
28extern "C" int crlex ();
29
30#ifdef USE_OTB
31#include "service_internal_otb.h"
32#else
33#define length(x) (sizeof(x) / sizeof(x[0]))
34#endif
35
36#include "cgic.h"
37
38extern "C"
39{
40#include <libxml/tree.h>
41#include <libxml/xmlmemory.h>
42#include <libxml/parser.h>
43#include <libxml/xpath.h>
44#include <libxml/xpathInternals.h>
45}
46
47#include "ulinet.h"
48
49#include <libintl.h>
50#include <locale.h>
51#include <string.h>
52
53#include "service.h"
54
55#include "service_internal.h"
56
57#ifdef USE_PYTHON
58#include "service_internal_python.h"
59#endif
60
61#ifdef USE_JAVA
62#include "service_internal_java.h"
63#endif
64
65#ifdef USE_PHP
66#include "service_internal_php.h"
67#endif
68
69#ifdef USE_JS
70#include "service_internal_js.h"
71#endif
72
73#ifdef USE_RUBY
74#include "service_internal_ruby.h"
75#endif
76
77#ifdef USE_PERL
78#include "service_internal_perl.h"
79#endif
80
81#include <dirent.h>
82#include <signal.h>
83#include <unistd.h>
84#ifndef WIN32
85#include <dlfcn.h>
86#include <libgen.h>
87#else
88#include <windows.h>
89#include <direct.h>
90#include <sys/types.h>
91#include <sys/stat.h>
92#include <unistd.h>
93#define pid_t int;
94#endif
95#include <fcntl.h>
96#include <time.h>
97#include <stdarg.h>
98
99#ifdef WIN32
100extern "C"
101{
102  __declspec (dllexport) char *strcasestr (char const *a, char const *b)
103#ifndef USE_MS
104  {
105    char *x = zStrdup (a);
106    char *y = zStrdup (b);
107
108      x = _strlwr (x);
109      y = _strlwr (y);
110    char *pos = strstr (x, y);
111    char *ret = pos == NULL ? NULL : (char *) (a + (pos - x));
112      free (x);
113      free (y);
114      return ret;
115  };
116#else
117   ;
118#endif
119}
120#endif
121
122#define _(String) dgettext ("zoo-kernel",String)
123#define __(String) dgettext ("zoo-service",String)
124
125extern int getServiceFromFile (maps *, const char *, service **);
126
127int
128readServiceFile (maps * conf, char *file, service ** service, char *name)
129{
130  int t = getServiceFromFile (conf, file, service);
131#ifdef YAML
132  if (t < 0)
133    {
134      t = getServiceFromYAML (conf, file, service, name);
135    }
136#endif
137  return t;
138}
139
140void
141translateChar (char *str, char toReplace, char toReplaceBy)
142{
143  int i = 0, len = strlen (str);
144  for (i = 0; i < len; i++)
145    {
146      if (str[i] == toReplace)
147        str[i] = toReplaceBy;
148    }
149}
150
151/**
152 * Create (or append to) an array valued maps
153 * value = "["",""]"
154 */
155int
156appendMapsToMaps (maps * m, maps * mo, maps * mi, elements * elem)
157{
158  maps *tmpMaps = getMaps (mo, mi->name);
159  map *tmap = getMapType (tmpMaps->content);
160  elements *el = getElements (elem, mi->name);
161  int hasEl = 1;
162  if (el == NULL)
163    hasEl = -1;
164  if (tmap == NULL)
165    {
166      if (hasEl > 0)
167        tmap = getMapType (el->defaults->content);
168    }
169
170  map *testMap = NULL;
171  if (hasEl > 0)
172    {
173      testMap = getMap (el->content, "maxOccurs");
174    }
175  else
176    {
177      testMap = createMap ("maxOccurs", "unbounded");
178    }
179
180  if (testMap != NULL)
181    {
182      if (strncasecmp (testMap->value, "unbounded", 9) != 0
183          && atoi (testMap->value) > 1)
184        {
185          addMapsArrayToMaps (&mo, mi, tmap->name);
186          map* nb=getMapFromMaps(mo,mi->name,"length");
187          if (nb!=NULL && atoi(nb->value)>atoi(testMap->value))
188            {
189              char emsg[1024];
190              sprintf (emsg,
191                       _("You set maximum occurences for <%s> as %i but you tried to use it more than the limit you set. Please correct your ZCFG file or your request."),
192                       mi->name, atoi (testMap->value));
193              errorException (m, emsg, "InternalError", NULL);
194              return -1;
195            }
196        }
197      else
198        {
199          if (strncasecmp (testMap->value, "unbounded", 9) == 0)
200            {
201              if (hasEl < 0)
202                {
203                  freeMap (&testMap);
204                  free (testMap);
205                }
206              if (addMapsArrayToMaps (&mo, mi, tmap->name) < 0)
207                {
208                  char emsg[1024];
209                  map *tmpMap = getMap (mi->content, "length");
210                  sprintf (emsg,
211                           _
212                           ("ZOO-Kernel was unable to load your data for %s position %s."),
213                           mi->name, tmpMap->value);
214                  errorException (m, emsg, "InternalError", NULL);
215                  return -1;
216                }
217            }
218          else
219            {
220              char emsg[1024];
221              sprintf (emsg,
222                       _
223                       ("You set maximum occurences for <%s> to one but you tried to use it more than once. Please correct your ZCFG file or your request."),
224                       mi->name);
225              errorException (m, emsg, "InternalError", NULL);
226              return -1;
227            }
228        }
229    }
230  return 0;
231}
232
233int
234recursReaddirF (maps * m, xmlNodePtr n, char *conf_dir, char *prefix,
235                int saved_stdout, int level, void (func) (maps *, xmlNodePtr,
236                                                          service *))
237{
238  struct dirent *dp;
239  int scount = 0;
240
241  if (conf_dir == NULL)
242    return 1;
243  DIR *dirp = opendir (conf_dir);
244  if (dirp == NULL)
245    {
246      if (level > 0)
247        return 1;
248      else
249        return -1;
250    }
251  char tmp1[25];
252  sprintf (tmp1, "sprefix_%d", level);
253  char levels[17];
254  sprintf (levels, "%d", level);
255  setMapInMaps (m, "lenv", "level", levels);
256  while ((dp = readdir (dirp)) != NULL)
257    if ((dp->d_type == DT_DIR || dp->d_type == DT_LNK) && dp->d_name[0] != '.'
258        && strstr (dp->d_name, ".") == NULL)
259      {
260
261        char *tmp =
262          (char *) malloc ((strlen (conf_dir) + strlen (dp->d_name) + 2) *
263                           sizeof (char));
264        sprintf (tmp, "%s/%s", conf_dir, dp->d_name);
265
266        if (prefix != NULL)
267          {
268            prefix = NULL;
269          }
270        prefix = (char *) malloc ((strlen (dp->d_name) + 2) * sizeof (char));
271        sprintf (prefix, "%s.", dp->d_name);
272
273        //map* tmpMap=getMapFromMaps(m,"lenv",tmp1);
274
275        int res;
276        if (prefix != NULL)
277          {
278            setMapInMaps (m, "lenv", tmp1, prefix);
279            char levels1[17];
280            sprintf (levels1, "%d", level + 1);
281            setMapInMaps (m, "lenv", "level", levels1);
282            res =
283              recursReaddirF (m, n, tmp, prefix, saved_stdout, level + 1,
284                              func);
285            sprintf (levels1, "%d", level);
286            setMapInMaps (m, "lenv", "level", levels1);
287            free (prefix);
288            prefix = NULL;
289          }
290        else
291          res = -1;
292        free (tmp);
293        if (res < 0)
294          {
295            return res;
296          }
297      }
298    else
299      {
300        if (dp->d_name[0] != '.' && strstr (dp->d_name, ".zcfg") != 0)
301          {
302            int t;
303            char tmps1[1024];
304            memset (tmps1, 0, 1024);
305            snprintf (tmps1, 1024, "%s/%s", conf_dir, dp->d_name);
306            service *s1 = (service *) malloc (SERVICE_SIZE);
307            if (s1 == NULL)
308              {
309                dup2 (saved_stdout, fileno (stdout));
310                errorException (m, _("Unable to allocate memory."),
311                                "InternalError", NULL);
312                return -1;
313              }
314#ifdef DEBUG
315            fprintf (stderr, "#################\n%s\n#################\n",
316                     tmps1);
317#endif
318            char *tmpsn = zStrdup (dp->d_name);
319            tmpsn[strlen (tmpsn) - 5] = 0;
320            t = readServiceFile (m, tmps1, &s1, tmpsn);
321            free (tmpsn);
322            if (t < 0)
323              {
324                map *tmp00 = getMapFromMaps (m, "lenv", "message");
325                char tmp01[1024];
326                if (tmp00 != NULL)
327                  sprintf (tmp01, _("Unable to parse the ZCFG file: %s (%s)"),
328                           dp->d_name, tmp00->value);
329                else
330                  sprintf (tmp01, _("Unable to parse the ZCFG file: %s."),
331                           dp->d_name);
332                dup2 (saved_stdout, fileno (stdout));
333                errorException (m, tmp01, "InternalError", NULL);
334                return -1;
335              }
336#ifdef DEBUG
337            dumpService (s1);
338            fflush (stdout);
339            fflush (stderr);
340#endif
341            func (m, n, s1);
342            freeService (&s1);
343            free (s1);
344            scount++;
345          }
346      }
347  (void) closedir (dirp);
348  return 1;
349}
350
351xmlXPathObjectPtr
352extractFromDoc (xmlDocPtr doc, const char *search)
353{
354  xmlXPathContextPtr xpathCtx;
355  xmlXPathObjectPtr xpathObj;
356  xpathCtx = xmlXPathNewContext (doc);
357  xpathObj = xmlXPathEvalExpression (BAD_CAST search, xpathCtx);
358  xmlXPathFreeContext (xpathCtx);
359  return xpathObj;
360}
361
362void
363donothing (int sig)
364{
365#ifdef DEBUG
366  fprintf (stderr, "Signal %d after the ZOO-Kernel returned result !\n", sig);
367#endif
368  exit (0);
369}
370
371void
372sig_handler (int sig)
373{
374  char tmp[100];
375  const char *ssig;
376  switch (sig)
377    {
378    case SIGSEGV:
379      ssig = "SIGSEGV";
380      break;
381    case SIGTERM:
382      ssig = "SIGTERM";
383      break;
384    case SIGINT:
385      ssig = "SIGINT";
386      break;
387    case SIGILL:
388      ssig = "SIGILL";
389      break;
390    case SIGFPE:
391      ssig = "SIGFPE";
392      break;
393    case SIGABRT:
394      ssig = "SIGABRT";
395      break;
396    default:
397      ssig = "UNKNOWN";
398      break;
399    }
400  sprintf (tmp,
401           _
402           ("ZOO Kernel failed to process your request receiving signal %d = %s"),
403           sig, ssig);
404  errorException (NULL, tmp, "InternalError", NULL);
405#ifdef DEBUG
406  fprintf (stderr, "Not this time!\n");
407#endif
408  exit (0);
409}
410
411void
412loadServiceAndRun (maps ** myMap, service * s1, map * request_inputs,
413                   maps ** inputs, maps ** ioutputs, int *eres)
414{
415  char tmps1[1024];
416  char ntmp[1024];
417  maps *m = *myMap;
418  maps *request_output_real_format = *ioutputs;
419  maps *request_input_real_format = *inputs;
420  /**
421   * Extract serviceType to know what kind of service should be loaded
422   */
423  map *r_inputs = NULL;
424#ifndef WIN32
425  getcwd (ntmp, 1024);
426#else
427  _getcwd (ntmp, 1024);
428#endif
429  r_inputs = getMap (s1->content, "serviceType");
430#ifdef DEBUG
431  fprintf (stderr, "LOAD A %s SERVICE PROVIDER \n", r_inputs->value);
432  fflush (stderr);
433#endif
434  if (strlen (r_inputs->value) == 1
435      && strncasecmp (r_inputs->value, "C", 1) == 0)
436    {
437      r_inputs = getMap (request_inputs, "metapath");
438      if (r_inputs != NULL)
439        sprintf (tmps1, "%s/%s", ntmp, r_inputs->value);
440      else
441        sprintf (tmps1, "%s/", ntmp);
442      char *altPath = zStrdup (tmps1);
443      r_inputs = getMap (s1->content, "ServiceProvider");
444      sprintf (tmps1, "%s/%s", altPath, r_inputs->value);
445      free (altPath);
446#ifdef DEBUG
447      fprintf (stderr, "Trying to load %s\n", tmps1);
448#endif
449#ifdef WIN32
450      HINSTANCE so =
451        LoadLibraryEx (tmps1, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
452#else
453      void *so = dlopen (tmps1, RTLD_LAZY);
454#endif
455#ifdef WIN32
456      DWORD errstr;
457      errstr = GetLastError ();
458#else
459      char *errstr;
460      errstr = dlerror ();
461#endif
462#ifdef DEBUG
463      fprintf (stderr, "%s loaded (%d) \n", tmps1, errstr);
464#endif
465      if (so != NULL)
466        {
467#ifdef DEBUG
468          fprintf (stderr, "Library loaded %s \n", errstr);
469          fprintf (stderr, "Service Shared Object = %s\n", r_inputs->value);
470#endif
471          r_inputs = getMap (s1->content, "serviceType");
472#ifdef DEBUG
473          dumpMap (r_inputs);
474          fprintf (stderr, "%s\n", r_inputs->value);
475          fflush (stderr);
476#endif
477          if (strncasecmp (r_inputs->value, "C-FORTRAN", 9) == 0)
478            {
479              r_inputs = getMap (request_inputs, "Identifier");
480              char fname[1024];
481              sprintf (fname, "%s_", r_inputs->value);
482#ifdef DEBUG
483              fprintf (stderr, "Try to load function %s\n", fname);
484#endif
485#ifdef WIN32
486              typedef int (CALLBACK * execute_t) (char ***, char ***,
487                                                  char ***);
488              execute_t execute = (execute_t) GetProcAddress (so, fname);
489#else
490              typedef int (*execute_t) (char ***, char ***, char ***);
491              execute_t execute = (execute_t) dlsym (so, fname);
492#endif
493#ifdef DEBUG
494#ifdef WIN32
495              errstr = GetLastError ();
496#else
497              errstr = dlerror ();
498#endif
499              fprintf (stderr, "Function loaded %s\n", errstr);
500#endif
501
502              char main_conf[10][30][1024];
503              char inputs[10][30][1024];
504              char outputs[10][30][1024];
505              for (int i = 0; i < 10; i++)
506                {
507                  for (int j = 0; j < 30; j++)
508                    {
509                      memset (main_conf[i][j], 0, 1024);
510                      memset (inputs[i][j], 0, 1024);
511                      memset (outputs[i][j], 0, 1024);
512                    }
513                }
514              mapsToCharXXX (m, (char ***) main_conf);
515              mapsToCharXXX (request_input_real_format, (char ***) inputs);
516              mapsToCharXXX (request_output_real_format, (char ***) outputs);
517              *eres =
518                execute ((char ***) &main_conf[0], (char ***) &inputs[0],
519                         (char ***) &outputs[0]);
520#ifdef DEBUG
521              fprintf (stderr, "Function run successfully \n");
522#endif
523              charxxxToMaps ((char ***) &outputs[0],
524                             &request_output_real_format);
525            }
526          else
527            {
528#ifdef DEBUG
529#ifdef WIN32
530              errstr = GetLastError ();
531              fprintf (stderr, "Function %s failed to load because of %d\n",
532                       r_inputs->value, errstr);
533#endif
534#endif
535              r_inputs = getMapFromMaps (m, "lenv", "Identifier");
536#ifdef DEBUG
537              fprintf (stderr, "Try to load function %s\n", r_inputs->value);
538#endif
539              typedef int (*execute_t) (maps **, maps **, maps **);
540#ifdef WIN32
541              execute_t execute =
542                (execute_t) GetProcAddress (so, r_inputs->value);
543#else
544              execute_t execute = (execute_t) dlsym (so, r_inputs->value);
545#endif
546
547              if (execute == NULL)
548                {
549#ifdef WIN32
550                  errstr = GetLastError ();
551#else
552                  errstr = dlerror ();
553#endif
554                  char *tmpMsg =
555                    (char *) malloc (2048 + strlen (r_inputs->value));
556                  sprintf (tmpMsg,
557                           _
558                           ("Error occured while running the %s function: %s"),
559                           r_inputs->value, errstr);
560                  errorException (m, tmpMsg, "InternalError", NULL);
561                  free (tmpMsg);
562#ifdef DEBUG
563                  fprintf (stderr, "Function %s error %s\n", r_inputs->value,
564                           errstr);
565#endif
566                  *eres = -1;
567                  return;
568                }
569
570#ifdef DEBUG
571#ifdef WIN32
572              errstr = GetLastError ();
573#else
574              errstr = dlerror ();
575#endif
576              fprintf (stderr, "Function loaded %s\n", errstr);
577#endif
578
579#ifdef DEBUG
580              fprintf (stderr, "Now run the function \n");
581              fflush (stderr);
582#endif
583              *eres =
584                execute (&m, &request_input_real_format,
585                         &request_output_real_format);
586#ifdef DEBUG
587              fprintf (stderr, "Function loaded and returned %d\n", eres);
588              fflush (stderr);
589#endif
590            }
591#ifdef WIN32
592          *ioutputs = dupMaps (&request_output_real_format);
593          FreeLibrary (so);
594#else
595          dlclose (so);
596#endif
597        }
598      else
599        {
600      /**
601       * Unable to load the specified shared library
602       */
603          char tmps[1024];
604#ifdef WIN32
605          DWORD errstr = GetLastError ();
606#else
607          char *errstr = dlerror ();
608#endif
609          sprintf (tmps, _("C Library can't be loaded %s"), errstr);
610          map *tmps1 = createMap ("text", tmps);
611          printExceptionReportResponse (m, tmps1);
612          *eres = -1;
613          freeMap (&tmps1);
614          free (tmps1);
615        }
616    }
617  else
618
619#ifdef USE_OTB
620  if (strncasecmp (r_inputs->value, "OTB", 6) == 0)
621    {
622      *eres =
623        zoo_otb_support (&m, request_inputs, s1,
624                            &request_input_real_format,
625                            &request_output_real_format);
626    }
627  else
628#endif
629
630#ifdef USE_PYTHON
631  if (strncasecmp (r_inputs->value, "PYTHON", 6) == 0)
632    {
633      *eres =
634        zoo_python_support (&m, request_inputs, s1,
635                            &request_input_real_format,
636                            &request_output_real_format);
637    }
638  else
639#endif
640
641#ifdef USE_JAVA
642  if (strncasecmp (r_inputs->value, "JAVA", 4) == 0)
643    {
644      *eres =
645        zoo_java_support (&m, request_inputs, s1, &request_input_real_format,
646                          &request_output_real_format);
647    }
648  else
649#endif
650
651#ifdef USE_PHP
652  if (strncasecmp (r_inputs->value, "PHP", 3) == 0)
653    {
654      *eres =
655        zoo_php_support (&m, request_inputs, s1, &request_input_real_format,
656                         &request_output_real_format);
657    }
658  else
659#endif
660
661
662#ifdef USE_PERL
663  if (strncasecmp (r_inputs->value, "PERL", 4) == 0)
664    {
665      *eres =
666        zoo_perl_support (&m, request_inputs, s1, &request_input_real_format,
667                          &request_output_real_format);
668    }
669  else
670#endif
671
672#ifdef USE_JS
673  if (strncasecmp (r_inputs->value, "JS", 2) == 0)
674    {
675      *eres =
676        zoo_js_support (&m, request_inputs, s1, &request_input_real_format,
677                        &request_output_real_format);
678    }
679  else
680#endif
681
682#ifdef USE_RUBY
683  if (strncasecmp (r_inputs->value, "Ruby", 4) == 0)
684    {
685      *eres =
686        zoo_ruby_support (&m, request_inputs, s1, &request_input_real_format,
687                          &request_output_real_format);
688    }
689  else
690#endif
691
692    {
693      char tmpv[1024];
694      sprintf (tmpv,
695               _
696               ("Programming Language (%s) set in ZCFG file is not currently supported by ZOO Kernel.\n"),
697               r_inputs->value);
698      map *tmps = createMap ("text", tmpv);
699      printExceptionReportResponse (m, tmps);
700      *eres = -1;
701    }
702  *myMap = m;
703  *ioutputs = request_output_real_format;
704}
705
706
707#ifdef WIN32
708/**
709 * createProcess function: create a new process after setting some env variables
710 */
711void
712createProcess (maps * m, map * request_inputs, service * s1, char *opts,
713               int cpid, maps * inputs, maps * outputs)
714{
715  STARTUPINFO si;
716  PROCESS_INFORMATION pi;
717  ZeroMemory (&si, sizeof (si));
718  si.cb = sizeof (si);
719  ZeroMemory (&pi, sizeof (pi));
720  char *tmp = (char *) malloc ((1024 + cgiContentLength) * sizeof (char));
721  char *tmpq = (char *) malloc ((1024 + cgiContentLength) * sizeof (char));
722  map *req = getMap (request_inputs, "request");
723  map *id = getMap (request_inputs, "identifier");
724  map *di = getMap (request_inputs, "DataInputs");
725
726  char *dataInputsKVP = getMapsAsKVP (inputs, cgiContentLength, 0);
727  char *dataOutputsKVP = getMapsAsKVP (outputs, cgiContentLength, 1);
728#ifdef DEBUG
729  fprintf (stderr, "DATAINPUTSKVP %s\n", dataInputsKVP);
730  fprintf (stderr, "DATAOUTPUTSKVP %s\n", dataOutputsKVP);
731#endif
732  map *sid = getMapFromMaps (m, "lenv", "sid");
733  map *r_inputs = getMapFromMaps (m, "main", "tmpPath");
734  map *r_inputs1 = getMap (request_inputs, "metapath");
735  int hasIn = -1;
736  if (r_inputs1 == NULL)
737    {
738      r_inputs1 = createMap ("metapath", "");
739      hasIn = 1;
740    }
741  map *r_inputs2 = getMap (request_inputs, "ResponseDocument");
742  if (r_inputs2 == NULL)
743    r_inputs2 = getMap (request_inputs, "RawDataOutput");
744  map *tmpPath = getMapFromMaps (m, "lenv", "cwd");
745
746  map *tmpReq = getMap (request_inputs, "xrequest");
747  if (r_inputs2 != NULL)
748    {
749      sprintf (tmp,
750               "\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s&cgiSid=%s\"",
751               r_inputs1->value, req->value, id->value, dataInputsKVP,
752               r_inputs2->name, dataOutputsKVP, sid->value);
753      sprintf (tmpq,
754               "metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s",
755               r_inputs1->value, req->value, id->value, dataInputsKVP,
756               r_inputs2->name, dataOutputsKVP);
757    }
758  else
759    {
760      sprintf (tmp,
761               "\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&cgiSid=%s\"",
762               r_inputs1->value, req->value, id->value, dataInputsKVP,
763               sid->value);
764      sprintf (tmpq,
765               "metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s",
766               r_inputs1->value, req->value, id->value, dataInputsKVP,
767               sid->value);
768    }
769
770  if (hasIn > 0)
771    {
772      freeMap (&r_inputs1);
773      free (r_inputs1);
774    }
775  char *tmp1 = zStrdup (tmp);
776  sprintf (tmp, "\"zoo_loader.cgi\" %s \"%s\"", tmp1, sid->value);
777
778  free (dataInputsKVP);
779  free (dataOutputsKVP);
780#ifdef DEBUG
781  fprintf (stderr, "REQUEST IS : %s \n", tmp);
782#endif
783  SetEnvironmentVariable ("CGISID", TEXT (sid->value));
784  SetEnvironmentVariable ("QUERY_STRING", TEXT (tmpq));
785  char clen[1000];
786  sprintf (clen, "%d", strlen (tmpq));
787  SetEnvironmentVariable ("CONTENT_LENGTH", TEXT (clen));
788
789  if (!CreateProcess (NULL,     // No module name (use command line)
790                      TEXT (tmp),       // Command line
791                      NULL,     // Process handle not inheritable
792                      NULL,     // Thread handle not inheritable
793                      FALSE,    // Set handle inheritance to FALSE
794                      CREATE_NO_WINDOW, // Apache won't wait until the end
795                      NULL,     // Use parent's environment block
796                      NULL,     // Use parent's starting directory
797                      &si,      // Pointer to STARTUPINFO struct
798                      &pi)      // Pointer to PROCESS_INFORMATION struct
799    )
800    {
801#ifdef DEBUG
802      fprintf (stderr, "CreateProcess failed (%d).\n", GetLastError ());
803#endif
804      return;
805    }
806  else
807    {
808#ifdef DEBUG
809      fprintf (stderr, "CreateProcess successfull (%d).\n\n\n\n",
810               GetLastError ());
811#endif
812    }
813  CloseHandle (pi.hProcess);
814  CloseHandle (pi.hThread);
815#ifdef DEBUG
816  fprintf (stderr, "CreateProcess finished !\n");
817#endif
818}
819#endif
820
821int
822runRequest (map ** inputs)
823{
824
825#ifndef USE_GDB
826  signal (SIGCHLD, SIG_IGN);
827  signal (SIGSEGV, sig_handler);
828  signal (SIGTERM, sig_handler);
829  signal (SIGINT, sig_handler);
830  signal (SIGILL, sig_handler);
831  signal (SIGFPE, sig_handler);
832  signal (SIGABRT, sig_handler);
833#endif
834
835  map *r_inputs = NULL;
836  map *request_inputs = *inputs;
837  maps *m = NULL;
838  char *REQUEST = NULL;
839  /**
840   * Parsing service specfic configuration file
841   */
842  m = (maps *) malloc (MAPS_SIZE);
843  if (m == NULL)
844    {
845      return errorException (m, _("Unable to allocate memory."),
846                             "InternalError", NULL);
847    }
848  char ntmp[1024];
849#ifndef WIN32
850  getcwd (ntmp, 1024);
851#else
852  _getcwd (ntmp, 1024);
853#endif
854  r_inputs = getMapOrFill (&request_inputs, "metapath", "");
855
856
857  char conf_file[10240];
858  snprintf (conf_file, 10240, "%s/%s/main.cfg", ntmp, r_inputs->value);
859  if (conf_read (conf_file, m) == 2)
860    {
861      errorException (NULL, _("Unable to load the main.cfg file."),
862                      "InternalError", NULL);
863      free (m);
864      return 1;
865    }
866#ifdef DEBUG
867  fprintf (stderr, "***** BEGIN MAPS\n");
868  dumpMaps (m);
869  fprintf (stderr, "***** END MAPS\n");
870#endif
871
872  map *getPath = getMapFromMaps (m, "main", "gettextPath");
873  if (getPath != NULL)
874    {
875      bindtextdomain ("zoo-kernel", getPath->value);
876      bindtextdomain ("zoo-services", getPath->value);
877    }
878  else
879    {
880      bindtextdomain ("zoo-kernel", "/usr/share/locale/");
881      bindtextdomain ("zoo-services", "/usr/share/locale/");
882    }
883
884
885  /**
886   * Manage our own error log file (usefull to separate standard apache debug
887   * messages from the ZOO-Kernel ones but also for IIS users to avoid wrong
888   * headers messages returned by the CGI due to wrong redirection of stderr)
889   */
890  FILE *fstde = NULL;
891  map *fstdem = getMapFromMaps (m, "main", "logPath");
892  if (fstdem != NULL)
893    fstde = freopen (fstdem->value, "a+", stderr);
894
895  r_inputs = getMap (request_inputs, "language");
896  if (r_inputs == NULL)
897    r_inputs = getMapFromMaps (m, "main", "language");
898  if (r_inputs != NULL)
899    {
900      if (isValidLang (m, r_inputs->value) < 0)
901        {
902          char tmp[1024];
903          sprintf (tmp,
904                   _
905                   ("The value %s is not supported for the <language> parameter"),
906                   r_inputs->value);
907          errorException (m, tmp, "InvalidParameterValue", "language");
908          freeMaps (&m);
909          free (m);
910          free (REQUEST);
911          return 1;
912
913        }
914      char *tmp = zStrdup (r_inputs->value);
915      setMapInMaps (m, "main", "language", tmp);
916#ifdef DEB
917      char tmp2[12];
918      sprintf (tmp2, "%s.utf-8", tmp);
919      translateChar (tmp2, '-', '_');
920      setlocale (LC_ALL, tmp2);
921#else
922      translateChar (tmp, '-', '_');
923      setlocale (LC_ALL, tmp);
924#endif
925#ifndef WIN32
926      setenv ("LC_ALL", tmp, 1);
927#else
928      char tmp1[12];
929      sprintf (tmp1, "LC_ALL=%s", tmp);
930      putenv (tmp1);
931#endif
932      free (tmp);
933    }
934  else
935    {
936      setlocale (LC_ALL, "en_US");
937#ifndef WIN32
938      setenv ("LC_ALL", "en_US", 1);
939#else
940      char tmp1[12];
941      sprintf (tmp1, "LC_ALL=en_US");
942      putenv (tmp1);
943#endif
944      setMapInMaps (m, "main", "language", "en-US");
945    }
946  setlocale (LC_NUMERIC, "en_US");
947  bind_textdomain_codeset ("zoo-kernel", "UTF-8");
948  textdomain ("zoo-kernel");
949  bind_textdomain_codeset ("zoo-services", "UTF-8");
950  textdomain ("zoo-services");
951
952  map *lsoap = getMap (request_inputs, "soap");
953  if (lsoap != NULL && strcasecmp (lsoap->value, "true") == 0)
954    setMapInMaps (m, "main", "isSoap", "true");
955  else
956    setMapInMaps (m, "main", "isSoap", "false");
957
958  if (strlen (cgiServerName) > 0)
959    {
960      char tmpUrl[1024];
961      if (strncmp (cgiServerPort, "80", 2) == 0)
962        {
963          sprintf (tmpUrl, "http://%s%s", cgiServerName, cgiScriptName);
964        }
965      else
966        {
967          sprintf (tmpUrl, "http://%s:%s%s", cgiServerName, cgiServerPort,
968                   cgiScriptName);
969        }
970#ifdef DEBUG
971      fprintf (stderr, "*** %s ***\n", tmpUrl);
972#endif
973      setMapInMaps (m, "main", "serverAddress", tmpUrl);
974    }
975
976  /**
977   * Check for minimum inputs
978   */
979  r_inputs = getMap (request_inputs, "Request");
980  if (request_inputs == NULL || r_inputs == NULL)
981    {
982      errorException (m, _("Parameter <request> was not specified"),
983                      "MissingParameterValue", "request");
984      if (count (request_inputs) == 1)
985        {
986          freeMap (&request_inputs);
987          free (request_inputs);
988        }
989      freeMaps (&m);
990      free (m);
991      return 1;
992    }
993  else
994    {
995      REQUEST = zStrdup (r_inputs->value);
996      if (strncasecmp (r_inputs->value, "GetCapabilities", 15) != 0
997          && strncasecmp (r_inputs->value, "DescribeProcess", 15) != 0
998          && strncasecmp (r_inputs->value, "Execute", 7) != 0)
999        {
1000          errorException (m,
1001                          _
1002                          ("Unenderstood <request> value. Please check that it was set to GetCapabilities, DescribeProcess or Execute."),
1003                          "OperationNotSupported", r_inputs->value);
1004          freeMaps (&m);
1005          free (m);
1006          free (REQUEST);
1007          return 1;
1008        }
1009    }
1010  r_inputs = NULL;
1011  r_inputs = getMap (request_inputs, "Service");
1012  if (r_inputs == NULLMAP)
1013    {
1014      errorException (m, _("Parameter <service> was not specified"),
1015                      "MissingParameterValue", "service");
1016      freeMaps (&m);
1017      free (m);
1018      free (REQUEST);
1019      return 1;
1020    }
1021  else
1022    {
1023      if (strcasecmp (r_inputs->value, "WPS") != 0)
1024        {
1025          errorException (m,
1026                          _
1027                          ("Unenderstood <service> value, WPS is the only acceptable value."),
1028                          "InvalidParameterValue", "service");
1029          freeMaps (&m);
1030          free (m);
1031          free (REQUEST);
1032          return 1;
1033        }
1034    }
1035  if (strncasecmp (REQUEST, "GetCapabilities", 15) != 0)
1036    {
1037      r_inputs = getMap (request_inputs, "Version");
1038      if (r_inputs == NULL)
1039        {
1040          errorException (m, _("Parameter <version> was not specified"),
1041                          "MissingParameterValue", "version");
1042          freeMaps (&m);
1043          free (m);
1044          free (REQUEST);
1045          return 1;
1046        }
1047      else
1048        {
1049          if (strcasecmp (r_inputs->value, "1.0.0") != 0)
1050            {
1051              errorException (m,
1052                              _
1053                              ("Unenderstood <version> value, 1.0.0 is the only acceptable value."),
1054                              "InvalidParameterValue", "service");
1055              freeMaps (&m);
1056              free (m);
1057              free (REQUEST);
1058              return 1;
1059            }
1060        }
1061    }
1062  else
1063    {
1064      r_inputs = getMap (request_inputs, "AcceptVersions");
1065      if (r_inputs != NULL)
1066        {
1067          if (strncmp (r_inputs->value, "1.0.0", 5) != 0)
1068            {
1069              errorException (m,
1070                              _
1071                              ("Unenderstood <AcceptVersions> value, 1.0.0 is the only acceptable value."),
1072                              "VersionNegotiationFailed", NULL);
1073              freeMaps (&m);
1074              free (m);
1075              free (REQUEST);
1076              return 1;
1077            }
1078        }
1079    }
1080
1081  r_inputs = getMap (request_inputs, "serviceprovider");
1082  if (r_inputs == NULL)
1083    {
1084      addToMap (request_inputs, "serviceprovider", "");
1085    }
1086
1087  maps *request_output_real_format = NULL;
1088  map *tmpm = getMapFromMaps (m, "main", "serverAddress");
1089  if (tmpm != NULL)
1090    SERVICE_URL = zStrdup (tmpm->value);
1091  else
1092    SERVICE_URL = zStrdup (DEFAULT_SERVICE_URL);
1093
1094  service *s1;
1095  int scount = 0;
1096#ifdef DEBUG
1097  dumpMap (r_inputs);
1098#endif
1099  char conf_dir[1024];
1100  int t;
1101  char tmps1[1024];
1102
1103  r_inputs = NULL;
1104  r_inputs = getMap (request_inputs, "metapath");
1105  if (r_inputs != NULL)
1106    snprintf (conf_dir, 1024, "%s/%s", ntmp, r_inputs->value);
1107  else
1108    snprintf (conf_dir, 1024, "%s", ntmp);
1109
1110  if (strncasecmp (REQUEST, "GetCapabilities", 15) == 0)
1111    {
1112#ifdef DEBUG
1113      dumpMap (r_inputs);
1114#endif
1115      xmlDocPtr doc = xmlNewDoc (BAD_CAST "1.0");
1116      r_inputs = NULL;
1117      r_inputs = getMap (request_inputs, "ServiceProvider");
1118      xmlNodePtr n;
1119      if (r_inputs != NULL)
1120        n = printGetCapabilitiesHeader (doc, r_inputs->value, m);
1121      else
1122        n = printGetCapabilitiesHeader (doc, "", m);
1123    /**
1124     * Here we need to close stdout to ensure that not supported chars
1125     * has been found in the zcfg and then printed on stdout
1126     */
1127      int saved_stdout = dup (fileno (stdout));
1128      dup2 (fileno (stderr), fileno (stdout));
1129      if (int res =
1130          recursReaddirF (m, n, conf_dir, NULL, saved_stdout, 0,
1131                          printGetCapabilitiesForProcess) < 0)
1132        {
1133          freeMaps (&m);
1134          free (m);
1135          free (REQUEST);
1136          free (SERVICE_URL);
1137          fflush (stdout);
1138          return res;
1139        }
1140      dup2 (saved_stdout, fileno (stdout));
1141      printDocument (m, doc, getpid ());
1142      freeMaps (&m);
1143      free (m);
1144      free (REQUEST);
1145      free (SERVICE_URL);
1146      fflush (stdout);
1147      return 0;
1148    }
1149  else
1150    {
1151      r_inputs = getMap (request_inputs, "Identifier");
1152      if (r_inputs == NULL
1153          || strlen (r_inputs->name) == 0 || strlen (r_inputs->value) == 0)
1154        {
1155          errorException (m, _("Mandatory <identifier> was not specified"),
1156                          "MissingParameterValue", "identifier");
1157          freeMaps (&m);
1158          free (m);
1159          free (REQUEST);
1160          free (SERVICE_URL);
1161          return 0;
1162        }
1163
1164      struct dirent *dp;
1165      DIR *dirp = opendir (conf_dir);
1166      if (dirp == NULL)
1167        {
1168          errorException (m, _("The specified path path doesn't exist."),
1169                          "InvalidParameterValue", conf_dir);
1170          freeMaps (&m);
1171          free (m);
1172          free (REQUEST);
1173          free (SERVICE_URL);
1174          return 0;
1175        }
1176      if (strncasecmp (REQUEST, "DescribeProcess", 15) == 0)
1177        {
1178      /**
1179       * Loop over Identifier list
1180       */
1181          xmlDocPtr doc = xmlNewDoc (BAD_CAST "1.0");
1182          r_inputs = NULL;
1183          r_inputs = getMap (request_inputs, "ServiceProvider");
1184
1185          xmlNodePtr n;
1186          if (r_inputs != NULL)
1187            n = printDescribeProcessHeader (doc, r_inputs->value, m);
1188          else
1189            n = printDescribeProcessHeader (doc, "", m);
1190
1191          r_inputs = getMap (request_inputs, "Identifier");
1192
1193          char *orig = zStrdup (r_inputs->value);
1194
1195          int saved_stdout = dup (fileno (stdout));
1196          dup2 (fileno (stderr), fileno (stdout));
1197          if (strcasecmp ("all", orig) == 0)
1198            {
1199              if (int res =
1200                  recursReaddirF (m, n, conf_dir, NULL, saved_stdout, 0,
1201                                  printDescribeProcessForProcess) < 0)
1202                return res;
1203            }
1204          else
1205            {
1206              char *saveptr;
1207              char *tmps = strtok_r (orig, ",", &saveptr);
1208
1209              char buff[256];
1210              char buff1[1024];
1211              while (tmps != NULL)
1212                {
1213                  int hasVal = -1;
1214                  char *corig = zStrdup (tmps);
1215                  if (strstr (corig, ".") != NULL)
1216                    {
1217
1218                      parseIdentifier (m, conf_dir, corig, buff1);
1219                      map *tmpMap = getMapFromMaps (m, "lenv", "metapath");
1220                      if (tmpMap != NULL)
1221                        addToMap (request_inputs, "metapath", tmpMap->value);
1222                      map *tmpMapI = getMapFromMaps (m, "lenv", "Identifier");
1223
1224                      s1 = (service *) malloc (SERVICE_SIZE);
1225                      t = readServiceFile (m, buff1, &s1, tmpMapI->value);
1226                      if (t < 0)
1227                        {
1228                          map *tmp00 = getMapFromMaps (m, "lenv", "message");
1229                          char tmp01[1024];
1230                          if (tmp00 != NULL)
1231                            sprintf (tmp01,
1232                                     _
1233                                     ("Unable to parse the ZCFG file for the following ZOO-Service: %s. Message: %s"),
1234                                     tmps, tmp00->value);
1235                          else
1236                            sprintf (tmp01,
1237                                     _
1238                                     ("Unable to parse the ZCFG file for the following ZOO-Service: %s."),
1239                                     tmps);
1240                          dup2 (saved_stdout, fileno (stdout));
1241                          errorException (m, tmp01, "InvalidParameterValue",
1242                                          "identifier");
1243                          freeMaps (&m);
1244                          free (m);
1245                          free (REQUEST);
1246                          free (corig);
1247                          free (orig);
1248                          free (SERVICE_URL);
1249                          free (s1);
1250                          closedir (dirp);
1251                          xmlFreeDoc (doc);
1252                          xmlCleanupParser ();
1253                          zooXmlCleanupNs ();
1254                          return 1;
1255                        }
1256#ifdef DEBUG
1257                      dumpService (s1);
1258#endif
1259                      printDescribeProcessForProcess (m, n, s1);
1260                      freeService (&s1);
1261                      free (s1);
1262                      s1 = NULL;
1263                      scount++;
1264                      hasVal = 1;
1265                      setMapInMaps (m, "lenv", "level", "0");
1266                    }
1267                  else
1268                    {
1269                      memset (buff, 0, 256);
1270                      snprintf (buff, 256, "%s.zcfg", corig);
1271                      memset (buff1, 0, 1024);
1272#ifdef DEBUG
1273                      printf ("\n#######%s\n########\n", buff);
1274#endif
1275                      while ((dp = readdir (dirp)) != NULL)
1276                        {
1277                          if (strcasecmp (dp->d_name, buff) == 0)
1278                            {
1279                              memset (buff1, 0, 1024);
1280                              snprintf (buff1, 1024, "%s/%s", conf_dir,
1281                                        dp->d_name);
1282                              s1 = (service *) malloc (SERVICE_SIZE);
1283                              if (s1 == NULL)
1284                                {
1285                                  dup2 (saved_stdout, fileno (stdout));
1286                                  return errorException (m,
1287                                                         _
1288                                                         ("Unable to allocate memory."),
1289                                                         "InternalError",
1290                                                         NULL);
1291                                }
1292#ifdef DEBUG
1293                              printf
1294                                ("#################\n(%s) %s\n#################\n",
1295                                 r_inputs->value, buff1);
1296#endif
1297                              char *tmp0 = zStrdup (dp->d_name);
1298                              tmp0[strlen (tmp0) - 5] = 0;
1299                              t = readServiceFile (m, buff1, &s1, tmp0);
1300                              free (tmp0);
1301                              if (t < 0)
1302                                {
1303                                  map *tmp00 =
1304                                    getMapFromMaps (m, "lenv", "message");
1305                                  char tmp01[1024];
1306                                  if (tmp00 != NULL)
1307                                    sprintf (tmp01,
1308                                             _
1309                                             ("Unable to parse the ZCFG file: %s (%s)"),
1310                                             dp->d_name, tmp00->value);
1311                                  else
1312                                    sprintf (tmp01,
1313                                             _
1314                                             ("Unable to parse the ZCFG file: %s."),
1315                                             dp->d_name);
1316                                  dup2 (saved_stdout, fileno (stdout));
1317                                  errorException (m, tmp01, "InternalError",
1318                                                  NULL);
1319                                  freeMaps (&m);
1320                                  free (m);
1321                                  free (orig);
1322                                  free (REQUEST);
1323                                  closedir (dirp);
1324                                  xmlFreeDoc (doc);
1325                                  xmlCleanupParser ();
1326                                  zooXmlCleanupNs ();
1327                                  return 1;
1328                                }
1329#ifdef DEBUG
1330                              dumpService (s1);
1331#endif
1332                              printDescribeProcessForProcess (m, n, s1);
1333                              freeService (&s1);
1334                              free (s1);
1335                              s1 = NULL;
1336                              scount++;
1337                              hasVal = 1;
1338                            }
1339                        }
1340                    }
1341                  if (hasVal < 0)
1342                    {
1343                      map *tmp00 = getMapFromMaps (m, "lenv", "message");
1344                      char tmp01[1024];
1345                      if (tmp00 != NULL)
1346                        sprintf (tmp01,
1347                                 _("Unable to parse the ZCFG file: %s (%s)"),
1348                                 buff, tmp00->value);
1349                      else
1350                        sprintf (tmp01,
1351                                 _("Unable to parse the ZCFG file: %s."),
1352                                 buff);
1353                      dup2 (saved_stdout, fileno (stdout));
1354                      errorException (m, tmp01, "InvalidParameterValue",
1355                                      "Identifier");
1356                      freeMaps (&m);
1357                      free (m);
1358                      free (orig);
1359                      free (REQUEST);
1360                      closedir (dirp);
1361                      xmlFreeDoc (doc);
1362                      xmlCleanupParser ();
1363                      zooXmlCleanupNs ();
1364                      return 1;
1365                    }
1366                  rewinddir (dirp);
1367                  tmps = strtok_r (NULL, ",", &saveptr);
1368                  if (corig != NULL)
1369                    free (corig);
1370                }
1371            }
1372          closedir (dirp);
1373          fflush (stdout);
1374          dup2 (saved_stdout, fileno (stdout));
1375          free (orig);
1376          printDocument (m, doc, getpid ());
1377          freeMaps (&m);
1378          free (m);
1379          free (REQUEST);
1380          free (SERVICE_URL);
1381          fflush (stdout);
1382          return 0;
1383        }
1384      else if (strncasecmp (REQUEST, "Execute", strlen (REQUEST)) != 0)
1385        {
1386          errorException (m,
1387                          _
1388                          ("Unenderstood <request> value. Please check that it was set to GetCapabilities, DescribeProcess or Execute."),
1389                          "InvalidParameterValue", "request");
1390#ifdef DEBUG
1391          fprintf (stderr, "No request found %s", REQUEST);
1392#endif
1393          closedir (dirp);
1394          freeMaps (&m);
1395          free (m);
1396          free (REQUEST);
1397          free (SERVICE_URL);
1398          fflush (stdout);
1399          return 0;
1400        }
1401      closedir (dirp);
1402    }
1403
1404  s1 = NULL;
1405  s1 = (service *) malloc (SERVICE_SIZE);
1406  if (s1 == NULL)
1407    {
1408      freeMaps (&m);
1409      free (m);
1410      free (REQUEST);
1411      free (SERVICE_URL);
1412      return errorException (m, _("Unable to allocate memory."),
1413                             "InternalError", NULL);
1414    }
1415  r_inputs = getMap (request_inputs, "MetaPath");
1416  if (r_inputs != NULL)
1417    snprintf (tmps1, 1024, "%s/%s", ntmp, r_inputs->value);
1418  else
1419    snprintf (tmps1, 1024, "%s/", ntmp);
1420  r_inputs = getMap (request_inputs, "Identifier");
1421  char *ttmp = zStrdup (tmps1);
1422  snprintf (tmps1, 1024, "%s/%s.zcfg", ttmp, r_inputs->value);
1423  free (ttmp);
1424#ifdef DEBUG
1425  fprintf (stderr, "Trying to load %s\n", tmps1);
1426#endif
1427  if (strstr (r_inputs->value, ".") != NULL)
1428    {
1429      char *identifier = zStrdup (r_inputs->value);
1430      parseIdentifier (m, conf_dir, identifier, tmps1);
1431      map *tmpMap = getMapFromMaps (m, "lenv", "metapath");
1432      if (tmpMap != NULL)
1433        addToMap (request_inputs, "metapath", tmpMap->value);
1434      free (identifier);
1435    }
1436  else
1437    {
1438      setMapInMaps (m, "lenv", "Identifier", r_inputs->value);
1439      setMapInMaps (m, "lenv", "oIdentifier", r_inputs->value);
1440    }
1441
1442  r_inputs = getMapFromMaps (m, "lenv", "Identifier");
1443  int saved_stdout = dup (fileno (stdout));
1444  dup2 (fileno (stderr), fileno (stdout));
1445  t = readServiceFile (m, tmps1, &s1, r_inputs->value);
1446  fflush (stdout);
1447  dup2 (saved_stdout, fileno (stdout));
1448  if (t < 0)
1449    {
1450      char *tmpMsg = (char *) malloc (2048 + strlen (r_inputs->value));
1451      sprintf (tmpMsg,
1452               _
1453               ("The value for <indetifier> seems to be wrong (%s). Please, ensure that the process exist using the GetCapabilities request."),
1454               r_inputs->value);
1455      errorException (m, tmpMsg, "InvalidParameterValue", "identifier");
1456      free (tmpMsg);
1457      free (s1);
1458      freeMaps (&m);
1459      free (m);
1460      free (REQUEST);
1461      free (SERVICE_URL);
1462      return 0;
1463    }
1464  close (saved_stdout);
1465
1466#ifdef DEBUG
1467  dumpService (s1);
1468#endif
1469  int j;
1470
1471
1472  /**
1473   * Create the input and output maps data structure
1474   */
1475  int i = 0;
1476  HINTERNET hInternet;
1477  HINTERNET res;
1478  hInternet = InternetOpen (
1479#ifndef WIN32
1480                             (LPCTSTR)
1481#endif
1482                             "ZooWPSClient\0",
1483                             INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
1484
1485#ifndef WIN32
1486  if (!CHECK_INET_HANDLE (hInternet))
1487    fprintf (stderr, "WARNING : hInternet handle failed to initialize");
1488#endif
1489  maps *request_input_real_format = NULL;
1490  maps *tmpmaps = request_input_real_format;
1491  map *postRequest = NULL;
1492  postRequest = getMap (request_inputs, "xrequest");
1493  if (postRequest == NULLMAP)
1494    {
1495    /**
1496     * Parsing outputs provided as KVP
1497     */
1498      r_inputs = NULL;
1499#ifdef DEBUG
1500      fprintf (stderr, "OUTPUT Parsing ... \n");
1501#endif
1502      r_inputs = getMap (request_inputs, "ResponseDocument");
1503      if (r_inputs == NULL)
1504        r_inputs = getMap (request_inputs, "RawDataOutput");
1505
1506#ifdef DEBUG
1507      fprintf (stderr, "OUTPUT Parsing ... \n");
1508#endif
1509      if (r_inputs != NULL)
1510        {
1511#ifdef DEBUG
1512          fprintf (stderr, "OUTPUT Parsing start now ... \n");
1513#endif
1514          char cursor_output[10240];
1515          char *cotmp = zStrdup (r_inputs->value);
1516          snprintf (cursor_output, 10240, "%s", cotmp);
1517          free (cotmp);
1518          j = 0;
1519
1520      /**
1521       * Put each Output into the outputs_as_text array
1522       */
1523          char *pToken;
1524          maps *tmp_output = NULL;
1525#ifdef DEBUG
1526          fprintf (stderr, "OUTPUT [%s]\n", cursor_output);
1527#endif
1528          pToken = strtok (cursor_output, ";");
1529          char **outputs_as_text = (char **) malloc (128 * sizeof (char *));
1530          if (outputs_as_text == NULL)
1531            {
1532              return errorException (m, _("Unable to allocate memory"),
1533                                     "InternalError", NULL);
1534            }
1535          i = 0;
1536          while (pToken != NULL)
1537            {
1538#ifdef DEBUG
1539              fprintf (stderr, "***%s***\n", pToken);
1540              fflush (stderr);
1541              fprintf (stderr, "***%s***\n", pToken);
1542#endif
1543              outputs_as_text[i] =
1544                (char *) malloc ((strlen (pToken) + 1) * sizeof (char));
1545              if (outputs_as_text[i] == NULL)
1546                {
1547                  return errorException (m, _("Unable to allocate memory"),
1548                                         "InternalError", NULL);
1549                }
1550              snprintf (outputs_as_text[i], strlen (pToken) + 1, "%s",
1551                        pToken);
1552              pToken = strtok (NULL, ";");
1553              i++;
1554            }
1555          for (j = 0; j < i; j++)
1556            {
1557              char *tmp = zStrdup (outputs_as_text[j]);
1558              free (outputs_as_text[j]);
1559              char *tmpc;
1560              tmpc = strtok (tmp, "@");
1561              int k = 0;
1562              while (tmpc != NULL)
1563                {
1564                  if (k == 0)
1565                    {
1566                      if (tmp_output == NULL)
1567                        {
1568                          tmp_output = (maps *) malloc (MAPS_SIZE);
1569                          if (tmp_output == NULL)
1570                            {
1571                              return errorException (m,
1572                                                     _
1573                                                     ("Unable to allocate memory."),
1574                                                     "InternalError", NULL);
1575                            }
1576                          tmp_output->name = zStrdup (tmpc);
1577                          tmp_output->content = NULL;
1578                          tmp_output->next = NULL;
1579                        }
1580                    }
1581                  else
1582                    {
1583                      char *tmpv = strstr (tmpc, "=");
1584                      char tmpn[256];
1585                      memset (tmpn, 0, 256);
1586                      strncpy (tmpn, tmpc,
1587                               (strlen (tmpc) -
1588                                strlen (tmpv)) * sizeof (char));
1589                      tmpn[strlen (tmpc) - strlen (tmpv)] = 0;
1590#ifdef DEBUG
1591                      fprintf (stderr, "OUTPUT DEF [%s]=[%s]\n", tmpn,
1592                               tmpv + 1);
1593#endif
1594                      if (tmp_output->content == NULL)
1595                        {
1596                          tmp_output->content = createMap (tmpn, tmpv + 1);
1597                          tmp_output->content->next = NULL;
1598                        }
1599                      else
1600                        addToMap (tmp_output->content, tmpn, tmpv + 1);
1601                    }
1602                  k++;
1603#ifdef DEBUG
1604                  fprintf (stderr, "***%s***\n", tmpc);
1605#endif
1606                  tmpc = strtok (NULL, "@");
1607                }
1608              if (request_output_real_format == NULL)
1609                request_output_real_format = dupMaps (&tmp_output);
1610              else
1611                addMapsToMaps (&request_output_real_format, tmp_output);
1612              freeMaps (&tmp_output);
1613              free (tmp_output);
1614              tmp_output = NULL;
1615#ifdef DEBUG
1616              dumpMaps (tmp_output);
1617              fflush (stderr);
1618#endif
1619              free (tmp);
1620            }
1621          free (outputs_as_text);
1622        }
1623
1624
1625    /**
1626     * Parsing inputs provided as KVP
1627     */
1628      r_inputs = getMap (request_inputs, "DataInputs");
1629#ifdef DEBUG
1630      fprintf (stderr, "DATA INPUTS [%s]\n", r_inputs->value);
1631#endif
1632      char cursor_input[40960];
1633      if (r_inputs != NULL)
1634        snprintf (cursor_input, 40960, "%s", r_inputs->value);
1635      else
1636        {
1637          errorException (m, _("Parameter <DataInputs> was not specified"),
1638                          "MissingParameterValue", "DataInputs");
1639          freeMaps (&m);
1640          free (m);
1641          free (REQUEST);
1642          free (SERVICE_URL);
1643          InternetCloseHandle (&hInternet);
1644          freeService (&s1);
1645          free (s1);
1646          return 0;
1647        }
1648      j = 0;
1649
1650    /**
1651     * Put each DataInputs into the inputs_as_text array
1652     */
1653      char *tmp1 = zStrdup (cursor_input);
1654      char *pToken;
1655      pToken = strtok (cursor_input, ";");
1656      if (pToken != NULL && strncasecmp (pToken, tmp1, strlen (tmp1)) == 0)
1657        {
1658          char *tmp2 = url_decode (tmp1);
1659          snprintf (cursor_input, (strlen (tmp2) + 1) * sizeof (char), "%s",
1660                    tmp2);
1661          free (tmp2);
1662          pToken = strtok (cursor_input, ";");
1663        }
1664      free (tmp1);
1665
1666      char **inputs_as_text = (char **) malloc (100 * sizeof (char *));
1667      if (inputs_as_text == NULL)
1668        {
1669          return errorException (m, _("Unable to allocate memory."),
1670                                 "InternalError", NULL);
1671        }
1672      i = 0;
1673      while (pToken != NULL)
1674        {
1675#ifdef DEBUG
1676          fprintf (stderr, "***%s***\n", pToken);
1677#endif
1678          fflush (stderr);
1679#ifdef DEBUG
1680          fprintf (stderr, "***%s***\n", pToken);
1681#endif
1682          inputs_as_text[i] =
1683            (char *) malloc ((strlen (pToken) + 1) * sizeof (char));
1684          snprintf (inputs_as_text[i], strlen (pToken) + 1, "%s", pToken);
1685          if (inputs_as_text[i] == NULL)
1686            {
1687              return errorException (m, _("Unable to allocate memory."),
1688                                     "InternalError", NULL);
1689            }
1690          pToken = strtok (NULL, ";");
1691          i++;
1692        }
1693
1694      for (j = 0; j < i; j++)
1695        {
1696          char *tmp = zStrdup (inputs_as_text[j]);
1697          free (inputs_as_text[j]);
1698          char *tmpc;
1699          tmpc = strtok (tmp, "@");
1700          while (tmpc != NULL)
1701            {
1702#ifdef DEBUG
1703              fprintf (stderr, "***\n***%s***\n", tmpc);
1704#endif
1705              char *tmpv = strstr (tmpc, "=");
1706              char tmpn[256];
1707              memset (tmpn, 0, 256);
1708              if (tmpv != NULL)
1709                {
1710                  strncpy (tmpn, tmpc,
1711                           (strlen (tmpc) - strlen (tmpv)) * sizeof (char));
1712                  tmpn[strlen (tmpc) - strlen (tmpv)] = 0;
1713                }
1714              else
1715                {
1716                  strncpy (tmpn, tmpc, strlen (tmpc) * sizeof (char));
1717                  tmpn[strlen (tmpc)] = 0;
1718                }
1719#ifdef DEBUG
1720              fprintf (stderr, "***\n*** %s = %s ***\n", tmpn, tmpv + 1);
1721#endif
1722              if (tmpmaps == NULL)
1723                {
1724                  tmpmaps = (maps *) malloc (MAPS_SIZE);
1725                  if (tmpmaps == NULL)
1726                    {
1727                      return errorException (m,
1728                                             _("Unable to allocate memory."),
1729                                             "InternalError", NULL);
1730                    }
1731                  tmpmaps->name = zStrdup (tmpn);
1732                  if (tmpv != NULL)
1733                    {
1734                      char *tmpvf = url_decode (tmpv + 1);
1735                      tmpmaps->content = createMap ("value", tmpvf);
1736                      free (tmpvf);
1737                    }
1738                  else
1739                    tmpmaps->content = createMap ("value", "Reference");
1740                  tmpmaps->next = NULL;
1741                }
1742              tmpc = strtok (NULL, "@");
1743              while (tmpc != NULL)
1744                {
1745#ifdef DEBUG
1746                  fprintf (stderr, "*** KVP NON URL-ENCODED \n***%s***\n",
1747                           tmpc);
1748#endif
1749                  char *tmpv1 = strstr (tmpc, "=");
1750#ifdef DEBUG
1751                  fprintf (stderr, "*** VALUE NON URL-ENCODED \n***%s***\n",
1752                           tmpv1 + 1);
1753#endif
1754                  char tmpn1[1024];
1755                  memset (tmpn1, 0, 1024);
1756                  if (tmpv1 != NULL)
1757                    {
1758                      strncpy (tmpn1, tmpc, strlen (tmpc) - strlen (tmpv1));
1759                      tmpn1[strlen (tmpc) - strlen (tmpv1)] = 0;
1760                      addToMap (tmpmaps->content, tmpn1, tmpv1 + 1);
1761                    }
1762                  else
1763                    {
1764                      strncpy (tmpn1, tmpc, strlen (tmpc));
1765                      tmpn1[strlen (tmpc)] = 0;
1766                      map *lmap = getLastMap (tmpmaps->content);
1767                      char *tmpValue =
1768                        (char *) malloc ((strlen (tmpv) + strlen (tmpc) + 1) *
1769                                         sizeof (char));
1770                      sprintf (tmpValue, "%s@%s", tmpv + 1, tmpc);
1771                      free (lmap->value);
1772                      lmap->value = zStrdup (tmpValue);
1773                      free (tmpValue);
1774                      tmpc = strtok (NULL, "@");
1775                      continue;
1776                    }
1777#ifdef DEBUG
1778                  fprintf (stderr, "*** NAME NON URL-ENCODED \n***%s***\n",
1779                           tmpn1);
1780                  fprintf (stderr, "*** VALUE NON URL-ENCODED \n***%s***\n",
1781                           tmpv1 + 1);
1782#endif
1783                  if (strcmp (tmpn1, "xlink:href") != 0)
1784                    addToMap (tmpmaps->content, tmpn1, tmpv1 + 1);
1785                  else if (tmpv1 != NULL)
1786                    {
1787                      char *tmpx2 = url_decode (tmpv1 + 1);
1788                      if (strncasecmp (tmpx2, "http://", 7) != 0 &&
1789                          strncasecmp (tmpx2, "ftp://", 6) != 0 &&
1790                          strncasecmp (tmpx2, "https://", 8) != 0)
1791                        {
1792                          char emsg[1024];
1793                          sprintf (emsg,
1794                                   _
1795                                   ("Unable to find a valid protocol to download the remote file %s"),
1796                                   tmpv1 + 1);
1797                          errorException (m, emsg, "InternalError", NULL);
1798                          freeMaps (&m);
1799                          free (m);
1800                          free (REQUEST);
1801                          free (SERVICE_URL);
1802                          InternetCloseHandle (&hInternet);
1803                          freeService (&s1);
1804                          free (s1);
1805                          return 0;
1806                        }
1807#ifdef DEBUG
1808                      fprintf (stderr,
1809                               "REQUIRE TO DOWNLOAD A FILE FROM A SERVER : url(%s)\n",
1810                               tmpv1 + 1);
1811#endif
1812                      addToMap (tmpmaps->content, tmpn1, tmpx2);
1813#ifndef WIN32
1814                      if (CHECK_INET_HANDLE (hInternet))
1815#endif
1816                        {
1817                          if (loadRemoteFile
1818                              (&m, &tmpmaps->content, &hInternet, tmpx2) < 0)
1819                            {
1820                              freeMaps (&m);
1821                              free (m);
1822                              free (REQUEST);
1823                              free (SERVICE_URL);
1824                              InternetCloseHandle (&hInternet);
1825                              freeService (&s1);
1826                              free (s1);
1827                              return 0;
1828                            }
1829                        }
1830                      free (tmpx2);
1831                      addToMap (tmpmaps->content, "Reference", tmpv1 + 1);
1832                    }
1833                  tmpc = strtok (NULL, "@");
1834                }
1835#ifdef DEBUG
1836              dumpMaps (tmpmaps);
1837              fflush (stderr);
1838#endif
1839              if (request_input_real_format == NULL)
1840                request_input_real_format = dupMaps (&tmpmaps);
1841              else
1842                {
1843                  maps *testPresence =
1844                    getMaps (request_input_real_format, tmpmaps->name);
1845                  if (testPresence != NULL)
1846                    {
1847                      elements *elem =
1848                        getElements (s1->inputs, tmpmaps->name);
1849                      if (elem != NULL)
1850                        {
1851                          if (appendMapsToMaps
1852                              (m, request_input_real_format, tmpmaps,
1853                               elem) < 0)
1854                            {
1855                              freeMaps (&m);
1856                              free (m);
1857                              free (REQUEST);
1858                              free (SERVICE_URL);
1859                              InternetCloseHandle (&hInternet);
1860                              freeService (&s1);
1861                              free (s1);
1862                              return 0;
1863                            }
1864                        }
1865                    }
1866                  else
1867                    addMapsToMaps (&request_input_real_format, tmpmaps);
1868                }
1869              freeMaps (&tmpmaps);
1870              free (tmpmaps);
1871              tmpmaps = NULL;
1872              free (tmp);
1873            }
1874        }
1875      free (inputs_as_text);
1876    }
1877  else
1878    {
1879    /**
1880     * Parse XML request
1881     */
1882      xmlInitParser ();
1883#ifdef DEBUG
1884      fflush (stderr);
1885      fprintf (stderr, "BEFORE %s\n", postRequest->value);
1886      fflush (stderr);
1887#endif
1888      xmlDocPtr doc = xmlParseMemory (postRequest->value, cgiContentLength);
1889#ifdef DEBUG
1890      fprintf (stderr, "AFTER\n");
1891      fflush (stderr);
1892#endif
1893    /**
1894     * Parse every Input in DataInputs node.
1895     */
1896      xmlXPathObjectPtr tmpsptr =
1897        extractFromDoc (doc, "/*/*/*[local-name()='Input']");
1898      xmlNodeSet *tmps = tmpsptr->nodesetval;
1899#ifdef DEBUG
1900      fprintf (stderr, "*****%d*****\n", tmps->nodeNr);
1901#endif
1902      for (int k = 0; k < tmps->nodeNr; k++)
1903        {
1904          maps *tmpmaps = NULL;
1905          xmlNodePtr cur = tmps->nodeTab[k];
1906          if (tmps->nodeTab[k]->type == XML_ELEMENT_NODE)
1907            {
1908        /**
1909         * A specific Input node.
1910         */
1911#ifdef DEBUG
1912              fprintf (stderr, "= element 0 node \"%s\"\n", cur->name);
1913#endif
1914              xmlNodePtr cur2 = cur->children;
1915              while (cur2 != NULL)
1916                {
1917                  while (cur2 != NULL && cur2->type != XML_ELEMENT_NODE)
1918                    cur2 = cur2->next;
1919                  if (cur2 == NULL)
1920                    break;
1921          /**
1922           * Indentifier
1923           */
1924                  if (xmlStrncasecmp
1925                      (cur2->name, BAD_CAST "Identifier",
1926                       xmlStrlen (cur2->name)) == 0)
1927                    {
1928                      xmlChar *val =
1929                        xmlNodeListGetString (doc, cur2->xmlChildrenNode, 1);
1930                      if (tmpmaps == NULL)
1931                        {
1932                          tmpmaps = (maps *) malloc (MAPS_SIZE);
1933                          if (tmpmaps == NULL)
1934                            {
1935                              return errorException (m,
1936                                                     _
1937                                                     ("Unable to allocate memory."),
1938                                                     "InternalError", NULL);
1939                            }
1940                          tmpmaps->name = zStrdup ((char *) val);
1941                          tmpmaps->content = NULL;
1942                          tmpmaps->next = NULL;
1943                        }
1944                      xmlFree (val);
1945                    }
1946          /**
1947           * Title, Asbtract
1948           */
1949                  if (xmlStrncasecmp
1950                      (cur2->name, BAD_CAST "Title",
1951                       xmlStrlen (cur2->name)) == 0
1952                      || xmlStrncasecmp (cur2->name, BAD_CAST "Abstract",
1953                                         xmlStrlen (cur2->name)) == 0)
1954                    {
1955                      xmlChar *val =
1956                        xmlNodeListGetString (doc, cur2->xmlChildrenNode, 1);
1957                      if (tmpmaps == NULL)
1958                        {
1959                          tmpmaps = (maps *) malloc (MAPS_SIZE);
1960                          if (tmpmaps == NULL)
1961                            {
1962                              return errorException (m,
1963                                                     _
1964                                                     ("Unable to allocate memory."),
1965                                                     "InternalError", NULL);
1966                            }
1967                          tmpmaps->name = zStrdup ("missingIndetifier");
1968                          tmpmaps->content =
1969                            createMap ((char *) cur2->name, (char *) val);
1970                          tmpmaps->next = NULL;
1971                        }
1972                      else
1973                        {
1974                          if (tmpmaps->content != NULL)
1975                            addToMap (tmpmaps->content,
1976                                      (char *) cur2->name, (char *) val);
1977                          else
1978                            tmpmaps->content =
1979                              createMap ((char *) cur2->name, (char *) val);
1980                        }
1981#ifdef DEBUG
1982                      dumpMaps (tmpmaps);
1983#endif
1984                      xmlFree (val);
1985                    }
1986          /**
1987           * InputDataFormChoice (Reference or Data ?)
1988           */
1989                  if (xmlStrcasecmp (cur2->name, BAD_CAST "Reference") == 0)
1990                    {
1991            /**
1992             * Get every attribute from a Reference node
1993             * mimeType, encoding, schema, href, method
1994             * Header and Body gesture should be added here
1995             */
1996#ifdef DEBUG
1997                      fprintf (stderr, "REFERENCE\n");
1998#endif
1999                      const char *refs[5] =
2000                        { "mimeType", "encoding", "schema", "method",
2001                        "href"
2002                      };
2003                      for (int l = 0; l < 5; l++)
2004                        {
2005#ifdef DEBUG
2006                          fprintf (stderr, "*** %s ***", refs[l]);
2007#endif
2008                          xmlChar *val = xmlGetProp (cur2, BAD_CAST refs[l]);
2009                          if (val != NULL && xmlStrlen (val) > 0)
2010                            {
2011                              if (tmpmaps->content != NULL)
2012                                addToMap (tmpmaps->content, refs[l],
2013                                          (char *) val);
2014                              else
2015                                tmpmaps->content =
2016                                  createMap (refs[l], (char *) val);
2017                              map *ltmp = getMap (tmpmaps->content, "method");
2018                              if (l == 4)
2019                                {
2020                                  if (!
2021                                      (ltmp != NULL
2022                                       && strncmp (ltmp->value, "POST",
2023                                                   4) == 0)
2024                                      && CHECK_INET_HANDLE (hInternet))
2025                                    {
2026                                      if (loadRemoteFile
2027                                          (&m, &tmpmaps->content, &hInternet,
2028                                           (char *) val) != 0)
2029                                        {
2030                                          freeMaps (&m);
2031                                          free (m);
2032                                          free (REQUEST);
2033                                          free (SERVICE_URL);
2034                                          InternetCloseHandle (&hInternet);
2035                                          freeService (&s1);
2036                                          free (s1);
2037                                          return 0;
2038                                        }
2039                                    }
2040                                }
2041                            }
2042#ifdef DEBUG
2043                          fprintf (stderr, "%s\n", val);
2044#endif
2045                          xmlFree (val);
2046                        }
2047#ifdef POST_DEBUG
2048                      fprintf (stderr,
2049                               "Parse Header and Body from Reference \n");
2050#endif
2051                      xmlNodePtr cur3 = cur2->children;
2052                      /*      HINTERNET hInternetP;
2053                         hInternetP=InternetOpen(
2054                         #ifndef WIN32
2055                         (LPCTSTR)
2056                         #endif
2057                         "ZooWPSClient\0",
2058                         INTERNET_OPEN_TYPE_PRECONFIG,
2059                         NULL,NULL, 0); */
2060                      //hInternet.ihandle[hInternet.nb].header=NULL;
2061                      while (cur3 != NULL)
2062                        {
2063                          while (cur3 != NULL
2064                                 && cur3->type != XML_ELEMENT_NODE)
2065                            cur3 = cur3->next;
2066                          if (cur3 == NULL)
2067                            break;
2068                          if (xmlStrcasecmp (cur3->name, BAD_CAST "Header") ==
2069                              0)
2070                            {
2071                              const char *ha[2];
2072                              ha[0] = "key";
2073                              ha[1] = "value";
2074                              int hai;
2075                              char *has;
2076                              char *key;
2077                              for (hai = 0; hai < 2; hai++)
2078                                {
2079                                  xmlChar *val =
2080                                    xmlGetProp (cur3, BAD_CAST ha[hai]);
2081#ifdef POST_DEBUG
2082                                  fprintf (stderr, "%s = %s\n", ha[hai],
2083                                           (char *) val);
2084#endif
2085                                  if (hai == 0)
2086                                    {
2087                                      key = zStrdup ((char *) val);
2088                                    }
2089                                  else
2090                                    {
2091                                      has =
2092                                        (char *)
2093                                        malloc ((4 + xmlStrlen (val) +
2094                                                 strlen (key)) *
2095                                                sizeof (char));
2096                                      if (has == NULL)
2097                                        {
2098                                          return errorException (m,
2099                                                                 _
2100                                                                 ("Unable to allocate memory."),
2101                                                                 "InternalError",
2102                                                                 NULL);
2103                                        }
2104                                      snprintf (has,
2105                                                (3 + xmlStrlen (val) +
2106                                                 strlen (key)), "%s: %s", key,
2107                                                (char *) val);
2108                                      free (key);
2109#ifdef POST_DEBUG
2110                                      fprintf (stderr, "%s\n", has);
2111#endif
2112                                    }
2113                                  xmlFree (val);
2114                                }
2115                              hInternet.ihandle[hInternet.nb].header =
2116                                curl_slist_append (hInternet.ihandle
2117                                                   [hInternet.nb].header,
2118                                                   has);
2119                              if (has != NULL)
2120                                free (has);
2121                            }
2122                          else
2123                            {
2124#ifdef POST_DEBUG
2125                              fprintf (stderr,
2126                                       "Try to fetch the body part of the request ...\n");
2127#endif
2128                              if (xmlStrcasecmp (cur3->name, BAD_CAST "Body")
2129                                  == 0)
2130                                {
2131#ifdef POST_DEBUG
2132                                  fprintf (stderr, "Body part found !!!\n",
2133                                           (char *) cur3->content);
2134#endif
2135                                  char *tmp =
2136                                    (char *) malloc (cgiContentLength +
2137                                                     1 * sizeof (char));
2138                                  memset (tmp, 0, cgiContentLength);
2139                                  xmlNodePtr cur4 = cur3->children;
2140                                  while (cur4 != NULL)
2141                                    {
2142                                      while (cur4->type != XML_ELEMENT_NODE)
2143                                        cur4 = cur4->next;
2144                                      xmlDocPtr bdoc =
2145                                        xmlNewDoc (BAD_CAST "1.0");
2146                                      bdoc->encoding =
2147                                        xmlCharStrdup ("UTF-8");
2148                                      xmlDocSetRootElement (bdoc, cur4);
2149                                      xmlChar *btmps;
2150                                      int bsize;
2151                                      xmlDocDumpMemory (bdoc, &btmps, &bsize);
2152#ifdef POST_DEBUG
2153                                      fprintf (stderr,
2154                                               "Body part found !!! %s %s\n",
2155                                               tmp, (char *) btmps);
2156#endif
2157                                      if (btmps != NULL)
2158                                        sprintf (tmp, "%s", (char *) btmps);
2159                                      xmlFree (btmps);
2160                                      cur4 = cur4->next;
2161                                      xmlFreeDoc (bdoc);
2162                                    }
2163                                  map *btmp =
2164                                    getMap (tmpmaps->content, "href");
2165                                  if (btmp != NULL)
2166                                    {
2167#ifdef POST_DEBUG
2168                                      fprintf (stderr, "%s %s\n", btmp->value,
2169                                               tmp);
2170                                      curl_easy_setopt (hInternet.handle,
2171                                                        CURLOPT_VERBOSE, 1);
2172#endif
2173                                      hInternet.
2174                                        waitingRequests[hInternet.nb] =
2175                                        strdup (tmp);
2176                                      InternetOpenUrl (&hInternet,
2177                                                       btmp->value,
2178                                                       hInternet.waitingRequests
2179                                                       [hInternet.nb],
2180                                                       strlen
2181                                                       (hInternet.waitingRequests
2182                                                        [hInternet.nb]),
2183                                                       INTERNET_FLAG_NO_CACHE_WRITE,
2184                                                       0);
2185                                    }
2186                                  free (tmp);
2187                                }
2188                              else
2189                                if (xmlStrcasecmp
2190                                    (cur3->name,
2191                                     BAD_CAST "BodyReference") == 0)
2192                                {
2193                                  xmlChar *val =
2194                                    xmlGetProp (cur3, BAD_CAST "href");
2195                                  HINTERNET bInternet, res1;
2196                                  bInternet = InternetOpen (
2197#ifndef WIN32
2198                                                             (LPCTSTR)
2199#endif
2200                                                             "ZooWPSClient\0",
2201                                                             INTERNET_OPEN_TYPE_PRECONFIG,
2202                                                             NULL, NULL, 0);
2203                                  if (!CHECK_INET_HANDLE (hInternet))
2204                                    fprintf (stderr,
2205                                             "WARNING : hInternet handle failed to initialize");
2206#ifdef POST_DEBUG
2207                                  curl_easy_setopt (bInternet.handle,
2208                                                    CURLOPT_VERBOSE, 1);
2209#endif
2210                                  bInternet.waitingRequests[0] =
2211                                    strdup ((char *) val);
2212                                  res1 =
2213                                    InternetOpenUrl (&bInternet,
2214                                                     bInternet.waitingRequests
2215                                                     [0], NULL, 0,
2216                                                     INTERNET_FLAG_NO_CACHE_WRITE,
2217                                                     0);
2218                                  processDownloads (&bInternet);
2219                                  char *tmp =
2220                                    (char *)
2221                                    malloc ((bInternet.ihandle[0].nDataLen +
2222                                             1) * sizeof (char));
2223                                  if (tmp == NULL)
2224                                    {
2225                                      return errorException (m,
2226                                                             _
2227                                                             ("Unable to allocate memory."),
2228                                                             "InternalError",
2229                                                             NULL);
2230                                    }
2231                                  size_t bRead;
2232                                  InternetReadFile (bInternet.ihandle[0],
2233                                                    (LPVOID) tmp,
2234                                                    bInternet.
2235                                                    ihandle[0].nDataLen,
2236                                                    &bRead);
2237                                  tmp[bInternet.ihandle[0].nDataLen] = 0;
2238                                  InternetCloseHandle (&bInternet);
2239                                  map *btmp =
2240                                    getMap (tmpmaps->content, "href");
2241                                  if (btmp != NULL)
2242                                    {
2243#ifdef POST_DEBUG
2244                                      fprintf (stderr, "%s %s\n", btmp->value,
2245                                               tmp);
2246#endif
2247                                      hInternet.
2248                                        waitingRequests[hInternet.nb] =
2249                                        strdup (tmp);
2250                                      res =
2251                                        InternetOpenUrl (&hInternet,
2252                                                         btmp->value,
2253                                                         hInternet.waitingRequests
2254                                                         [hInternet.nb],
2255                                                         strlen
2256                                                         (hInternet.waitingRequests
2257                                                          [hInternet.nb]),
2258                                                         INTERNET_FLAG_NO_CACHE_WRITE,
2259                                                         0);
2260                                    }
2261                                  free (tmp);
2262                                }
2263                            }
2264                          cur3 = cur3->next;
2265                        }
2266#ifdef POST_DEBUG
2267                      fprintf (stderr,
2268                               "Header and Body was parsed from Reference \n");
2269#endif
2270#ifdef DEBUG
2271                      dumpMap (tmpmaps->content);
2272                      fprintf (stderr, "= element 2 node \"%s\" = (%s)\n",
2273                               cur2->name, cur2->content);
2274#endif
2275                    }
2276                  else if (xmlStrcasecmp (cur2->name, BAD_CAST "Data") == 0)
2277                    {
2278#ifdef DEBUG
2279                      fprintf (stderr, "DATA\n");
2280#endif
2281                      xmlNodePtr cur4 = cur2->children;
2282                      while (cur4 != NULL)
2283                        {
2284                          while (cur4 != NULL
2285                                 && cur4->type != XML_ELEMENT_NODE)
2286                            cur4 = cur4->next;
2287                          if (cur4 == NULL)
2288                            break;
2289                          if (xmlStrcasecmp
2290                              (cur4->name, BAD_CAST "LiteralData") == 0)
2291                            {
2292                /**
2293                 * Get every attribute from a LiteralData node
2294                 * dataType , uom
2295                 */
2296                              char *list[2];
2297                              list[0] = zStrdup ("dataType");
2298                              list[1] = zStrdup ("uom");
2299                              for (int l = 0; l < 2; l++)
2300                                {
2301#ifdef DEBUG
2302                                  fprintf (stderr, "*** LiteralData %s ***",
2303                                           list[l]);
2304#endif
2305                                  xmlChar *val =
2306                                    xmlGetProp (cur4, BAD_CAST list[l]);
2307                                  if (val != NULL
2308                                      && strlen ((char *) val) > 0)
2309                                    {
2310                                      if (tmpmaps->content != NULL)
2311                                        addToMap (tmpmaps->content, list[l],
2312                                                  (char *) val);
2313                                      else
2314                                        tmpmaps->content =
2315                                          createMap (list[l], (char *) val);
2316#ifdef DEBUG
2317                                      fprintf (stderr, "%s\n", val);
2318#endif
2319                                    }
2320                                  xmlFree (val);
2321                                  free (list[l]);
2322                                }
2323                            }
2324                          else
2325                            if (xmlStrcasecmp
2326                                (cur4->name, BAD_CAST "ComplexData") == 0)
2327                            {
2328                /**
2329                 * Get every attribute from a Reference node
2330                 * mimeType, encoding, schema
2331                 */
2332                              const char *coms[3] =
2333                                { "mimeType", "encoding", "schema" };
2334                              for (int l = 0; l < 3; l++)
2335                                {
2336#ifdef DEBUG
2337                                  fprintf (stderr, "*** ComplexData %s ***\n",
2338                                           coms[l]);
2339#endif
2340                                  xmlChar *val =
2341                                    xmlGetProp (cur4, BAD_CAST coms[l]);
2342                                  if (val != NULL
2343                                      && strlen ((char *) val) > 0)
2344                                    {
2345                                      if (tmpmaps->content != NULL)
2346                                        addToMap (tmpmaps->content, coms[l],
2347                                                  (char *) val);
2348                                      else
2349                                        tmpmaps->content =
2350                                          createMap (coms[l], (char *) val);
2351#ifdef DEBUG
2352                                      fprintf (stderr, "%s\n", val);
2353#endif
2354                                    }
2355                                  xmlFree (val);
2356                                }
2357                            }
2358
2359                          map *test = getMap (tmpmaps->content, "encoding");
2360                          if (test == NULL)
2361                            {
2362                              if (tmpmaps->content != NULL)
2363                                addToMap (tmpmaps->content, "encoding",
2364                                          "utf-8");
2365                              else
2366                                tmpmaps->content =
2367                                  createMap ("encoding", "utf-8");
2368                              test = getMap (tmpmaps->content, "encoding");
2369                            }
2370
2371                          if (strcasecmp (test->value, "base64") != 0)
2372                            {
2373                              xmlChar *mv = xmlNodeListGetString (doc,
2374                                                                  cur4->
2375                                                                  xmlChildrenNode,
2376                                                                  1);
2377                              map *ltmp =
2378                                getMap (tmpmaps->content, "mimeType");
2379                              if (mv == NULL
2380                                  ||
2381                                  (xmlStrcasecmp
2382                                   (cur4->name, BAD_CAST "ComplexData") == 0
2383                                   && (ltmp == NULL
2384                                       || strncasecmp (ltmp->value,
2385                                                       "text/xml", 8) == 0)))
2386                                {
2387                                  xmlDocPtr doc1 = xmlNewDoc (BAD_CAST "1.0");
2388                                  int buffersize;
2389                                  xmlNodePtr cur5 = cur4->children;
2390                                  while (cur5 != NULL
2391                                         && cur5->type != XML_ELEMENT_NODE
2392                                         && cur5->type !=
2393                                         XML_CDATA_SECTION_NODE)
2394                                    cur5 = cur5->next;
2395                                  if (cur5 != NULL
2396                                      && cur5->type != XML_CDATA_SECTION_NODE)
2397                                    {
2398                                      xmlDocSetRootElement (doc1, cur5);
2399                                      xmlDocDumpFormatMemoryEnc (doc1, &mv,
2400                                                                 &buffersize,
2401                                                                 "utf-8", 1);
2402                                      char size[1024];
2403                                      sprintf (size, "%d", buffersize);
2404                                      addToMap (tmpmaps->content, "size",
2405                                                size);
2406                                      xmlFreeDoc (doc1);
2407                                    }
2408                                }
2409                              if (mv != NULL)
2410                                {
2411                                  addToMap (tmpmaps->content, "value",
2412                                            (char *) mv);
2413                                  xmlFree (mv);
2414                                }
2415                            }
2416                          else
2417                            {
2418                              xmlChar *tmp = xmlNodeListGetRawString (doc,
2419                                                                      cur4->xmlChildrenNode,
2420                                                                      0);
2421                              addToMap (tmpmaps->content, "value",
2422                                        (char *) tmp);
2423                              map *tmpv = getMap (tmpmaps->content, "value");
2424                              char *res = NULL;
2425                              char *curs = tmpv->value;
2426                              for (int i = 0; i <= strlen (tmpv->value) / 64;
2427                                   i++)
2428                                {
2429                                  if (res == NULL)
2430                                    res =
2431                                      (char *) malloc (67 * sizeof (char));
2432                                  else
2433                                    res =
2434                                      (char *) realloc (res,
2435                                                        (((i + 1) * 65) +
2436                                                         i) * sizeof (char));
2437                                  int csize = i * 65;
2438                                  strncpy (res + csize, curs, 64);
2439                                  if (i == xmlStrlen (tmp) / 64)
2440                                    strcat (res, "\n\0");
2441                                  else
2442                                    {
2443                                      strncpy (res + (((i + 1) * 64) + i),
2444                                               "\n\0", 2);
2445                                      curs += 64;
2446                                    }
2447                                }
2448                              free (tmpv->value);
2449                              tmpv->value = zStrdup (res);
2450                              free (res);
2451                              xmlFree (tmp);
2452                            }
2453                          cur4 = cur4->next;
2454                        }
2455                    }
2456#ifdef DEBUG
2457                  fprintf (stderr, "cur2 next \n");
2458                  fflush (stderr);
2459#endif
2460                  cur2 = cur2->next;
2461                }
2462#ifdef DEBUG
2463              fprintf (stderr, "ADD MAPS TO REQUEST MAPS !\n");
2464              fflush (stderr);
2465#endif
2466
2467              {
2468                maps *testPresence =
2469                  getMaps (request_input_real_format, tmpmaps->name);
2470                if (testPresence != NULL)
2471                  {
2472                    elements *elem = getElements (s1->inputs, tmpmaps->name);
2473                    if (elem != NULL)
2474                      {
2475                        if (appendMapsToMaps
2476                            (m, request_input_real_format, tmpmaps, elem) < 0)
2477                          {
2478                            freeMaps (&m);
2479                            free (m);
2480                            free (REQUEST);
2481                            free (SERVICE_URL);
2482                            InternetCloseHandle (&hInternet);
2483                            freeService (&s1);
2484                            free (s1);
2485                            return 0;
2486                          }
2487                      }
2488                  }
2489                else
2490                  addMapsToMaps (&request_input_real_format, tmpmaps);
2491              }
2492
2493#ifdef DEBUG
2494              fprintf (stderr, "******TMPMAPS*****\n");
2495              dumpMaps (tmpmaps);
2496              fprintf (stderr, "******REQUESTMAPS*****\n");
2497              dumpMaps (request_input_real_format);
2498#endif
2499              freeMaps (&tmpmaps);
2500              free (tmpmaps);
2501              tmpmaps = NULL;
2502            }
2503#ifdef DEBUG
2504          dumpMaps (tmpmaps);
2505#endif
2506        }
2507#ifdef DEBUG
2508      fprintf (stderr, "Search for response document node\n");
2509#endif
2510      xmlXPathFreeObject (tmpsptr);
2511
2512      tmpsptr =
2513        extractFromDoc (doc, "/*/*/*[local-name()='ResponseDocument']");
2514      bool asRaw = false;
2515      tmps = tmpsptr->nodesetval;
2516      if (tmps->nodeNr == 0)
2517        {
2518          xmlXPathFreeObject (tmpsptr);
2519          tmpsptr =
2520            extractFromDoc (doc, "/*/*/*[local-name()='RawDataOutput']");
2521          tmps = tmpsptr->nodesetval;
2522          asRaw = true;
2523        }
2524#ifdef DEBUG
2525      fprintf (stderr, "*****%d*****\n", tmps->nodeNr);
2526#endif
2527      if (asRaw == true)
2528        {
2529          addToMap (request_inputs, "RawDataOutput", "");
2530          xmlNodePtr cur0 = tmps->nodeTab[0];
2531          if (cur0->type == XML_ELEMENT_NODE)
2532            {
2533
2534              maps *tmpmaps = (maps *) malloc (MAPS_SIZE);
2535              if (tmpmaps == NULL)
2536                {
2537                  return errorException (m, _("Unable to allocate memory."),
2538                                         "InternalError", NULL);
2539                }
2540              tmpmaps->name = zStrdup ("unknownIdentifier");
2541              tmpmaps->content = NULL;
2542              tmpmaps->next = NULL;
2543
2544        /**
2545         * Get every attribute from a RawDataOutput node
2546         * mimeType, encoding, schema, uom
2547         */
2548              const char *outs[4] =
2549                { "mimeType", "encoding", "schema", "uom" };
2550              for (int l = 0; l < 4; l++)
2551                {
2552#ifdef DEBUG
2553                  fprintf (stderr, "*** %s ***\t", outs[l]);
2554#endif
2555                  xmlChar *val = xmlGetProp (cur0, BAD_CAST outs[l]);
2556                  if (val != NULL)
2557                    {
2558                      if (strlen ((char *) val) > 0)
2559                        {
2560                          if (tmpmaps->content != NULL)
2561                            addToMap (tmpmaps->content, outs[l],
2562                                      (char *) val);
2563                          else
2564                            tmpmaps->content =
2565                              createMap (outs[l], (char *) val);
2566                        }
2567                      xmlFree (val);
2568                    }
2569                }
2570              xmlNodePtr cur2 = cur0->children;
2571              while (cur2 != NULL && cur2->type != XML_ELEMENT_NODE)
2572                cur2 = cur2->next;
2573              int cur1cnt = 0;
2574              while (cur2 != NULL)
2575                {
2576                  if (xmlStrncasecmp
2577                      (cur2->name, BAD_CAST "Identifier",
2578                       xmlStrlen (cur2->name)) == 0)
2579                    {
2580                      xmlChar *val =
2581                        xmlNodeListGetString (NULL, cur2->xmlChildrenNode, 1);
2582                      free (tmpmaps->name);
2583                      tmpmaps->name = zStrdup ((char *) val);
2584                      xmlFree (val);
2585                    }
2586                  cur2 = cur2->next;
2587                  while (cur2 != NULL && cur2->type != XML_ELEMENT_NODE)
2588                    cur2 = cur2->next;
2589                }
2590              if (request_output_real_format == NULL)
2591                request_output_real_format = dupMaps (&tmpmaps);
2592              else
2593                addMapsToMaps (&request_output_real_format, tmpmaps);
2594              if (tmpmaps != NULL)
2595                {
2596                  freeMaps (&tmpmaps);
2597                  free (tmpmaps);
2598                  tmpmaps = NULL;
2599                }
2600            }
2601        }
2602      else
2603        for (int k = 0; k < tmps->nodeNr; k++)
2604          {
2605            //else
2606            addToMap (request_inputs, "ResponseDocument", "");
2607            maps *tmpmaps = NULL;
2608            xmlNodePtr cur = tmps->nodeTab[k];
2609            if (cur->type == XML_ELEMENT_NODE)
2610              {
2611          /**
2612           * A specific responseDocument node.
2613           */
2614                if (tmpmaps == NULL)
2615                  {
2616                    tmpmaps = (maps *) malloc (MAPS_SIZE);
2617                    if (tmpmaps == NULL)
2618                      {
2619                        return errorException (m,
2620                                               _
2621                                               ("Unable to allocate memory."),
2622                                               "InternalError", NULL);
2623                      }
2624                    tmpmaps->name = zStrdup ("unknownIdentifier");
2625                    tmpmaps->content = NULL;
2626                    tmpmaps->next = NULL;
2627                  }
2628          /**
2629           * Get every attribute: storeExecuteResponse, lineage, status
2630           */
2631                const char *ress[3] =
2632                  { "storeExecuteResponse", "lineage", "status" };
2633                xmlChar *val;
2634                for (int l = 0; l < 3; l++)
2635                  {
2636#ifdef DEBUG
2637                    fprintf (stderr, "*** %s ***\t", ress[l]);
2638#endif
2639                    val = xmlGetProp (cur, BAD_CAST ress[l]);
2640                    if (val != NULL && strlen ((char *) val) > 0)
2641                      {
2642                        if (tmpmaps->content != NULL)
2643                          addToMap (tmpmaps->content, ress[l], (char *) val);
2644                        else
2645                          tmpmaps->content =
2646                            createMap (ress[l], (char *) val);
2647                        addToMap (request_inputs, ress[l], (char *) val);
2648                      }
2649#ifdef DEBUG
2650                    fprintf (stderr, "%s\n", val);
2651#endif
2652                    xmlFree (val);
2653                  }
2654                xmlNodePtr cur1 = cur->children;
2655                while (cur1 != NULL && cur1->type != XML_ELEMENT_NODE)
2656                  cur1 = cur1->next;
2657                int cur1cnt = 0;
2658                while (cur1)
2659                  {
2660            /**
2661             * Indentifier
2662             */
2663                    if (xmlStrncasecmp
2664                        (cur1->name, BAD_CAST "Identifier",
2665                         xmlStrlen (cur1->name)) == 0)
2666                      {
2667                        xmlChar *val =
2668                          xmlNodeListGetString (doc, cur1->xmlChildrenNode,
2669                                                1);
2670                        if (tmpmaps == NULL)
2671                          {
2672                            tmpmaps = (maps *) malloc (MAPS_SIZE);
2673                            if (tmpmaps == NULL)
2674                              {
2675                                return errorException (m,
2676                                                       _
2677                                                       ("Unable to allocate memory."),
2678                                                       "InternalError", NULL);
2679                              }
2680                            tmpmaps->name = zStrdup ((char *) val);
2681                            tmpmaps->content = NULL;
2682                            tmpmaps->next = NULL;
2683                          }
2684                        else
2685                          {
2686                            free (tmpmaps->name);
2687                            tmpmaps->name = zStrdup ((char *) val);
2688                          }
2689                        if (asRaw == true)
2690                          addToMap (request_inputs, "RawDataOutput",
2691                                    (char *) val);
2692                        else
2693                          {
2694                            if (cur1cnt == 0)
2695                              addToMap (request_inputs, "ResponseDocument",
2696                                        (char *) val);
2697                            else
2698                              {
2699                                map *tt =
2700                                  getMap (request_inputs, "ResponseDocument");
2701                                char *tmp = zStrdup (tt->value);
2702                                free (tt->value);
2703                                tt->value =
2704                                  (char *)
2705                                  malloc ((strlen (tmp) +
2706                                           strlen ((char *) val) +
2707                                           1) * sizeof (char));
2708                                sprintf (tt->value, "%s;%s", tmp,
2709                                         (char *) val);
2710                                free (tmp);
2711                              }
2712                          }
2713                        cur1cnt += 1;
2714                        xmlFree (val);
2715                      }
2716            /**
2717             * Title, Asbtract
2718             */
2719                    else
2720                      if (xmlStrncasecmp
2721                          (cur1->name, BAD_CAST "Title",
2722                           xmlStrlen (cur1->name)) == 0
2723                          || xmlStrncasecmp (cur1->name, BAD_CAST "Abstract",
2724                                             xmlStrlen (cur1->name)) == 0)
2725                      {
2726                        xmlChar *val =
2727                          xmlNodeListGetString (doc, cur1->xmlChildrenNode,
2728                                                1);
2729                        if (tmpmaps == NULL)
2730                          {
2731                            tmpmaps = (maps *) malloc (MAPS_SIZE);
2732                            if (tmpmaps == NULL)
2733                              {
2734                                return errorException (m,
2735                                                       _
2736                                                       ("Unable to allocate memory."),
2737                                                       "InternalError", NULL);
2738                              }
2739                            tmpmaps->name = zStrdup ("missingIndetifier");
2740                            tmpmaps->content =
2741                              createMap ((char *) cur1->name, (char *) val);
2742                            tmpmaps->next = NULL;
2743                          }
2744                        else
2745                          {
2746                            if (tmpmaps->content != NULL)
2747                              addToMap (tmpmaps->content, (char *) cur1->name,
2748                                        (char *) val);
2749                            else
2750                              tmpmaps->content =
2751                                createMap ((char *) cur1->name, (char *) val);
2752                          }
2753                        xmlFree (val);
2754                      }
2755                    else
2756                      if (xmlStrncasecmp
2757                          (cur1->name, BAD_CAST "Output",
2758                           xmlStrlen (cur1->name)) == 0)
2759                      {
2760              /**
2761               * Get every attribute from a Output node
2762               * mimeType, encoding, schema, uom, asReference
2763               */
2764                        const char *outs[5] =
2765                          { "mimeType", "encoding", "schema", "uom",
2766                          "asReference"
2767                        };
2768                        for (int l = 0; l < 5; l++)
2769                          {
2770#ifdef DEBUG
2771                            fprintf (stderr, "*** %s ***\t", outs[l]);
2772#endif
2773                            xmlChar *val =
2774                              xmlGetProp (cur1, BAD_CAST outs[l]);
2775                            if (val != NULL && strlen ((char *) val) > 0)
2776                              {
2777                                if (tmpmaps->content != NULL)
2778                                  addToMap (tmpmaps->content, outs[l],
2779                                            (char *) val);
2780                                else
2781                                  tmpmaps->content =
2782                                    createMap (outs[l], (char *) val);
2783                              }
2784#ifdef DEBUG
2785                            fprintf (stderr, "%s\n", val);
2786#endif
2787                            xmlFree (val);
2788                          }
2789                        xmlNodePtr cur2 = cur1->children;
2790                        while (cur2 != NULL && cur2->type != XML_ELEMENT_NODE)
2791                          cur2 = cur2->next;
2792                        while (cur2)
2793                          {
2794                /**
2795                 * Indentifier
2796                 */
2797                            if (xmlStrncasecmp
2798                                (cur2->name, BAD_CAST "Identifier",
2799                                 xmlStrlen (cur2->name)) == 0)
2800                              {
2801                                xmlChar *val = xmlNodeListGetString (doc,
2802                                                                     cur2->
2803                                                                     xmlChildrenNode,
2804                                                                     1);
2805                                if (tmpmaps == NULL)
2806                                  {
2807                                    tmpmaps = (maps *) malloc (MAPS_SIZE);
2808                                    if (tmpmaps == NULL)
2809                                      {
2810                                        return errorException (m,
2811                                                               _
2812                                                               ("Unable to allocate memory."),
2813                                                               "InternalError",
2814                                                               NULL);
2815                                      }
2816                                    tmpmaps->name = zStrdup ((char *) val);
2817                                    tmpmaps->content = NULL;
2818                                    tmpmaps->next = NULL;
2819                                  }
2820                                else
2821                                  {
2822                                    if (tmpmaps->name != NULL)
2823                                      free (tmpmaps->name);
2824                                    tmpmaps->name = zStrdup ((char *) val);;
2825                                  }
2826                                xmlFree (val);
2827                              }
2828                /**
2829                 * Title, Asbtract
2830                 */
2831                            else
2832                              if (xmlStrncasecmp
2833                                  (cur2->name, BAD_CAST "Title",
2834                                   xmlStrlen (cur2->name)) == 0
2835                                  || xmlStrncasecmp (cur2->name,
2836                                                     BAD_CAST "Abstract",
2837                                                     xmlStrlen (cur2->name))
2838                                  == 0)
2839                              {
2840                                xmlChar *val = xmlNodeListGetString (doc,
2841                                                                     cur2->
2842                                                                     xmlChildrenNode,
2843                                                                     1);
2844                                if (tmpmaps == NULL)
2845                                  {
2846                                    tmpmaps = (maps *) malloc (MAPS_SIZE);
2847                                    if (tmpmaps == NULL)
2848                                      {
2849                                        return errorException (m,
2850                                                               _
2851                                                               ("Unable to allocate memory."),
2852                                                               "InternalError",
2853                                                               NULL);
2854                                      }
2855                                    tmpmaps->name =
2856                                      zStrdup ("missingIndetifier");
2857                                    tmpmaps->content =
2858                                      createMap ((char *) cur2->name,
2859                                                 (char *) val);
2860                                    tmpmaps->next = NULL;
2861                                  }
2862                                else
2863                                  {
2864                                    if (tmpmaps->content != NULL)
2865                                      addToMap (tmpmaps->content,
2866                                                (char *) cur2->name,
2867                                                (char *) val);
2868                                    else
2869                                      tmpmaps->content =
2870                                        createMap ((char *) cur2->name,
2871                                                   (char *) val);
2872                                  }
2873                                xmlFree (val);
2874                              }
2875                            cur2 = cur2->next;
2876                            while (cur2 != NULL
2877                                   && cur2->type != XML_ELEMENT_NODE)
2878                              cur2 = cur2->next;
2879                          }
2880                      }
2881                    cur1 = cur1->next;
2882                    while (cur1 != NULL && cur1->type != XML_ELEMENT_NODE)
2883                      cur1 = cur1->next;
2884                  }
2885              }
2886            if (request_output_real_format == NULL)
2887              request_output_real_format = dupMaps (&tmpmaps);
2888            else
2889              addMapsToMaps (&request_output_real_format, tmpmaps);
2890            if (tmpmaps != NULL)
2891              {
2892                freeMaps (&tmpmaps);
2893                free (tmpmaps);
2894                tmpmaps = NULL;
2895              }
2896          }
2897      xmlXPathFreeObject (tmpsptr);
2898      xmlFreeDoc (doc);
2899      xmlCleanupParser ();
2900    }
2901
2902  runHttpRequests (&m, &request_input_real_format, &hInternet);
2903
2904  //  if(CHECK_INET_HANDLE(hInternet))
2905  InternetCloseHandle (&hInternet);
2906
2907#ifdef DEBUG
2908  fprintf (stderr, "\n%d\n", __LINE__);
2909  fflush (stderr);
2910  dumpMaps (request_input_real_format);
2911  dumpMaps (request_output_real_format);
2912  dumpMap (request_inputs);
2913  fprintf (stderr, "\n%d\n", __LINE__);
2914  fflush (stderr);
2915#endif
2916
2917  /**
2918   * Ensure that each requested arguments are present in the request
2919   * DataInputs and ResponseDocument / RawDataOutput
2920   */
2921  char *dfv = addDefaultValues (&request_input_real_format, s1->inputs, m, 0);
2922  maps *ptr = request_input_real_format;
2923  while (ptr != NULL)
2924    {
2925      map *tmp0 = getMap (ptr->content, "size");
2926      map *tmp1 = getMap (ptr->content, "maximumMegabytes");
2927      if (tmp1 != NULL && tmp0 != NULL)
2928        {
2929          float i = atof (tmp0->value) / 1048576.0;
2930          if (i >= atoi (tmp1->value))
2931            {
2932              char tmps[1024];
2933              map *tmpe = createMap ("code", "FileSizeExceeded");
2934              snprintf (tmps, 1024,
2935                        _
2936                        ("The <%s> parameter has a limited size (%sMB) defined in ZOO ServicesProvider configuration file but the reference you provided exceed this limitation (%fMB), please correct your query or the ZOO Configuration file."),
2937                        ptr->name, tmp1->value, i);
2938              addToMap (tmpe, "locator", ptr->name);
2939              addToMap (tmpe, "text", tmps);
2940              printExceptionReportResponse (m, tmpe);
2941              freeService (&s1);
2942              free (s1);
2943              freeMap (&tmpe);
2944              free (tmpe);
2945              freeMaps (&m);
2946              free (m);
2947              free (REQUEST);
2948              free (SERVICE_URL);
2949              freeMaps (&request_input_real_format);
2950              free (request_input_real_format);
2951              freeMaps (&request_output_real_format);
2952              free (request_output_real_format);
2953              freeMaps (&tmpmaps);
2954              free (tmpmaps);
2955              return 1;
2956            }
2957        }
2958      ptr = ptr->next;
2959    }
2960
2961  char *dfv1 =
2962    addDefaultValues (&request_output_real_format, s1->outputs, m, 1);
2963  if (strcmp (dfv1, "") != 0 || strcmp (dfv, "") != 0)
2964    {
2965      char tmps[1024];
2966      map *tmpe = createMap ("code", "MissingParameterValue");
2967      if (strcmp (dfv, "") != 0)
2968        {
2969          snprintf (tmps, 1024,
2970                    _
2971                    ("The <%s> argument was not specified in DataInputs but defined as requested in ZOO ServicesProvider configuration file, please correct your query or the ZOO Configuration file."),
2972                    dfv);
2973          addToMap (tmpe, "locator", dfv);
2974        }
2975      else if (strcmp (dfv1, "") != 0)
2976        {
2977          snprintf (tmps, 1024,
2978                    _
2979                    ("The <%s> argument was specified as Output identifier but not defined in the ZOO Configuration File. Please, correct your query or the ZOO Configuration File."),
2980                    dfv1);
2981          addToMap (tmpe, "locator", dfv1);
2982        }
2983      addToMap (tmpe, "text", tmps);
2984      printExceptionReportResponse (m, tmpe);
2985      freeService (&s1);
2986      free (s1);
2987      freeMap (&tmpe);
2988      free (tmpe);
2989      freeMaps (&m);
2990      free (m);
2991      free (REQUEST);
2992      free (SERVICE_URL);
2993      freeMaps (&request_input_real_format);
2994      free (request_input_real_format);
2995      freeMaps (&request_output_real_format);
2996      free (request_output_real_format);
2997      freeMaps (&tmpmaps);
2998      free (tmpmaps);
2999      return 1;
3000    }
3001  maps *tmpReqI = request_input_real_format;
3002  while (tmpReqI != NULL)
3003    {
3004      char name[1024];
3005      if (getMap (tmpReqI->content, "isFile") != NULL)
3006        {
3007          if (cgiFormFileName (tmpReqI->name, name, sizeof (name)) ==
3008              cgiFormSuccess)
3009            {
3010              int BufferLen = 1024;
3011              cgiFilePtr file;
3012              int targetFile;
3013              char storageNameOnServer[2048];
3014              char fileNameOnServer[64];
3015              char contentType[1024];
3016              char buffer[1024];
3017              char *tmpStr = NULL;
3018              int size;
3019              int got, t;
3020              map *path = getMapFromMaps (m, "main", "tmpPath");
3021              cgiFormFileSize (tmpReqI->name, &size);
3022              cgiFormFileContentType (tmpReqI->name, contentType,
3023                                      sizeof (contentType));
3024              if (cgiFormFileOpen (tmpReqI->name, &file) == cgiFormSuccess)
3025                {
3026                  t = -1;
3027                  while (1)
3028                    {
3029                      tmpStr = strstr (name + t + 1, "\\");
3030                      if (NULL == tmpStr)
3031                        tmpStr = strstr (name + t + 1, "/");
3032                      if (NULL != tmpStr)
3033                        t = (int) (tmpStr - name);
3034                      else
3035                        break;
3036                    }
3037                  strcpy (fileNameOnServer, name + t + 1);
3038
3039                  sprintf (storageNameOnServer, "%s/%s", path->value,
3040                           fileNameOnServer);
3041#ifdef DEBUG
3042                  fprintf (stderr, "Name on server %s\n",
3043                           storageNameOnServer);
3044                  fprintf (stderr, "fileNameOnServer: %s\n",
3045                           fileNameOnServer);
3046#endif
3047                  targetFile =
3048                    open (storageNameOnServer, O_RDWR | O_CREAT | O_TRUNC,
3049                          S_IRWXU | S_IRGRP | S_IROTH);
3050                  if (targetFile < 0)
3051                    {
3052#ifdef DEBUG
3053                      fprintf (stderr, "could not create the new file,%s\n",
3054                               fileNameOnServer);
3055#endif
3056                    }
3057                  else
3058                    {
3059                      while (cgiFormFileRead (file, buffer, BufferLen, &got)
3060                             == cgiFormSuccess)
3061                        {
3062                          if (got > 0)
3063                            write (targetFile, buffer, got);
3064                        }
3065                    }
3066                  addToMap (tmpReqI->content, "lref", storageNameOnServer);
3067                  cgiFormFileClose (file);
3068                  close (targetFile);
3069#ifdef DEBUG
3070                  fprintf (stderr, "File \"%s\" has been uploaded",
3071                           fileNameOnServer);
3072#endif
3073                }
3074            }
3075        }
3076      tmpReqI = tmpReqI->next;
3077    }
3078
3079  ensureDecodedBase64 (&request_input_real_format);
3080
3081#ifdef DEBUG
3082  fprintf (stderr, "REQUEST_INPUTS\n");
3083  dumpMaps (request_input_real_format);
3084  fprintf (stderr, "REQUEST_OUTPUTS\n");
3085  dumpMaps (request_output_real_format);
3086#endif
3087
3088  maps *curs = getMaps (m, "env");
3089  if (curs != NULL)
3090    {
3091      map *mapcs = curs->content;
3092      while (mapcs != NULLMAP)
3093        {
3094#ifndef WIN32
3095          setenv (mapcs->name, mapcs->value, 1);
3096#else
3097#ifdef DEBUG
3098          fprintf (stderr, "[ZOO: setenv (%s=%s)]\n", mapcs->name,
3099                   mapcs->value);
3100#endif
3101          if (mapcs->value[strlen (mapcs->value) - 2] == '\r')
3102            {
3103#ifdef DEBUG
3104              fprintf (stderr, "[ZOO: Env var finish with \r]\n");
3105#endif
3106              mapcs->value[strlen (mapcs->value) - 1] = 0;
3107            }
3108#ifdef DEBUG
3109          if (SetEnvironmentVariable (mapcs->name, mapcs->value) == 0)
3110            {
3111              fflush (stderr);
3112              fprintf (stderr, "setting variable... %s\n", "OK");
3113            }
3114          else
3115            {
3116              fflush (stderr);
3117              fprintf (stderr, "setting variable... %s\n", "OK");
3118            }
3119#else
3120
3121
3122          SetEnvironmentVariable (mapcs->name, mapcs->value);
3123#endif
3124          char *toto =
3125            (char *)
3126            malloc ((strlen (mapcs->name) + strlen (mapcs->value) +
3127                     2) * sizeof (char));
3128          sprintf (toto, "%s=%s", mapcs->name, mapcs->value);
3129          putenv (toto);
3130#ifdef DEBUG
3131          fflush (stderr);
3132#endif
3133#endif
3134#ifdef DEBUG
3135          fprintf (stderr, "[ZOO: setenv (%s=%s)]\n", mapcs->name,
3136                   mapcs->value);
3137          fflush (stderr);
3138#endif
3139          mapcs = mapcs->next;
3140        }
3141    }
3142
3143#ifdef DEBUG
3144  dumpMap (request_inputs);
3145#endif
3146
3147  /**
3148   * Need to check if we need to fork to load a status enabled
3149   */
3150  r_inputs = NULL;
3151  map *store = getMap (request_inputs, "storeExecuteResponse");
3152  map *status = getMap (request_inputs, "status");
3153  /**
3154   * 05-007r7 WPS 1.0.0 page 57 :
3155   * 'If status="true" and storeExecuteResponse is "false" then the service
3156   * shall raise an exception.'
3157   */
3158  if (status != NULL && strcmp (status->value, "true") == 0 &&
3159      store != NULL && strcmp (store->value, "false") == 0)
3160    {
3161      errorException (m,
3162                      _
3163                      ("Status cannot be set to true with storeExecuteResponse to false. Please, modify your request parameters."),
3164                      "InvalidParameterValue", "storeExecuteResponse");
3165      freeService (&s1);
3166      free (s1);
3167      freeMaps (&m);
3168      free (m);
3169
3170      freeMaps (&request_input_real_format);
3171      free (request_input_real_format);
3172
3173      freeMaps (&request_output_real_format);
3174      free (request_output_real_format);
3175
3176      free (REQUEST);
3177      free (SERVICE_URL);
3178      return 1;
3179    }
3180  r_inputs = getMap (request_inputs, "storeExecuteResponse");
3181  int eres = SERVICE_STARTED;
3182  int cpid = getpid ();
3183
3184  /**
3185   * Initialize the specific [lenv] section which contains runtime variables:
3186   *
3187   *  - usid : it is an unique identification number
3188   *  - sid : it is the process idenfitication number (OS)
3189   *  - status : value between 0 and 100 to express the  completude of
3190   * the operations of the running service
3191   *  - message : is a string where you can store error messages, in case
3192   * service is failing, or o provide details on the ongoing operation.
3193   *  - cwd : is the current working directory
3194   *  - soap : is a boolean value, true if the request was contained in a SOAP
3195   * Envelop
3196   *  - sessid : string storing the session identifier (only when cookie is
3197   * used)
3198   *  - cgiSid : only defined on Window platforms (for being able to identify
3199   * the created process)
3200   *
3201   */
3202  maps *_tmpMaps = (maps *) malloc (MAPS_SIZE);
3203  _tmpMaps->name = zStrdup ("lenv");
3204  char tmpBuff[100];
3205  int lid = getShmLockId (NULL, 1);
3206  lockShm (lid);
3207  struct ztimeval tp;
3208  if (zGettimeofday (&tp, NULL) == 0)
3209    sprintf (tmpBuff, "%i", (cpid + ((int) tp.tv_sec + (int) tp.tv_usec)));
3210  else
3211    sprintf (tmpBuff, "%i", (cpid + (int) time (NULL)));
3212  unlockShm (lid);
3213  removeShmLock (NULL, 1);
3214  _tmpMaps->content = createMap ("usid", tmpBuff);
3215  _tmpMaps->next = NULL;
3216  sprintf (tmpBuff, "%i", cpid);
3217  addToMap (_tmpMaps->content, "sid", tmpBuff);
3218  addToMap (_tmpMaps->content, "status", "0");
3219  addToMap (_tmpMaps->content, "cwd", ntmp);
3220  addToMap (_tmpMaps->content, "message", _("No message provided"));
3221  map *ltmp = getMap (request_inputs, "soap");
3222  if (ltmp != NULL)
3223    addToMap (_tmpMaps->content, "soap", ltmp->value);
3224  else
3225    addToMap (_tmpMaps->content, "soap", "false");
3226  if (cgiCookie != NULL && strlen (cgiCookie) > 0)
3227    {
3228      int hasValidCookie = -1;
3229      char *tcook = zStrdup (cgiCookie);
3230      char *tmp = NULL;
3231      map *testing = getMapFromMaps (m, "main", "cookiePrefix");
3232      if (testing == NULL)
3233        {
3234          tmp = zStrdup ("ID=");
3235        }
3236      else
3237        {
3238          tmp =
3239            (char *) malloc ((strlen (testing->value) + 2) * sizeof (char));
3240          sprintf (tmp, "%s=", testing->value);
3241        }
3242      if (strstr (cgiCookie, ";") != NULL)
3243        {
3244          char *token, *saveptr;
3245          token = strtok_r (cgiCookie, ";", &saveptr);
3246          while (token != NULL)
3247            {
3248              if (strcasestr (token, tmp) != NULL)
3249                {
3250                  if (tcook != NULL)
3251                    free (tcook);
3252                  tcook = zStrdup (token);
3253                  hasValidCookie = 1;
3254                }
3255              token = strtok_r (NULL, ";", &saveptr);
3256            }
3257        }
3258      else
3259        {
3260          if (strstr (cgiCookie, "=") != NULL
3261              && strcasestr (cgiCookie, tmp) != NULL)
3262            {
3263              tcook = zStrdup (cgiCookie);
3264              hasValidCookie = 1;
3265            }
3266          if (tmp != NULL)
3267            {
3268              free (tmp);
3269            }
3270        }
3271      if (hasValidCookie > 0)
3272        {
3273          addToMap (_tmpMaps->content, "sessid", strstr (tcook, "=") + 1);
3274          char session_file_path[1024];
3275          map *tmpPath = getMapFromMaps (m, "main", "sessPath");
3276          if (tmpPath == NULL)
3277            tmpPath = getMapFromMaps (m, "main", "tmpPath");
3278          char *tmp1 = strtok (tcook, ";");
3279          if (tmp1 != NULL)
3280            sprintf (session_file_path, "%s/sess_%s.cfg", tmpPath->value,
3281                     strstr (tmp1, "=") + 1);
3282          else
3283            sprintf (session_file_path, "%s/sess_%s.cfg", tmpPath->value,
3284                     strstr (cgiCookie, "=") + 1);
3285          free (tcook);
3286          maps *tmpSess = (maps *) malloc (MAPS_SIZE);
3287          struct stat file_status;
3288          int istat = stat (session_file_path, &file_status);
3289          if (istat == 0 && file_status.st_size > 0)
3290            {
3291              conf_read (session_file_path, tmpSess);
3292              addMapsToMaps (&m, tmpSess);
3293              freeMaps (&tmpSess);
3294              free (tmpSess);
3295            }
3296        }
3297    }
3298  addMapsToMaps (&m, _tmpMaps);
3299  freeMaps (&_tmpMaps);
3300  free (_tmpMaps);
3301
3302#ifdef DEBUG
3303  dumpMap (request_inputs);
3304#endif
3305#ifdef WIN32
3306  char *cgiSidL = NULL;
3307  if (getenv ("CGISID") != NULL)
3308    addToMap (request_inputs, "cgiSid", getenv ("CGISID"));
3309  map *test1 = getMap (request_inputs, "cgiSid");
3310  if (test1 != NULL)
3311    {
3312      cgiSid = test1->value;
3313      addToMap (request_inputs, "storeExecuteResponse", "true");
3314      addToMap (request_inputs, "status", "true");
3315      setMapInMaps (m, "lenv", "sid", test1->value);
3316      status = getMap (request_inputs, "status");
3317    }
3318#endif
3319  char *fbkp, *fbkp1;
3320  FILE *f0, *f1;
3321  if (status != NULL)
3322    if (strcasecmp (status->value, "false") == 0)
3323      status = NULLMAP;
3324  if (status == NULLMAP)
3325    {
3326      loadServiceAndRun (&m, s1, request_inputs, &request_input_real_format,
3327                         &request_output_real_format, &eres);
3328    }
3329  else
3330    {
3331      int pid;
3332#ifdef DEBUG
3333      fprintf (stderr, "\nPID : %d\n", cpid);
3334#endif
3335
3336#ifndef WIN32
3337      pid = fork ();
3338#else
3339      if (cgiSid == NULL)
3340        {
3341          createProcess (m, request_inputs, s1, NULL, cpid,
3342                         request_input_real_format,
3343                         request_output_real_format);
3344          pid = cpid;
3345        }
3346      else
3347        {
3348          pid = 0;
3349          cpid = atoi (cgiSid);
3350        }
3351#endif
3352      if (pid > 0)
3353        {
3354      /**
3355       * dady :
3356       * set status to SERVICE_ACCEPTED
3357       */
3358#ifdef DEBUG
3359          fprintf (stderr, "father pid continue (origin %d) %d ...\n", cpid,
3360                   getpid ());
3361#endif
3362          eres = SERVICE_ACCEPTED;
3363        }
3364      else if (pid == 0)
3365        {
3366      /**
3367       * son : have to close the stdout, stdin and stderr to let the parent
3368       * process answer to http client.
3369       */
3370#ifndef WIN32
3371          zSleep (1);
3372#endif
3373          r_inputs = getMapFromMaps (m, "lenv", "usid");
3374          int cpid = atoi (r_inputs->value);
3375          r_inputs = getMapFromMaps (m, "main", "tmpPath");
3376          map *r_inputs1 = getMap (s1->content, "ServiceProvider");
3377          fbkp =
3378            (char *)
3379            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
3380                     1024) * sizeof (char));
3381          sprintf (fbkp, "%s/%s_%d.xml", r_inputs->value, r_inputs1->value,
3382                   cpid);
3383          char *flog =
3384            (char *)
3385            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
3386                     1024) * sizeof (char));
3387          sprintf (flog, "%s/%s_%d_error.log", r_inputs->value,
3388                   r_inputs1->value, cpid);
3389#ifdef DEBUG
3390          fprintf (stderr, "RUN IN BACKGROUND MODE \n");
3391          fprintf (stderr, "son pid continue (origin %d) %d ...\n", cpid,
3392                   getpid ());
3393          fprintf (stderr, "\nFILE TO STORE DATA %s\n", r_inputs->value);
3394#endif
3395          freopen (flog, "w+", stderr);
3396          semid lid = getShmLockId (m, 1);
3397          fflush (stderr);
3398          if (lid < 0)
3399            {
3400              fprintf (stderr, "ERROR %s %d\n", __FILE__, __LINE__);
3401              fflush (stderr);
3402              return -1;
3403            }
3404          else
3405            {
3406              if (lockShm (lid) < 0)
3407                {
3408                  fprintf (stderr, "ERROR %s %d\n", __FILE__, __LINE__);
3409                  fflush (stderr);
3410                  return -1;
3411                }
3412              fflush (stderr);
3413            }
3414          f0 = freopen (fbkp, "w+", stdout);
3415          rewind (stdout);
3416#ifndef WIN32
3417          fclose (stdin);
3418#endif
3419          free (flog);
3420      /**
3421       * set status to SERVICE_STARTED and flush stdout to ensure full
3422       * content was outputed (the file used to store the ResponseDocument).
3423       * The rewind stdout to restart writing from the bgining of the file,
3424       * this way the data will be updated at the end of the process run.
3425       */
3426          printProcessResponse (m, request_inputs, cpid, s1, r_inputs1->value,
3427                                SERVICE_STARTED, request_input_real_format,
3428                                request_output_real_format);
3429          fflush (stdout);
3430          unlockShm (lid);
3431          fflush (stderr);
3432          fbkp1 =
3433            (char *)
3434            malloc ((strlen (r_inputs->value) + strlen (r_inputs1->value) +
3435                     1024) * sizeof (char));
3436          sprintf (fbkp1, "%s/%s_final_%d.xml", r_inputs->value,
3437                   r_inputs1->value, cpid);
3438          f1 = freopen (fbkp1, "w+", stdout);
3439          loadServiceAndRun (&m, s1, request_inputs,
3440                             &request_input_real_format,
3441                             &request_output_real_format, &eres);
3442        }
3443      else
3444        {
3445      /**
3446       * error server don't accept the process need to output a valid
3447       * error response here !!!
3448       */
3449          eres = -1;
3450          errorException (m, _("Unable to run the child process properly"),
3451                          "InternalError", NULL);
3452        }
3453    }
3454
3455#ifdef DEBUG
3456  dumpMaps (request_output_real_format);
3457#endif
3458  if (eres != -1)
3459    outputResponse (s1, request_input_real_format,
3460                    request_output_real_format, request_inputs,
3461                    cpid, m, eres);
3462  fflush (stdout);
3463  /**
3464   * Ensure that if error occurs when freeing memory, no signal will return
3465   * an ExceptionReport document as the result was already returned to the
3466   * client.
3467   */
3468#ifndef USE_GDB
3469  signal (SIGSEGV, donothing);
3470  signal (SIGTERM, donothing);
3471  signal (SIGINT, donothing);
3472  signal (SIGILL, donothing);
3473  signal (SIGFPE, donothing);
3474  signal (SIGABRT, donothing);
3475#endif
3476  if (((int) getpid ()) != cpid || cgiSid != NULL)
3477    {
3478      fclose (stdout);
3479      fclose (stderr);
3480    /**
3481     * Dump back the final file fbkp1 to fbkp
3482     */
3483      fclose (f0);
3484      fclose (f1);
3485      FILE *f2 = fopen (fbkp1, "rb");
3486      semid lid = getShmLockId (m, 1);
3487      if (lid < 0)
3488        return -1;
3489      lockShm (lid);
3490      FILE *f3 = fopen (fbkp, "wb+");
3491      free (fbkp);
3492      fseek (f2, 0, SEEK_END);
3493      long flen = ftell (f2);
3494      fseek (f2, 0, SEEK_SET);
3495      char *tmps1 = (char *) malloc ((flen + 1) * sizeof (char));
3496      fread (tmps1, flen, 1, f2);
3497      fwrite (tmps1, 1, flen, f3);
3498      fclose (f2);
3499      fclose (f3);
3500      unlockShm (lid);
3501      unlink (fbkp1);
3502      free (fbkp1);
3503      free (tmps1);
3504      unhandleStatus (m);
3505    }
3506
3507  freeService (&s1);
3508  free (s1);
3509  freeMaps (&m);
3510  free (m);
3511
3512  freeMaps (&request_input_real_format);
3513  free (request_input_real_format);
3514
3515  freeMaps (&request_output_real_format);
3516  free (request_output_real_format);
3517
3518  free (REQUEST);
3519  free (SERVICE_URL);
3520#ifdef DEBUG
3521  fprintf (stderr, "Processed response \n");
3522  fflush (stdout);
3523  fflush (stderr);
3524#endif
3525
3526  if (((int) getpid ()) != cpid || cgiSid != NULL)
3527    {
3528      exit (0);
3529    }
3530
3531  return 0;
3532}
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png