26 #include <sys/ioctl.h>
31 #include "ns3/simulator.h"
32 #include "ns3/names.h"
33 #include "ns3/random-variable.h"
34 #include "ns3/ipv4-l3-protocol.h"
49 return current->process->pid;
54 return current->process->ppid;
59 return current->process->ruid;
64 return current->process->euid;
69 return current->process->euid == 0;
74 return current->process->egid == 0;
80 || current->process->euid == uid
81 || current->process->ruid == uid
82 || current->process->suid == uid;
88 || current->process->egid == gid
89 || current->process->rgid == gid
90 || current->process->sgid == gid;
102 if (euid != (uid_t)-1
105 current->err = EPERM;
108 if (suid != (uid_t)-1
111 current->err = EPERM;
114 if (ruid != (uid_t)-1)
116 current->process->ruid = ruid;
118 if (euid != (uid_t)-1)
120 current->process->euid = euid;
122 if (suid != (uid_t)-1)
124 current->process->suid = suid;
132 if (rgid != (gid_t)-1
135 current->err = EPERM;
138 if (egid != (gid_t)-1
141 current->err = EPERM;
144 if (sgid != (gid_t)-1
147 current->err = EPERM;
150 if (rgid != (gid_t)-1)
152 current->process->rgid = rgid;
154 if (egid != (gid_t)-1)
156 current->process->egid = egid;
158 if (sgid != (gid_t)-1)
160 current->process->sgid = sgid;
190 current->process->ruid = uid;
191 if (current->process->euid == 0)
193 current->process->euid = uid;
194 current->process->suid = uid;
200 current->err = EPERM;
209 current->process->rgid = gid;
210 if (current->process->egid == 0)
212 current->process->egid = gid;
213 current->process->sgid = gid;
219 current->err = EPERM;
228 NS_ASSERT (current != 0);
236 NS_ASSERT (current != 0);
249 current->
err = ESRCH;
261 NS_LOG_FUNCTION (current);
290 NS_ASSERT (current != 0);
293 current->
err = EFAULT;
296 if ((req->tv_sec < 0) || (req->tv_nsec < 0) || (req->tv_nsec > 999999999))
298 current->
err = EINVAL;
303 if (remTime == Seconds (0.0))
309 current->
err = EINTR;
328 unsigned short int *
dce_seed48 (
unsigned short int seed16v[3])
422 char *dst, socklen_t cnt)
426 const char *retval = inet_ntop (af, src, dst, cnt);
433 int dce_getopt (
int argc,
char *
const argv[],
const char *optstring)
443 char *optargsaved =
optarg;
451 int retval = getopt (argc, argv, optstring);
463 const struct option *longopts,
int *longindex)
466 longopts << longindex);
474 char *optargsaved =
optarg;
482 int retval = getopt_long (argc, argv, optstring, longopts, longindex);
497 NS_ASSERT (current != 0);
516 NS_ASSERT (current != 0);
519 current->
err = EFAULT;
523 NS_ASSERT (which == ITIMER_REAL);
529 struct itimerval *ovalue)
532 NS_LOG_FUNCTION (current <<
UtilsGetNodeId () << which << value << ovalue);
533 NS_ASSERT (current != 0);
536 current->
err = EINVAL;
540 NS_ASSERT (which == ITIMER_REAL);
549 if (value->it_value.tv_sec == 0
550 && value->it_value.tv_usec == 0)
564 NS_ASSERT (current != 0);
566 uint32_t cwd_size = current->
process->
cwd.size ();
567 if ((buf != 0 && size < cwd_size + 1)
568 || (buf == 0 && size != 0 && size < cwd_size + 1))
570 current->
err = ERANGE;
588 const char *source = current->
process->
cwd.c_str ();
589 strcpy (buf, source);
597 uint32_t cwd_size = current->
process->
cwd.size ();
598 if (PATH_MAX < cwd_size + 1)
600 current->
err = ENAMETOOLONG;
603 const char *source = current->
process->
cwd.c_str ();
604 strcpy (buf, source);
618 NS_ASSERT (current != 0);
623 retval = ::open (newCwd.c_str (), O_DIRECTORY | O_RDONLY);
637 NS_ASSERT (current != 0);
642 current->
err = EBADF;
647 if (0 == p.length ())
649 current->
err = EBADF;
659 Ptr<SocketFdFactory> factory = 0;
662 if (factory->GetInstanceTypeId () == TypeId::LookupByName (
"ns3::LinuxSocketFdFactory"))
671 strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
672 if (
dce_ioctl (fd, SIOCGIFINDEX, (
char *)&ifr) < 0)
677 return ifr.ifr_ifindex;
683 Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
685 for (uint32_t i = 0; i < node->GetNDevices (); ++i)
687 Ptr<NetDevice> dev = node->GetDevice (i);
688 if (ifname == Names::FindName (dev))
690 index = ipv4->GetInterfaceForDevice (dev);
706 ifr.ifr_ifindex = ifindex;
707 if (
dce_ioctl (fd, SIOCGIFNAME, (
char *)&ifr) < 0)
711 return strncpy (ifname, ifr.ifr_name, IFNAMSIZ);
716 NS_LOG_FUNCTION (thread);
718 return manager->
Clone (thread);
726 std::string fileName =
SearchExecFile (path, getuid (), getgid (), &(thread->
err));
728 if (0 == fileName.length ())
744 std::string fileName =
SearchExecFile (path, getuid (), getgid (), &(thread->
err));
746 if (0 == fileName.length ())
759 p = va_arg (cp,
char *);
764 char const** argv = (
char const **)
dce_malloc (nb *
sizeof (
char *));
771 argv[nb++] = p = va_arg (ap,
char *);
781 int dce_execve (
const char *path,
char *
const argv[],
char *
const envp[])
786 std::string fileName =
SearchExecFile (path, getuid (), getgid (), &(thread->
err));
788 if (0 == fileName.length ())
805 std::string vpath =
"";
809 vpath = std::string (pvpath);
811 std::string fileName = file;
813 fileName =
SearchExecFile (fileName, vpath, getuid (), getgid (), &(thread->
err));
815 if (0 == fileName.length ())
827 p = va_arg (cp,
char *);
832 char const** argv = (
char const **)
dce_malloc (nb *
sizeof (
char *));
839 argv[nb++] = p = va_arg (ap,
char *);
854 std::string vpath =
"";
858 vpath = std::string (pvpath);
860 std::string fileName = file;
861 fileName =
SearchExecFile (fileName, vpath, getuid (), getgid (), &(thread->
err));
862 if (0 == fileName.length ())
877 std::string fileName =
SearchExecFile (path, getuid (), getgid (), &(thread->
err));
879 if (0 == fileName.length ())
890 p = va_arg (cp,
char *);
895 char const** envp = (
char const **) va_arg (cp,
char **);
896 char const** argv = (
char const **)
dce_malloc (nb *
sizeof (
char *));
903 argv[nb++] = p = va_arg (ap,
char *);
908 (
char*
const*) argv, (
char*
const*) envp);
917 static char loc[] =
"";
924 NS_ASSERT (current != 0);
927 current->
err = ENAMETOOLONG;
942 memset (&it, 0,
sizeof (it));
944 unsigned int ret = 0;
948 ret = it.it_value.tv_sec;
951 memset (&it, 0,
sizeof (it));
952 it.it_value.tv_sec = s;
953 it.it_value.tv_usec = 0;
963 NS_ASSERT (current != 0);
967 ssize_t ret = readlink (fullpath.c_str (), buf, bufsize);
977 memcpy (buf, buf + l, l);
982 #ifdef HAVE_GETCPUFEATURES
991 #endif // HAVE_GETCPUFEATURES