* fhandler_disk_file.cc (fhandler_disk_file::opendir): Check descriptor
created by cygheap_fdnew constructor. * fhandler_virtual.cc (fhandler_virtual::opendir): Ditto. * fhandler_socket.cc (fhandler_socket::accept): Ditto and move creation of file descriptor behind blocking OS call. * net.cc (cygwin_socket): Ditto. (cygwin_rcmd): Ditto. (cygwin_rresvport): Ditto. (cygwin_rexec): Ditto. (socketpair): Ditto.
This commit is contained in:
		| @@ -1,3 +1,16 @@ | |||||||
|  | 2003-02-20  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
|  | 	* fhandler_disk_file.cc (fhandler_disk_file::opendir): Check descriptor | ||||||
|  | 	created by cygheap_fdnew constructor. | ||||||
|  | 	* fhandler_virtual.cc (fhandler_virtual::opendir): Ditto. | ||||||
|  | 	* fhandler_socket.cc (fhandler_socket::accept): Ditto and move | ||||||
|  | 	creation of file descriptor behind blocking OS call. | ||||||
|  | 	* net.cc (cygwin_socket): Ditto. | ||||||
|  | 	(cygwin_rcmd): Ditto. | ||||||
|  | 	(cygwin_rresvport): Ditto. | ||||||
|  | 	(cygwin_rexec): Ditto. | ||||||
|  | 	(socketpair): Ditto. | ||||||
|  |  | ||||||
| 2003-02-20  Corinna Vinschen  <corinna@vinschen.de> | 2003-02-20  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* autoload.cc (GetCompressedFileSize): Add. | 	* autoload.cc (GetCompressedFileSize): Add. | ||||||
|   | |||||||
| @@ -619,22 +619,25 @@ fhandler_disk_file::opendir (path_conv& real_name) | |||||||
|       strcpy (dir->__d_dirname, real_name.get_win32 ()); |       strcpy (dir->__d_dirname, real_name.get_win32 ()); | ||||||
|       dir->__d_dirent->d_version = __DIRENT_VERSION; |       dir->__d_dirent->d_version = __DIRENT_VERSION; | ||||||
|       cygheap_fdnew fd; |       cygheap_fdnew fd; | ||||||
|       fd = this; |       if (fd >= 0) | ||||||
|       fd->set_nohandle (true); |         { | ||||||
|       dir->__d_dirent->d_fd = fd; | 	  fd = this; | ||||||
|       dir->__d_u.__d_data.__fh = this; | 	  fd->set_nohandle (true); | ||||||
|       /* FindFirstFile doesn't seem to like duplicate /'s. */ | 	  dir->__d_dirent->d_fd = fd; | ||||||
|       len = strlen (dir->__d_dirname); | 	  dir->__d_u.__d_data.__fh = this; | ||||||
|       if (len == 0 || isdirsep (dir->__d_dirname[len - 1])) | 	  /* FindFirstFile doesn't seem to like duplicate /'s. */ | ||||||
| 	strcat (dir->__d_dirname, "*"); | 	  len = strlen (dir->__d_dirname); | ||||||
|       else | 	  if (len == 0 || isdirsep (dir->__d_dirname[len - 1])) | ||||||
| 	strcat (dir->__d_dirname, "\\*");  /**/ | 	    strcat (dir->__d_dirname, "*"); | ||||||
|       dir->__d_cookie = __DIRENT_COOKIE; | 	  else | ||||||
|       dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE; | 	    strcat (dir->__d_dirname, "\\*");  /**/ | ||||||
|       dir->__d_position = 0; | 	  dir->__d_cookie = __DIRENT_COOKIE; | ||||||
|       dir->__d_dirhash = get_namehash (); | 	  dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE; | ||||||
|  | 	  dir->__d_position = 0; | ||||||
|  | 	  dir->__d_dirhash = get_namehash (); | ||||||
|  |  | ||||||
|       res = dir; | 	  res = dir; | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   syscall_printf ("%p = opendir (%s)", res, get_name ()); |   syscall_printf ("%p = opendir (%s)", res, get_name ()); | ||||||
|   | |||||||
| @@ -484,7 +484,6 @@ fhandler_socket::accept (struct sockaddr *peer, int *len) | |||||||
|   WSAEVENT ev[2] = { WSA_INVALID_EVENT, signal_arrived }; |   WSAEVENT ev[2] = { WSA_INVALID_EVENT, signal_arrived }; | ||||||
|   BOOL secret_check_failed = FALSE; |   BOOL secret_check_failed = FALSE; | ||||||
|   BOOL in_progress = FALSE; |   BOOL in_progress = FALSE; | ||||||
|   cygheap_fdnew res_fd; |  | ||||||
|  |  | ||||||
|   /* Allows NULL peer and len parameters. */ |   /* Allows NULL peer and len parameters. */ | ||||||
|   struct sockaddr_in peer_dummy; |   struct sockaddr_in peer_dummy; | ||||||
| @@ -593,19 +592,28 @@ fhandler_socket::accept (struct sockaddr *peer, int *len) | |||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   if (res_fd < 0) |   if ((SOCKET) res == (SOCKET) INVALID_SOCKET) | ||||||
|     /* FIXME: what is correct errno? */; |  | ||||||
|   else if ((SOCKET) res == (SOCKET) INVALID_SOCKET) |  | ||||||
|     set_winsock_errno (); |     set_winsock_errno (); | ||||||
|   else |   else | ||||||
|     { |     { | ||||||
|       fhandler_socket* res_fh = fdsock (res_fd, get_name (), res); |       cygheap_fdnew res_fd; | ||||||
|       if (get_addr_family () == AF_LOCAL) |       fhandler_socket* res_fh = NULL; | ||||||
| 	res_fh->set_sun_path (get_sun_path ()); |       if (res_fd >= 0) | ||||||
|       res_fh->set_addr_family (get_addr_family ()); | 	  res_fh = fdsock (res_fd, get_name (), res); | ||||||
|       res_fh->set_socket_type (get_socket_type ()); |       if (res_fh) | ||||||
|       res_fh->set_connect_state (CONNECTED); |         { | ||||||
|       res = res_fd; | 	  if (get_addr_family () == AF_LOCAL) | ||||||
|  | 	    res_fh->set_sun_path (get_sun_path ()); | ||||||
|  | 	  res_fh->set_addr_family (get_addr_family ()); | ||||||
|  | 	  res_fh->set_socket_type (get_socket_type ()); | ||||||
|  | 	  res_fh->set_connect_state (CONNECTED); | ||||||
|  | 	  res = res_fd; | ||||||
|  | 	} | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  | 	  closesocket (res); | ||||||
|  | 	  res = -1; | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
| done: | done: | ||||||
|   | |||||||
| @@ -74,16 +74,19 @@ fhandler_virtual::opendir (path_conv& pc) | |||||||
|       strcpy (dir->__d_dirname, get_name ()); |       strcpy (dir->__d_dirname, get_name ()); | ||||||
|       dir->__d_dirent->d_version = __DIRENT_VERSION; |       dir->__d_dirent->d_version = __DIRENT_VERSION; | ||||||
|       cygheap_fdnew fd; |       cygheap_fdnew fd; | ||||||
|       fd = this; |       if (fd >= 0) | ||||||
|       fd->set_nohandle (true); |         { | ||||||
|       dir->__d_dirent->d_fd = fd; | 	  fd = this; | ||||||
|       dir->__d_u.__d_data.__fh = this; | 	  fd->set_nohandle (true); | ||||||
|       dir->__d_cookie = __DIRENT_COOKIE; | 	  dir->__d_dirent->d_fd = fd; | ||||||
|       dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE; | 	  dir->__d_u.__d_data.__fh = this; | ||||||
|       dir->__d_position = 0; | 	  dir->__d_cookie = __DIRENT_COOKIE; | ||||||
|       dir->__d_dirhash = get_namehash (); | 	  dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE; | ||||||
|  | 	  dir->__d_position = 0; | ||||||
|  | 	  dir->__d_dirhash = get_namehash (); | ||||||
|  |  | ||||||
|       res = dir; | 	  res = dir; | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   syscall_printf ("%p = opendir (%s)", res, get_name ()); |   syscall_printf ("%p = opendir (%s)", res, get_name ()); | ||||||
|   | |||||||
| @@ -540,41 +540,37 @@ cygwin_socket (int af, int type, int protocol) | |||||||
|   SOCKET soc = 0; |   SOCKET soc = 0; | ||||||
|   fhandler_socket *fh = NULL; |   fhandler_socket *fh = NULL; | ||||||
|  |  | ||||||
|   cygheap_fdnew fd; |   debug_printf ("socket (%d, %d, %d)", af, type, protocol); | ||||||
|  |  | ||||||
|   if (fd >= 0) |   soc = socket (AF_INET, type, af == AF_LOCAL ? 0 : protocol); | ||||||
|  |  | ||||||
|  |   if (soc == INVALID_SOCKET) | ||||||
|     { |     { | ||||||
|       debug_printf ("socket (%d, %d, %d)", af, type, protocol); |       set_winsock_errno (); | ||||||
|  |       goto done; | ||||||
|       soc = socket (AF_INET, type, af == AF_LOCAL ? 0 : protocol); |  | ||||||
|  |  | ||||||
|       if (soc == INVALID_SOCKET) |  | ||||||
| 	{ |  | ||||||
| 	  set_winsock_errno (); |  | ||||||
| 	  goto done; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
|       const char *name; |  | ||||||
|  |  | ||||||
|       if (af == AF_INET) |  | ||||||
| 	name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp"); |  | ||||||
|       else |  | ||||||
| 	name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket"); |  | ||||||
|  |  | ||||||
|       fh = fdsock (fd, name, soc); |  | ||||||
|       if (!fh) |  | ||||||
| 	{ |  | ||||||
| 	  closesocket (soc); |  | ||||||
| 	  res = -1; |  | ||||||
| 	} |  | ||||||
|       else |  | ||||||
| 	{ |  | ||||||
| 	  fh->set_addr_family (af); |  | ||||||
| 	  fh->set_socket_type (type); |  | ||||||
| 	  res = fd; |  | ||||||
| 	} |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |   const char *name; | ||||||
|  |  | ||||||
|  |   if (af == AF_INET) | ||||||
|  |     name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp"); | ||||||
|  |   else | ||||||
|  |     name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket"); | ||||||
|  |  | ||||||
|  |   { | ||||||
|  |     cygheap_fdnew fd; | ||||||
|  |     if (fd >= 0) | ||||||
|  |       fh = fdsock (fd, name, soc); | ||||||
|  |     if (fh) | ||||||
|  |       { | ||||||
|  | 	fh->set_addr_family (af); | ||||||
|  | 	fh->set_socket_type (type); | ||||||
|  | 	res = fd; | ||||||
|  |       } | ||||||
|  |     else | ||||||
|  | 	closesocket (soc); | ||||||
|  |   } | ||||||
|  |  | ||||||
| done: | done: | ||||||
|   syscall_printf ("%d = socket (%d, %d, %d)", res, af, type, protocol); |   syscall_printf ("%d = socket (%d, %d, %d)", res, af, type, protocol); | ||||||
|   return res; |   return res; | ||||||
| @@ -1901,6 +1897,7 @@ cygwin_rcmd (char **ahost, unsigned short inport, char *locuser, | |||||||
| { | { | ||||||
|   int res = -1; |   int res = -1; | ||||||
|   SOCKET fd2s; |   SOCKET fd2s; | ||||||
|  |  | ||||||
|   sig_dispatch_pending (0); |   sig_dispatch_pending (0); | ||||||
|   sigframe thisframe (mainthread); |   sigframe thisframe (mainthread); | ||||||
|  |  | ||||||
| @@ -1910,33 +1907,40 @@ cygwin_rcmd (char **ahost, unsigned short inport, char *locuser, | |||||||
|       (remuser && check_null_str_errno (remuser))) |       (remuser && check_null_str_errno (remuser))) | ||||||
|     return (int) INVALID_SOCKET; |     return (int) INVALID_SOCKET; | ||||||
|  |  | ||||||
|   cygheap_fdnew res_fd; |  | ||||||
|  |  | ||||||
|   if (res_fd < 0) |  | ||||||
|     goto done; |  | ||||||
|  |  | ||||||
|   if (fd2p) |  | ||||||
|     { |  | ||||||
|       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) |   if (res != (int) INVALID_SOCKET) | ||||||
|     goto done; |  | ||||||
|   else |  | ||||||
|     { |     { | ||||||
|       fdsock (res_fd, "/dev/tcp", res); |       fhandler_socket *fh = NULL; | ||||||
|       res = res_fd; |       cygheap_fdnew res_fd; | ||||||
|  |  | ||||||
|  |       if (res_fd >= 0) | ||||||
|  | 	fh = fdsock (res_fd, "/dev/tcp", res); | ||||||
|  |       if (fh) | ||||||
|  | 	res = res_fd; | ||||||
|  |       else | ||||||
|  | 	{ | ||||||
|  | 	  closesocket (res); | ||||||
|  | 	  res = -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |       if (res >= 0 && fd2p) | ||||||
|  | 	{ | ||||||
|  | 	  cygheap_fdnew newfd (res_fd, false); | ||||||
|  |  | ||||||
|  | 	  fh = NULL; | ||||||
|  | 	  if (newfd >= 0) | ||||||
|  | 	    fh = fdsock (*fd2p, "/dev/tcp", fd2s); | ||||||
|  | 	  if (fh) | ||||||
|  | 	    *fd2p = newfd; | ||||||
|  | 	  else | ||||||
|  | 	    { | ||||||
|  | 	      closesocket (res); | ||||||
|  | 	      closesocket (fd2s); | ||||||
|  | 	      res = -1; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   if (fd2p) |  | ||||||
|     fdsock (*fd2p, "/dev/tcp", fd2s); |  | ||||||
|  |  | ||||||
| done: |  | ||||||
|   syscall_printf ("%d = rcmd (...)", res); |   syscall_printf ("%d = rcmd (...)", res); | ||||||
|   return res; |   return res; | ||||||
| } | } | ||||||
| @@ -1952,19 +1956,19 @@ cygwin_rresvport (int *port) | |||||||
|   if (check_null_invalid_struct_errno (port)) |   if (check_null_invalid_struct_errno (port)) | ||||||
|     return -1; |     return -1; | ||||||
|  |  | ||||||
|   cygheap_fdnew res_fd; |   res = rresvport (port); | ||||||
|  |  | ||||||
|   if (res_fd < 0) |   if (res != (int) INVALID_SOCKET) | ||||||
|     res = -1; |  | ||||||
|   else |  | ||||||
|     { |     { | ||||||
|       res = rresvport (port); |       fhandler_socket *fh = NULL; | ||||||
|  |       cygheap_fdnew res_fd; | ||||||
|  |  | ||||||
|       if (res != (int) INVALID_SOCKET) |       if (res_fd >= 0) | ||||||
| 	{ | 	fh = fdsock (res_fd, "/dev/tcp", res); | ||||||
| 	  fdsock (res_fd, "/dev/tcp", res); |       if (fh) | ||||||
| 	  res = res_fd; |         res = res_fd; | ||||||
| 	} |       else | ||||||
|  | 	res = -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   syscall_printf ("%d = rresvport (%d)", res, port ? *port : 0); |   syscall_printf ("%d = rresvport (%d)", res, port ? *port : 0); | ||||||
| @@ -1987,30 +1991,40 @@ cygwin_rexec (char **ahost, unsigned short inport, char *locuser, | |||||||
|       (password && check_null_str_errno (password))) |       (password && check_null_str_errno (password))) | ||||||
|     return (int) INVALID_SOCKET; |     return (int) INVALID_SOCKET; | ||||||
|  |  | ||||||
|   cygheap_fdnew res_fd; |  | ||||||
|  |  | ||||||
|   if (res_fd < 0) |  | ||||||
|     goto done; |  | ||||||
|   if (fd2p) |  | ||||||
|     { |  | ||||||
|       cygheap_fdnew newfd (res_fd); |  | ||||||
|  |  | ||||||
|       if (newfd < 0) |  | ||||||
| 	goto done; |  | ||||||
|       *fd2p = newfd; |  | ||||||
|     } |  | ||||||
|   res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL); |   res = rexec (ahost, inport, locuser, password, cmd, fd2p ? &fd2s : NULL); | ||||||
|   if (res == (int) INVALID_SOCKET) |   if (res != (int) INVALID_SOCKET) | ||||||
|     goto done; |  | ||||||
|   else |  | ||||||
|     { |     { | ||||||
|       fdsock (res_fd, "/dev/tcp", res); |       fhandler_socket *fh = NULL; | ||||||
|       res = res_fd; |       cygheap_fdnew res_fd; | ||||||
|     } |  | ||||||
|   if (fd2p) |       if (res_fd >= 0) | ||||||
|     fdsock (*fd2p, "/dev/tcp", fd2s); | 	fh = fdsock (res_fd, "/dev/tcp", res); | ||||||
|  |       if (fh) | ||||||
|  | 	res = res_fd; | ||||||
|  |       else | ||||||
|  | 	{ | ||||||
|  | 	  closesocket (res); | ||||||
|  | 	  res = -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |       if (res >= 0 && fd2p) | ||||||
|  | 	{ | ||||||
|  | 	  cygheap_fdnew newfd (res_fd, false); | ||||||
|  |  | ||||||
|  | 	  fh = NULL; | ||||||
|  | 	  if (newfd >= 0) | ||||||
|  | 	    fh = fdsock (*fd2p, "/dev/tcp", fd2s); | ||||||
|  | 	  if (fh) | ||||||
|  | 	    *fd2p = newfd; | ||||||
|  | 	  else | ||||||
|  | 	    { | ||||||
|  | 	      closesocket (res); | ||||||
|  | 	      closesocket (fd2s); | ||||||
|  | 	      res = -1; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |  | ||||||
| done: |  | ||||||
|   syscall_printf ("%d = rexec (...)", res); |   syscall_printf ("%d = rexec (...)", res); | ||||||
|   return res; |   return res; | ||||||
| } | } | ||||||
| @@ -2024,8 +2038,6 @@ socketpair (int family, int type, int protocol, int *sb) | |||||||
|   SOCKET insock, outsock, newsock; |   SOCKET insock, outsock, newsock; | ||||||
|   struct sockaddr_in sock_in, sock_out; |   struct sockaddr_in sock_in, sock_out; | ||||||
|   int len; |   int len; | ||||||
|   cygheap_fdnew sb0; |  | ||||||
|   fhandler_socket *fh; |  | ||||||
|  |  | ||||||
|   sig_dispatch_pending (0); |   sig_dispatch_pending (0); | ||||||
|   sigframe thisframe (mainthread); |   sigframe thisframe (mainthread); | ||||||
| @@ -2049,19 +2061,6 @@ socketpair (int family, int type, int protocol, int *sb) | |||||||
|       goto done; |       goto done; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   if (sb0 < 0) |  | ||||||
|     goto done; |  | ||||||
|   else |  | ||||||
|     { |  | ||||||
|       sb[0] = sb0; |  | ||||||
|       cygheap_fdnew sb1 (sb0, false); |  | ||||||
|  |  | ||||||
|       if (sb1 < 0) |  | ||||||
| 	goto done; |  | ||||||
|  |  | ||||||
|       sb[1] = sb1; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|   /* create the first socket */ |   /* create the first socket */ | ||||||
|   newsock = socket (AF_INET, type, 0); |   newsock = socket (AF_INET, type, 0); | ||||||
|   if (newsock == INVALID_SOCKET) |   if (newsock == INVALID_SOCKET) | ||||||
| @@ -2175,35 +2174,47 @@ socketpair (int family, int type, int protocol, int *sb) | |||||||
|       insock = newsock; |       insock = newsock; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   res = 0; |   { | ||||||
|  |     fhandler_socket *fh = NULL; | ||||||
|  |     cygheap_fdnew sb0; | ||||||
|  |     const char *name; | ||||||
|  |  | ||||||
|   if (family == AF_LOCAL) |     if (family == AF_INET) | ||||||
|     { |       name = (type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp"); | ||||||
|  |     else | ||||||
|  |       name = (type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket"); | ||||||
|  |  | ||||||
|       fh = fdsock (sb[0], |     if (sb0 >= 0) | ||||||
| 		   type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket", |       fh = fdsock (sb0, name, insock); | ||||||
| 		   insock); |     if (fh) | ||||||
|       fh->set_sun_path (""); |       { | ||||||
|       fh->set_addr_family (AF_LOCAL); | 	fh->set_sun_path (""); | ||||||
|       fh->set_socket_type (type); | 	fh->set_addr_family (family); | ||||||
|       fh = fdsock (sb[1], | 	fh->set_socket_type (type); | ||||||
| 		   type == SOCK_STREAM ? "/dev/streamsocket" : "/dev/dgsocket", |  | ||||||
| 		   outsock); | 	cygheap_fdnew sb1 (sb0, false); | ||||||
|       fh->set_sun_path (""); |  | ||||||
|       fh->set_addr_family (AF_LOCAL); | 	fh = NULL; | ||||||
|       fh->set_socket_type (type); | 	if (sb1 >= 0) | ||||||
|     } | 	  fh = fdsock (sb1, name, outsock); | ||||||
|   else | 	if (fh) | ||||||
|     { | 	  { | ||||||
|       fh = fdsock (sb[0], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp", | 	    fh->set_sun_path (""); | ||||||
| 		   insock); | 	    fh->set_addr_family (family); | ||||||
|       fh->set_addr_family (AF_INET); | 	    fh->set_socket_type (type); | ||||||
|       fh->set_socket_type (type); |  | ||||||
|       fh = fdsock (sb[1], type == SOCK_STREAM ? "/dev/tcp" : "/dev/udp", | 	    sb[0] = sb0; | ||||||
| 		   outsock); | 	    sb[1] = sb1; | ||||||
|       fh->set_addr_family (AF_INET); | 	    res = 0; | ||||||
|       fh->set_socket_type (type); | 	  } | ||||||
|     } |       } | ||||||
|  |  | ||||||
|  |     if (res == -1) | ||||||
|  |       { | ||||||
|  |         closesocket (insock); | ||||||
|  | 	closesocket (outsock); | ||||||
|  |       } | ||||||
|  |   } | ||||||
|  |  | ||||||
| done: | done: | ||||||
|   syscall_printf ("%d = socketpair (...)", res); |   syscall_printf ("%d = socketpair (...)", res); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user