1/***************************************************************************
2 *                                  _   _ ____  _
3 *  Project                     ___| | | |  _ \| |
4 *                             / __| | | | |_) | |
5 *                            | (__| |_| |  _ <| |___
6 *                             \___|\___/|_| \_\_____|
7 *
8 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
9 *
10 * This software is licensed as described in the file COPYING, which
11 * you should have received as part of this distribution. The terms
12 * are also available at http://curl.haxx.se/docs/copyright.html.
13 *
14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 * copies of the Software, and permit persons to whom the Software is
16 * furnished to do so, under the terms of the COPYING file.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ***************************************************************************/
22
23#include "setup.h"
24
25#ifdef USE_ENVIRONMENT
26
27#include <curl/curl.h>
28#include "writeenv.h"
29
30#ifdef __riscos__
31#include <kernel.h>
32#endif
33
34#define _MPRINTF_REPLACE /* use our functions only */
35#include <curl/mprintf.h>
36
37#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG)
38#include "memdebug.h"
39#endif
40
41static const struct
42{
43  const char * name;
44  CURLINFO id;
45  enum {
46    writeenv_NONE,
47    writeenv_DOUBLE,
48    writeenv_LONG,
49    writeenv_STRING
50  } type;
51} variables[14] =
52{
53  {"curl_url_effective", CURLINFO_EFFECTIVE_URL, writeenv_STRING},
54  {"curl_http_code", CURLINFO_RESPONSE_CODE, writeenv_LONG},
55  {"curl_time_total", CURLINFO_TOTAL_TIME, writeenv_DOUBLE},
56  {"curl_time_namelookup", CURLINFO_NAMELOOKUP_TIME, writeenv_DOUBLE},
57  {"curl_time_connect", CURLINFO_CONNECT_TIME, writeenv_DOUBLE},
58  {"curl_time_pretransfer", CURLINFO_PRETRANSFER_TIME, writeenv_DOUBLE},
59  {"curl_time_starttransfer", CURLINFO_STARTTRANSFER_TIME, writeenv_DOUBLE},
60  {"curl_size_header", CURLINFO_HEADER_SIZE, writeenv_LONG},
61  {"curl_size_request", CURLINFO_REQUEST_SIZE, writeenv_LONG},
62  {"curl_size_download", CURLINFO_SIZE_DOWNLOAD, writeenv_DOUBLE},
63  {"curl_size_upload", CURLINFO_SIZE_UPLOAD, writeenv_DOUBLE},
64  {"curl_speed_download", CURLINFO_SPEED_DOWNLOAD, writeenv_DOUBLE},
65  {"curl_speed_upload", CURLINFO_SPEED_UPLOAD, writeenv_DOUBLE},
66  {NULL, 0, writeenv_NONE}
67 };
68
69static void internalSetEnv(const char * name, char * value)
70{
71  /* Add your OS-specific code here. */
72#ifdef __riscos__
73  _kernel_setenv(name, value);
74#elif defined (CURLDEBUG)
75  curl_memlog("ENV %s = %s\n", name, value);
76#endif
77  return;
78}
79
80void ourWriteEnv(CURL *curl)
81{
82  unsigned int i;
83  char *string, numtext[10];
84  long longinfo;
85  double doubleinfo;
86
87  for(i=0; variables[i].name; i++) {
88    switch (variables[i].type) {
89    case writeenv_STRING:
90      if(curl_easy_getinfo(curl, variables[i].id, &string) == CURLE_OK)
91        internalSetEnv(variables[i].name, string);
92      else
93        internalSetEnv(variables[i].name, NULL);
94      break;
95
96    case writeenv_LONG:
97      if(curl_easy_getinfo(curl, variables[i].id, &longinfo) == CURLE_OK) {
98        curl_msprintf(numtext, "%5ld", longinfo);
99        internalSetEnv(variables[i].name, numtext);
100      }
101      else
102        internalSetEnv(variables[i].name, NULL);
103      break;
104    case writeenv_DOUBLE:
105      if(curl_easy_getinfo(curl, variables[i].id, &doubleinfo) == CURLE_OK) {
106        curl_msprintf(numtext, "%6.2f", doubleinfo);
107        internalSetEnv(variables[i].name, numtext);
108      }
109      else
110        internalSetEnv(variables[i].name, NULL);
111      break;
112    default:
113      break;
114    }
115  }
116
117  return;
118}
119
120#endif
121