/* Accept code of zebra server socket. */ static int zebra_accept (struct thread *thread) { int accept_sock; int client_sock; struct sockaddr_in client; socklen_t len; accept_sock = THREAD_FD (thread); /* Reregister myself. */ zebra_event (ZEBRA_SERV, accept_sock, NULL); len = sizeof (struct sockaddr_in); client_sock = accept (accept_sock, (struct sockaddr *) &client, &len); if (client_sock < 0) { zlog_warn ("Can't accept zebra socket: %s", safe_strerror (errno)); return -1; } /* Make client socket non-blocking. */ set_nonblocking(client_sock); /* Create new zebra client. */ zebra_client_create (client_sock); return 0; }
/* Accept code of zebra server socket. */ static int zebra_accept (struct thread *thread) { int val; int accept_sock; int client_sock; struct sockaddr_in client; socklen_t len; accept_sock = THREAD_FD (thread); len = sizeof (struct sockaddr_in); client_sock = accept (accept_sock, (struct sockaddr *) &client, &len); if (client_sock < 0) { zlog_warn ("Can't accept zebra socket: %s", safe_strerror (errno)); return -1; } /* Make client socket non-blocking. */ /* XXX: We dont requeue failed writes, so this leads to inconsistencies. * for now socket must remain blocking, regardless of risk of deadlocks. */ /* val = fcntl (client_sock, F_GETFL, 0); fcntl (client_sock, F_SETFL, (val | O_NONBLOCK)); */ /* Create new zebra client. */ zebra_client_create (client_sock); /* Register myself. */ zebra_event (ZEBRA_SERV, accept_sock, NULL); return 0; }