1 // This is core/vpl/os_unix/vpl.cxx
2 // Include system headers for UNIX-like operating system :
3 #undef _XOPEN_SOURCE
4 #define _XOPEN_SOURCE 1 // necessary on alpha
5 #undef _XOPEN_SOURCE_EXTENDED
6 #define _XOPEN_SOURCE_EXTENDED 1 // usleep is not declared
7 #include <cstdlib>
8 #include <cstring>
9 extern "C"
10 {
11 #include <unistd.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 }
15 #include "vxl_config.h" // for VXL_UNISTD_*
16 
17 char *
vpl_getcwd(char * buf,std::size_t buf_size)18 vpl_getcwd(char * buf, std::size_t buf_size)
19 {
20   return getcwd(buf, buf_size);
21 }
22 
23 int
vpl_mkdir(const char * dir,unsigned short mode)24 vpl_mkdir(const char * dir, unsigned short mode)
25 {
26   return mkdir(dir, (mode_t)mode);
27 }
28 
29 int
vpl_rmdir(const char * dir)30 vpl_rmdir(const char * dir)
31 {
32   return rmdir(dir);
33 }
34 
35 int
vpl_chdir(const char * dir)36 vpl_chdir(const char * dir)
37 {
38   return chdir(dir);
39 }
40 
41 int
vpl_unlink(const char * file)42 vpl_unlink(const char * file)
43 {
44   return unlink(file);
45 }
46 
47 unsigned int
vpl_sleep(unsigned int t)48 vpl_sleep(unsigned int t)
49 {
50   return sleep(t);
51 }
52 
53 int
vpl_usleep(unsigned int t)54 vpl_usleep(unsigned int t)
55 {
56   // some implementations require argument to usleep < 1000000 :
57   if (t > 1000000)
58     sleep(t / 1000000);
59   t %= 1000000;
60 #if VXL_UNISTD_HAS_USLEEP
61 #  if VXL_UNISTD_USLEEP_IS_VOID
62   usleep(t);
63   return 0;
64 #  else
65   return usleep(t);
66 #  endif
67 #else
68   return 0;
69 #endif
70 }
71 
72 unsigned
vpl_getpid()73 vpl_getpid()
74 {
75 #if VXL_UNISTD_HAS_GETPID
76   return getpid();
77 #else
78   return 0;
79 #endif
80 }
81 
82 int
vpl_putenv(const char * envvar)83 vpl_putenv(const char * envvar)
84 {
85   char * storage_space = strdup(envvar); // This causes a memory leak
86                                          // but this can't be helped
87   // Why copy the string? putenv is meant to take a const char* of the
88   // form "name=value". Also, putenv is neither ANSI C nor ANSI C++, but
89   // is often present in stdlib on most Unix-like systems. -- AGAP.
90   // But on some platforms (Linux), putenv "captures" the string. -- AGAP.
91 
92   return putenv(storage_space);
93 }
94 
95 int
vpl_gethostname(char * name,size_t len)96 vpl_gethostname(char * name, size_t len)
97 {
98 #if VXL_UNISTD_HAS_GETHOSTNAME
99   return gethostname(name, len);
100 #else
101   if (len)
102     *name = 0;
103   return -1;
104 #endif
105 }
106