• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <grpc/support/port_platform.h>
20 
21 #include "src/core/lib/iomgr/port.h"
22 
23 #ifdef GRPC_POSIX_SOCKETUTILS
24 
25 #include "src/core/lib/iomgr/socket_utils_posix.h"
26 
27 #include <fcntl.h>
28 #include <sys/socket.h>
29 #include <unistd.h>
30 
31 #include <grpc/support/log.h>
32 #include "src/core/lib/iomgr/sockaddr.h"
33 
grpc_accept4(int sockfd,grpc_resolved_address * resolved_addr,int nonblock,int cloexec)34 int grpc_accept4(int sockfd, grpc_resolved_address* resolved_addr, int nonblock,
35                  int cloexec) {
36   int fd, flags;
37   fd = accept(sockfd, reinterpret_cast<grpc_sockaddr*>(resolved_addr->addr),
38               &resolved_addr->len);
39   if (fd >= 0) {
40     if (nonblock) {
41       flags = fcntl(fd, F_GETFL, 0);
42       if (flags < 0) goto close_and_error;
43       if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) goto close_and_error;
44     }
45     if (cloexec) {
46       flags = fcntl(fd, F_GETFD, 0);
47       if (flags < 0) goto close_and_error;
48       if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != 0) goto close_and_error;
49     }
50   }
51   return fd;
52 
53 close_and_error:
54   close(fd);
55   return -1;
56 }
57 
58 #endif /* GRPC_POSIX_SOCKETUTILS */
59