* fhandler.cc (fhandler_base::fork_fixup): Don't protect handle.
* dlfcn.cc: Fix to confirm to coding standards. Reorganize includes throughout to accomodate new cygheap.h usage. * cygheap.h (cygheap_fdmanip): New class: simplifies locking and retrieval of fds from cygheap->fdtab. (cygheap_fdget): Ditto. (cygheap_fdnew): Ditto. * fcntl.cc (_fcntl): Use new method to lock fdtab and retrieve info. * ioctl.cc (ioctl): Ditto. * mmap.cc (mmap): Ditto. * net.cc: Ditto, throughout. * passwd.cc (getpass): Ditto. * path.cc (fchdir): Ditto. * pipe.cc (make_pipe): Ditto. * sec_acl.cc (facl): Ditto. * syscalls.cc: Ditto, throughout. * termios.cc: Ditto, throughout.
This commit is contained in:
		@@ -496,7 +496,7 @@ cygwin_getprotobynumber (int number)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fhandler_socket *
 | 
			
		||||
fdsock (int fd, const char *name, SOCKET soc)
 | 
			
		||||
fdsock (int& fd, const char *name, SOCKET soc)
 | 
			
		||||
{
 | 
			
		||||
  if (!winsock2_active)
 | 
			
		||||
    soc = set_socket_inheritance (soc);
 | 
			
		||||
@@ -516,15 +516,11 @@ extern "C" int
 | 
			
		||||
cygwin_socket (int af, int type, int protocol)
 | 
			
		||||
{
 | 
			
		||||
  int res = -1;
 | 
			
		||||
  SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "socket");
 | 
			
		||||
 | 
			
		||||
  SOCKET soc = 0;
 | 
			
		||||
 | 
			
		||||
  int fd = cygheap->fdtab.find_unused_handle ();
 | 
			
		||||
  cygheap_fdnew fd;
 | 
			
		||||
 | 
			
		||||
  if (fd < 0)
 | 
			
		||||
    set_errno (EMFILE);
 | 
			
		||||
  else
 | 
			
		||||
  if (fd >= 0)
 | 
			
		||||
    {
 | 
			
		||||
      debug_printf ("socket (%d, %d, %d)", af, type, protocol);
 | 
			
		||||
 | 
			
		||||
@@ -548,7 +544,6 @@ cygwin_socket (int af, int type, int protocol)
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
  syscall_printf ("%d = socket (%d, %d, %d)", res, af, type, protocol);
 | 
			
		||||
  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "socket");
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -698,13 +693,11 @@ cygwin_recvfrom (int fd,
 | 
			
		||||
fhandler_socket *
 | 
			
		||||
get (int fd)
 | 
			
		||||
{
 | 
			
		||||
  if (cygheap->fdtab.not_open (fd))
 | 
			
		||||
    {
 | 
			
		||||
      set_errno (EINVAL);
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  cygheap_fdget cfd (fd);
 | 
			
		||||
  if (cfd < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  return cygheap->fdtab[fd]->is_socket ();
 | 
			
		||||
  return cfd->is_socket ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* exported as setsockopt: standards? */
 | 
			
		||||
@@ -1206,12 +1199,10 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len)
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
      SetResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "accept");
 | 
			
		||||
 | 
			
		||||
      int res_fd = cygheap->fdtab.find_unused_handle ();
 | 
			
		||||
      if (res_fd == -1)
 | 
			
		||||
	/* FIXME: what is correct errno? */
 | 
			
		||||
	set_errno (EMFILE);
 | 
			
		||||
      cygheap_fdnew res_fd;
 | 
			
		||||
      if (res_fd < 0)
 | 
			
		||||
	/* FIXME: what is correct errno? */;
 | 
			
		||||
      else if ((SOCKET) res == (SOCKET) INVALID_SOCKET)
 | 
			
		||||
	set_winsock_errno ();
 | 
			
		||||
      else
 | 
			
		||||
@@ -1220,7 +1211,6 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len)
 | 
			
		||||
	  res_fh->set_addr_family (sock->get_addr_family ());
 | 
			
		||||
	  res = res_fd;
 | 
			
		||||
	}
 | 
			
		||||
      ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "accept");
 | 
			
		||||
    }
 | 
			
		||||
 done:
 | 
			
		||||
  syscall_printf ("%d = accept (%d, %x, %x)", res, fd, peer, len);
 | 
			
		||||
@@ -2110,19 +2100,19 @@ cygwin_rcmd (char **ahost, unsigned short inport, char *locuser,
 | 
			
		||||
  SOCKET fd2s;
 | 
			
		||||
  sigframe thisframe (mainthread);
 | 
			
		||||
 | 
			
		||||
  int res_fd = cygheap->fdtab.find_unused_handle ();
 | 
			
		||||
  if (res_fd == -1)
 | 
			
		||||
  cygheap_fdnew res_fd;
 | 
			
		||||
  if (res_fd < 0)
 | 
			
		||||
    goto done;
 | 
			
		||||
 | 
			
		||||
  if (fd2p)
 | 
			
		||||
    {
 | 
			
		||||
      SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygwin_rcmd");
 | 
			
		||||
      *fd2p = cygheap->fdtab.find_unused_handle (res_fd + 1);
 | 
			
		||||
      if (*fd2p == -1)
 | 
			
		||||
      cygheap_fdnew newfd (res_fd, false);
 | 
			
		||||
      if (*fd2p < 0)
 | 
			
		||||
	goto done;
 | 
			
		||||
      *fd2p = newfd;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  res = rcmd (ahost, inport, locuser, remuser, cmd, fd2p? &fd2s: NULL);
 | 
			
		||||
  res = rcmd (ahost, inport, locuser, remuser, cmd, fd2p ? &fd2s : NULL);
 | 
			
		||||
  if (res == (int) INVALID_SOCKET)
 | 
			
		||||
    goto done;
 | 
			
		||||
  else
 | 
			
		||||
@@ -2130,11 +2120,11 @@ cygwin_rcmd (char **ahost, unsigned short inport, char *locuser,
 | 
			
		||||
      fdsock (res_fd, "/dev/tcp", res);
 | 
			
		||||
      res = res_fd;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (fd2p)
 | 
			
		||||
    fdsock (*fd2p, "/dev/tcp", fd2s);
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
  if (fd2p)
 | 
			
		||||
    ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "cygwin_rcmd");
 | 
			
		||||
  syscall_printf ("%d = rcmd (...)", res);
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
@@ -2143,24 +2133,23 @@ done:
 | 
			
		||||
extern "C" int
 | 
			
		||||
cygwin_rresvport (int *port)
 | 
			
		||||
{
 | 
			
		||||
  int res = -1;
 | 
			
		||||
  int res;
 | 
			
		||||
  sigframe thisframe (mainthread);
 | 
			
		||||
 | 
			
		||||
  SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygwin_rresvport");
 | 
			
		||||
  int res_fd = cygheap->fdtab.find_unused_handle ();
 | 
			
		||||
  if (res_fd == -1)
 | 
			
		||||
    goto done;
 | 
			
		||||
  res = rresvport (port);
 | 
			
		||||
 | 
			
		||||
  if (res == (int) INVALID_SOCKET)
 | 
			
		||||
    goto done;
 | 
			
		||||
  cygheap_fdnew res_fd;
 | 
			
		||||
  if (res_fd < 0)
 | 
			
		||||
    res = -1;
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      fdsock (res_fd, "/dev/tcp", res);
 | 
			
		||||
      res = res_fd;
 | 
			
		||||
      res = rresvport (port);
 | 
			
		||||
 | 
			
		||||
      if (res != (int) INVALID_SOCKET)
 | 
			
		||||
	{
 | 
			
		||||
	  fdsock (res_fd, "/dev/tcp", res);
 | 
			
		||||
	  res = res_fd;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
done:
 | 
			
		||||
  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygwin_rresvport");
 | 
			
		||||
 | 
			
		||||
  syscall_printf ("%d = rresvport (%d)", res, port ? *port : 0);
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
@@ -2174,15 +2163,15 @@ cygwin_rexec (char **ahost, unsigned short inport, char *locuser,
 | 
			
		||||
  SOCKET fd2s;
 | 
			
		||||
  sigframe thisframe (mainthread);
 | 
			
		||||
 | 
			
		||||
  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygwin_rexec");
 | 
			
		||||
  int res_fd = cygheap->fdtab.find_unused_handle ();
 | 
			
		||||
  if (res_fd == -1)
 | 
			
		||||
  cygheap_fdnew res_fd;
 | 
			
		||||
  if (res_fd < 0)
 | 
			
		||||
    goto done;
 | 
			
		||||
  if (fd2p)
 | 
			
		||||
    {
 | 
			
		||||
      *fd2p = cygheap->fdtab.find_unused_handle (res_fd + 1);
 | 
			
		||||
      if (*fd2p == -1)
 | 
			
		||||
      cygheap_fdnew newfd (res_fd);
 | 
			
		||||
      if (newfd < 0)
 | 
			
		||||
	goto done;
 | 
			
		||||
      *fd2p = newfd;
 | 
			
		||||
    }
 | 
			
		||||
  res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL);
 | 
			
		||||
  if (res == (int) INVALID_SOCKET)
 | 
			
		||||
@@ -2196,7 +2185,6 @@ cygwin_rexec (char **ahost, unsigned short inport, char *locuser,
 | 
			
		||||
    fdsock (*fd2p, "/dev/tcp", fd2s);
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygwin_rexec");
 | 
			
		||||
  syscall_printf ("%d = rexec (...)", res);
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
@@ -2211,21 +2199,18 @@ socketpair (int, int type, int, int *sb)
 | 
			
		||||
  struct sockaddr_in sock_in;
 | 
			
		||||
  int len = sizeof (sock_in);
 | 
			
		||||
 | 
			
		||||
  SetResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "socketpair");
 | 
			
		||||
 | 
			
		||||
  sb[0] = cygheap->fdtab.find_unused_handle ();
 | 
			
		||||
  if (sb[0] == -1)
 | 
			
		||||
  cygheap_fdnew sb0;
 | 
			
		||||
  if (sb0 < 0)
 | 
			
		||||
    goto done;
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      set_errno (EMFILE);
 | 
			
		||||
      goto done;
 | 
			
		||||
    }
 | 
			
		||||
  sb[1] = cygheap->fdtab.find_unused_handle (sb[0] + 1);
 | 
			
		||||
  if (sb[1] == -1)
 | 
			
		||||
    {
 | 
			
		||||
      set_errno (EMFILE);
 | 
			
		||||
      goto done;
 | 
			
		||||
    }
 | 
			
		||||
      sb[0] = sb0;
 | 
			
		||||
      cygheap_fdnew sb1 (sb0, false);
 | 
			
		||||
      if (sb1 < 0)
 | 
			
		||||
	goto done;
 | 
			
		||||
 | 
			
		||||
      sb[1] = sb1;
 | 
			
		||||
    }
 | 
			
		||||
  /* create a listening socket */
 | 
			
		||||
  newsock = socket (AF_INET, type, 0);
 | 
			
		||||
  if (newsock == INVALID_SOCKET)
 | 
			
		||||
@@ -2300,7 +2285,6 @@ socketpair (int, int type, int, int *sb)
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
  syscall_printf ("%d = socketpair (...)", res);
 | 
			
		||||
  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK|READ_LOCK, "socketpair");
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user