Home | History | Annotate | Download | only in iomgr
      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 
     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