Implement swrap_dup too.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@21592 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2007-07-16 17:28:03 +00:00
parent dc7aa2a351
commit b20afc22f7

View File

@@ -1837,40 +1837,11 @@ _PUBLIC_ int swrap_close(int fd)
return ret;
}
_PUBLIC_ int swrap_dup(int oldd)
static int
dup_internal(const struct socket_info *si_oldd, int fd)
{
struct socket_info *si;
struct socket_info *si_newd;
si = find_socket_info(oldd);
if (si == NULL)
return real_dup(oldd);
abort(); /* write code here */
}
_PUBLIC_ int swrap_dup2(int oldd, int newd)
{
struct socket_info *si_newd, *si_oldd;
int fd;
if (newd == oldd)
return newd;
si_oldd = find_socket_info(oldd);
si_newd = find_socket_info(newd);
if (si_oldd == NULL && si_newd == NULL)
return real_dup2(oldd, newd);
fd = real_dup2(si_oldd->fd, newd);
if (fd < 0)
return fd;
/* close new socket first */
if (si_newd)
swrap_close(newd);
si_newd = (struct socket_info *)calloc(1, sizeof(struct socket_info));
si_newd->fd = fd;
@@ -1897,3 +1868,46 @@ _PUBLIC_ int swrap_dup2(int oldd, int newd)
return fd;
}
_PUBLIC_ int swrap_dup(int oldd)
{
struct socket_info *si;
int fd;
si = find_socket_info(oldd);
if (si == NULL)
return real_dup(oldd);
fd = real_dup(si->fd);
if (fd < 0)
return fd;
return dup_internal(si, fd);
}
_PUBLIC_ int swrap_dup2(int oldd, int newd)
{
struct socket_info *si_newd, *si_oldd;
int fd;
if (newd == oldd)
return newd;
si_oldd = find_socket_info(oldd);
si_newd = find_socket_info(newd);
if (si_oldd == NULL && si_newd == NULL)
return real_dup2(oldd, newd);
fd = real_dup2(si_oldd->fd, newd);
if (fd < 0)
return fd;
/* close new socket first */
if (si_newd)
swrap_close(newd);
return dup_internal(si_oldd, fd);
}