xref: /aosp_15_r20/external/virglrenderer/src/proxy/proxy_client.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #include "proxy_client.h"
7*bbecb9d1SAndroid Build Coastguard Worker 
8*bbecb9d1SAndroid Build Coastguard Worker #include <unistd.h>
9*bbecb9d1SAndroid Build Coastguard Worker 
10*bbecb9d1SAndroid Build Coastguard Worker #include "server/render_protocol.h"
11*bbecb9d1SAndroid Build Coastguard Worker 
12*bbecb9d1SAndroid Build Coastguard Worker #include "proxy_server.h"
13*bbecb9d1SAndroid Build Coastguard Worker 
14*bbecb9d1SAndroid Build Coastguard Worker bool
proxy_client_destroy_context(struct proxy_client * client,uint32_t ctx_id)15*bbecb9d1SAndroid Build Coastguard Worker proxy_client_destroy_context(struct proxy_client *client, uint32_t ctx_id)
16*bbecb9d1SAndroid Build Coastguard Worker {
17*bbecb9d1SAndroid Build Coastguard Worker    const struct render_client_op_destroy_context_request req = {
18*bbecb9d1SAndroid Build Coastguard Worker       .header.op = RENDER_CLIENT_OP_DESTROY_CONTEXT,
19*bbecb9d1SAndroid Build Coastguard Worker       .ctx_id = ctx_id,
20*bbecb9d1SAndroid Build Coastguard Worker    };
21*bbecb9d1SAndroid Build Coastguard Worker 
22*bbecb9d1SAndroid Build Coastguard Worker    return proxy_socket_send_request(&client->socket, &req, sizeof(req));
23*bbecb9d1SAndroid Build Coastguard Worker }
24*bbecb9d1SAndroid Build Coastguard Worker 
25*bbecb9d1SAndroid Build Coastguard Worker bool
proxy_client_create_context(struct proxy_client * client,uint32_t ctx_id,size_t ctx_name_len,const char * ctx_name,int * out_ctx_fd)26*bbecb9d1SAndroid Build Coastguard Worker proxy_client_create_context(struct proxy_client *client,
27*bbecb9d1SAndroid Build Coastguard Worker                             uint32_t ctx_id,
28*bbecb9d1SAndroid Build Coastguard Worker                             size_t ctx_name_len,
29*bbecb9d1SAndroid Build Coastguard Worker                             const char *ctx_name,
30*bbecb9d1SAndroid Build Coastguard Worker                             int *out_ctx_fd)
31*bbecb9d1SAndroid Build Coastguard Worker {
32*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_create_context_request req = {
33*bbecb9d1SAndroid Build Coastguard Worker       .header.op = RENDER_CLIENT_OP_CREATE_CONTEXT,
34*bbecb9d1SAndroid Build Coastguard Worker       .ctx_id = ctx_id,
35*bbecb9d1SAndroid Build Coastguard Worker    };
36*bbecb9d1SAndroid Build Coastguard Worker 
37*bbecb9d1SAndroid Build Coastguard Worker    const size_t len = MIN2(ctx_name_len, sizeof(req.ctx_name) - 1);
38*bbecb9d1SAndroid Build Coastguard Worker    memcpy(req.ctx_name, ctx_name, len);
39*bbecb9d1SAndroid Build Coastguard Worker 
40*bbecb9d1SAndroid Build Coastguard Worker    if (!proxy_socket_send_request(&client->socket, &req, sizeof(req)))
41*bbecb9d1SAndroid Build Coastguard Worker       return false;
42*bbecb9d1SAndroid Build Coastguard Worker 
43*bbecb9d1SAndroid Build Coastguard Worker    struct render_client_op_create_context_reply reply;
44*bbecb9d1SAndroid Build Coastguard Worker    int fd_count;
45*bbecb9d1SAndroid Build Coastguard Worker    int ctx_fd;
46*bbecb9d1SAndroid Build Coastguard Worker    if (!proxy_socket_receive_reply_with_fds(&client->socket, &reply, sizeof(reply),
47*bbecb9d1SAndroid Build Coastguard Worker                                             &ctx_fd, 1, &fd_count))
48*bbecb9d1SAndroid Build Coastguard Worker       return false;
49*bbecb9d1SAndroid Build Coastguard Worker 
50*bbecb9d1SAndroid Build Coastguard Worker    if (reply.ok != fd_count) {
51*bbecb9d1SAndroid Build Coastguard Worker       if (fd_count)
52*bbecb9d1SAndroid Build Coastguard Worker          close(ctx_fd);
53*bbecb9d1SAndroid Build Coastguard Worker       return false;
54*bbecb9d1SAndroid Build Coastguard Worker    } else if (!reply.ok) {
55*bbecb9d1SAndroid Build Coastguard Worker       return false;
56*bbecb9d1SAndroid Build Coastguard Worker    }
57*bbecb9d1SAndroid Build Coastguard Worker 
58*bbecb9d1SAndroid Build Coastguard Worker    if (!proxy_socket_is_seqpacket(ctx_fd)) {
59*bbecb9d1SAndroid Build Coastguard Worker       close(ctx_fd);
60*bbecb9d1SAndroid Build Coastguard Worker       return false;
61*bbecb9d1SAndroid Build Coastguard Worker    }
62*bbecb9d1SAndroid Build Coastguard Worker 
63*bbecb9d1SAndroid Build Coastguard Worker    *out_ctx_fd = ctx_fd;
64*bbecb9d1SAndroid Build Coastguard Worker    return true;
65*bbecb9d1SAndroid Build Coastguard Worker }
66*bbecb9d1SAndroid Build Coastguard Worker 
67*bbecb9d1SAndroid Build Coastguard Worker bool
proxy_client_reset(struct proxy_client * client)68*bbecb9d1SAndroid Build Coastguard Worker proxy_client_reset(struct proxy_client *client)
69*bbecb9d1SAndroid Build Coastguard Worker {
70*bbecb9d1SAndroid Build Coastguard Worker    const struct render_client_op_reset_request req = {
71*bbecb9d1SAndroid Build Coastguard Worker       .header.op = RENDER_CLIENT_OP_RESET,
72*bbecb9d1SAndroid Build Coastguard Worker    };
73*bbecb9d1SAndroid Build Coastguard Worker    return proxy_socket_send_request(&client->socket, &req, sizeof(req));
74*bbecb9d1SAndroid Build Coastguard Worker }
75*bbecb9d1SAndroid Build Coastguard Worker 
76*bbecb9d1SAndroid Build Coastguard Worker void
proxy_client_destroy(struct proxy_client * client)77*bbecb9d1SAndroid Build Coastguard Worker proxy_client_destroy(struct proxy_client *client)
78*bbecb9d1SAndroid Build Coastguard Worker {
79*bbecb9d1SAndroid Build Coastguard Worker    proxy_socket_fini(&client->socket);
80*bbecb9d1SAndroid Build Coastguard Worker    free(client);
81*bbecb9d1SAndroid Build Coastguard Worker }
82*bbecb9d1SAndroid Build Coastguard Worker 
83*bbecb9d1SAndroid Build Coastguard Worker static bool
proxy_client_init(struct proxy_client * client,uint32_t flags)84*bbecb9d1SAndroid Build Coastguard Worker proxy_client_init(struct proxy_client *client, uint32_t flags)
85*bbecb9d1SAndroid Build Coastguard Worker {
86*bbecb9d1SAndroid Build Coastguard Worker    const struct render_client_op_init_request req = {
87*bbecb9d1SAndroid Build Coastguard Worker       .header.op = RENDER_CLIENT_OP_INIT,
88*bbecb9d1SAndroid Build Coastguard Worker       .flags = flags,
89*bbecb9d1SAndroid Build Coastguard Worker    };
90*bbecb9d1SAndroid Build Coastguard Worker    return proxy_socket_send_request(&client->socket, &req, sizeof(req));
91*bbecb9d1SAndroid Build Coastguard Worker }
92*bbecb9d1SAndroid Build Coastguard Worker 
93*bbecb9d1SAndroid Build Coastguard Worker struct proxy_client *
proxy_client_create(struct proxy_server * srv,uint32_t flags)94*bbecb9d1SAndroid Build Coastguard Worker proxy_client_create(struct proxy_server *srv, uint32_t flags)
95*bbecb9d1SAndroid Build Coastguard Worker {
96*bbecb9d1SAndroid Build Coastguard Worker    struct proxy_client *client = calloc(1, sizeof(*client));
97*bbecb9d1SAndroid Build Coastguard Worker    if (!client)
98*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
99*bbecb9d1SAndroid Build Coastguard Worker 
100*bbecb9d1SAndroid Build Coastguard Worker    const int client_fd = proxy_server_connect(srv);
101*bbecb9d1SAndroid Build Coastguard Worker    if (client_fd < 0) {
102*bbecb9d1SAndroid Build Coastguard Worker       free(client);
103*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
104*bbecb9d1SAndroid Build Coastguard Worker    }
105*bbecb9d1SAndroid Build Coastguard Worker 
106*bbecb9d1SAndroid Build Coastguard Worker    proxy_socket_init(&client->socket, client_fd);
107*bbecb9d1SAndroid Build Coastguard Worker 
108*bbecb9d1SAndroid Build Coastguard Worker    if (!proxy_client_init(client, flags)) {
109*bbecb9d1SAndroid Build Coastguard Worker       proxy_socket_fini(&client->socket);
110*bbecb9d1SAndroid Build Coastguard Worker       free(client);
111*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
112*bbecb9d1SAndroid Build Coastguard Worker    }
113*bbecb9d1SAndroid Build Coastguard Worker 
114*bbecb9d1SAndroid Build Coastguard Worker    return client;
115*bbecb9d1SAndroid Build Coastguard Worker }
116