ns-3 Direct Code Execution
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dce-stdlib.cc
Go to the documentation of this file.
1 #include "dce-stdlib.h"
2 #include "process.h"
3 #include "dce-manager.h"
4 #include "utils.h"
5 #include "unix-fd.h"
6 #include "unix-file-fd.h"
7 #include "file-usage.h"
8 #include "ns3/log.h"
9 #include <errno.h>
10 #include <limits.h>
11 
12 
13 NS_LOG_COMPONENT_DEFINE ("SimuStdlib");
14 
15 using namespace ns3;
16 
17 long int dce_strtol (const char *nptr, char **endptr, int base)
18 {
19  Thread *current = Current ();
20  NS_LOG_FUNCTION (current << UtilsGetNodeId () << nptr << endptr << base);
21  NS_ASSERT (current != 0);
22  long int retval = strtol (nptr, endptr, base);
23  if (retval == LONG_MAX || retval == LONG_MIN)
24  {
25  current->err = errno;
26  }
27  return retval;
28 }
29 long long int dce_strtoll (const char *nptr, char **endptr, int base)
30 {
31  Thread *current = Current ();
32  NS_LOG_FUNCTION (current << UtilsGetNodeId () << nptr << endptr << base);
33  NS_ASSERT (current != 0);
34  long long int retval = strtoll (nptr, endptr, base);
35  if (retval == LLONG_MAX || retval == LLONG_MIN)
36  {
37  current->err = errno;
38  }
39  return retval;
40 }
41 
42 unsigned long int dce_strtoul (const char *nptr, char **endptr, int base)
43 {
44  Thread *current = Current ();
45  NS_LOG_FUNCTION (current << UtilsGetNodeId () << nptr << endptr << base);
46  NS_ASSERT (current != 0);
47  unsigned long int retval = strtol (nptr, endptr, base);
48  if (retval == ULONG_MAX)
49  {
50  current->err = errno;
51  }
52  return retval;
53 }
54 unsigned long long int dce_strtoull (const char *nptr, char **endptr, int base)
55 {
56  Thread *current = Current ();
57  NS_LOG_FUNCTION (current << UtilsGetNodeId () << nptr << endptr << base);
58  NS_ASSERT (current != 0);
59  unsigned long long int retval = strtoull (nptr, endptr, base);
60  if (retval == ULLONG_MAX)
61  {
62  current->err = errno;
63  }
64  return retval;
65 }
66 double dce_strtod (const char *nptr, char **endptr)
67 {
68  Thread *current = Current ();
69  NS_LOG_FUNCTION (current << UtilsGetNodeId () << nptr << endptr);
70  NS_ASSERT (current != 0);
71  double retval = strtod (nptr, endptr);
72  if (retval == 0.0)
73  {
74  current->err = errno;
75  }
76  return retval;
77 }
78 
79 int dce_atexit (void (*function)(void))
80 {
81  NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << function);
82  NS_ASSERT (Current () != 0);
83  Thread *current = Current ();
84  struct AtExitHandler handler;
85  handler.type = AtExitHandler::NORMAL;
86  handler.value.normal = function;
87  current->process->atExitHandlers.push_back (handler);
88  return 0;
89 }
90 
91 // XXX: run function to runall atexit functions
92 int dce_mkstemp (char *temp)
93 {
94  Thread *current = Current ();
95  NS_LOG_FUNCTION (current << UtilsGetNodeId ());
96  NS_ASSERT (current != 0);
97 
98  std::string fullpath = UtilsGetRealFilePath (temp);
99  NS_LOG_FUNCTION (fullpath);
100  int realFd = mkstemp ((char *)fullpath.c_str ());
101  if (realFd == -1)
102  {
103  current->err = errno;
104  return -1;
105  }
106 
107  int fd = UtilsAllocateFd ();
108  if (fd == -1)
109  {
110  current->err = EMFILE;
111  return -1;
112  }
113  UnixFd *unixFd = 0;
114  unixFd = new UnixFileFd (realFd);
115  unixFd->IncFdCount ();
116  current->process->openFiles[fd] = new FileUsage (fd, unixFd);
117  return fd;
118 }
119 
120 int dce_rename (const char *oldpath, const char *newpath)
121 {
122  Thread *current = Current ();
123  NS_LOG_FUNCTION (current << UtilsGetNodeId ());
124  NS_ASSERT (current != 0);
125 
126  std::string oldFullpath = UtilsGetRealFilePath (oldpath);
127  std::string newFullpath = UtilsGetRealFilePath (newpath);
128 
129  int ret = rename (oldFullpath.c_str (), newFullpath.c_str ());
130  if (ret == -1)
131  {
132  current->err = errno;
133  return -1;
134  }
135  return 0;
136 }