3 // Author : Chris Koeritz
5 // Copyright (c) 1994-$now By Author. This program is free software; you can
6 // redistribute it and/or modify it under the terms of the GNU General Public
7 // License as published by the Free Software Foundation:
8 // http://www.gnu.org/licenses/gpl.html
9 // or under the terms of the GNU Library license:
10 // http://www.gnu.org/licenses/lgpl.html
11 // at your preference. Those licenses describe your legal rights to this
12 // software, and no other rights or warranties apply.
13 // Please send updates for this code to: fred@gruntose.com -- Thanks, fred.
16 #include "environment.h"
19 #include <sys/types.h>
22 #include <sys/times.h>
25 #define _WINSOCKAPI_ // make windows.h happy about winsock.
28 // #define FD_SETSIZE 1000
29 // if you don't set this, you can only select on a default of 64 sockets.
37 astring environment::TMP()
39 const static astring TMP_VARIABLE_NAME("TMP");
40 astring to_return = get(TMP_VARIABLE_NAME);
42 // they did not see fit to set this in the environment. let's make something up.
44 // windows default does not necessarily exist.
47 // most reasonable OSes have a /tmp directory.
50 if (!!to_return) set("TMP", to_return);
55 astring environment::get(const astring &variable_name)
58 char *value = getenv(variable_name.upper().observe());
59 // dos & os/2 require upper case for the name, so we just do it that way.
61 char *value = getenv(variable_name.observe());
62 // reasonable OSes support mixed-case environment variables.
66 to_return = astring(value);
70 bool environment::set(const astring &variable_name, const astring &value)
74 astring assignment = variable_name + "=" + value;
75 ret = _putenv(assignment.s());
77 ret = setenv(variable_name.s(), value.s(), true);
82 basis::un_int environment::system_uptime()
87 static clock_t __ctps = sysconf(_SC_CLK_TCK); // clock ticks per second.
88 static const double __multiplier = 1000.0 / double(__ctps);
89 // the multiplier gives us our full range for the tick counter.
91 // read uptime info from the OS.
93 basis::un_int real_ticks = times(&uptime);
95 // now turn this into the number of milliseconds.
96 double ticks_up = (double)real_ticks;
97 ticks_up = ticks_up * __multiplier; // convert to time here.
99 // we use the previous version of this calculation, which expected a basis::u_int
100 // to double conversion to provide a modulo operation rather than just leaving
101 // the basis::un_int at its maximum value (2^32-1). however, that expectation is not
102 // guaranteed on some platforms (e.g., ARM processor with floating point
103 // emulation) and thus it becomes a bug around 49 days and 17 hours into
104 // OS uptime because the value gets stuck at 2^32-1 and never rolls over.
105 return basis::un_int(ticks_up);