Add support for dup()ing fake file descriptors to the simulator.
diff --git a/simulator/wrapsim/Intercept.c b/simulator/wrapsim/Intercept.c
index 49d77ee..09547fb 100644
--- a/simulator/wrapsim/Intercept.c
+++ b/simulator/wrapsim/Intercept.c
@@ -160,7 +160,7 @@
_rtype _fname( __VA_ARGS__ )
#define PASS_THROUGH_BODY(_fname, _patharg, ...) \
{ \
- CALLTRACEV("%s\n", __FUNCTION__); \
+ CALLTRACEV("%s(%s)\n", __FUNCTION__, _patharg); \
char pathBuf[PATH_MAX]; \
return _ws_##_fname(rewritePath(#_fname, pathBuf, _patharg), \
##__VA_ARGS__); \
@@ -631,6 +631,30 @@
}
+int dup(int fd)
+{
+ CALLTRACEV("%s(%d)\n", __FUNCTION__, fd);
+
+ FakeDev* dev = wsFakeDevFromFd(fd);
+ if (dev != NULL) {
+ FakeDev* newDev = dev->dup(dev, fd);
+ if (newDev != NULL) {
+ /*
+ * Now that the device entry is ready, add it to the list.
+ */
+ wsLog("## dup'ed fake dev %d: '%s' %p\n",
+ newDev->fd, newDev->debugName, newDev->state);
+ gWrapSim.fakeFdList[newDev->fd - kFakeFdBase] = newDev;
+ return newDev->fd;
+ }
+ return -1;
+ } else {
+ CALLTRACE("dup(%d)\n", fd);
+ return _ws_dup(fd);
+ }
+}
+
+
/*
* Close a file descriptor.
*/