static int loop_clients(int accept_fd, uid_t bus_uid) { _cleanup_(shared_policy_freep) SharedPolicy *sp = NULL; pthread_attr_t attr; int r; r = pthread_attr_init(&attr); if (r != 0) return log_error_errno(r, "Cannot initialize pthread attributes: %m"); r = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (r != 0) { r = log_error_errno(r, "Cannot mark pthread attributes as detached: %m"); goto finish; } r = shared_policy_new(&sp); if (r < 0) goto finish; for (;;) { ClientContext *c; pthread_t tid; int fd; fd = accept4(accept_fd, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); if (fd < 0) { if (errno == EAGAIN || errno == EINTR) continue; r = log_error_errno(errno, "accept4() failed: %m"); goto finish; } r = client_context_new(&c); if (r < 0) { log_oom(); close(fd); continue; } c->fd = fd; c->policy = sp; c->bus_uid = bus_uid; r = pthread_create(&tid, &attr, run_client, c); if (r != 0) { log_warning_errno(r, "Cannot spawn thread, ignoring: %m"); client_context_free(c); continue; } } finish: pthread_attr_destroy(&attr); return r; }
OPENVPN_EXPORT void * openvpn_plugin_client_constructor_v1( openvpn_plugin_handle_t handle){ client_context_t *cc = client_context_new( ); return (void *)cc; }