in vboxguest/vboxguest_core.c [1375:1412]
static int vbg_ioctl_hgcm_connect(struct vbg_dev *gdev,
struct vbg_session *session,
struct vbg_ioctl_hgcm_connect *conn)
{
u32 client_id;
int i, ret;
if (vbg_ioctl_chk(&conn->hdr, sizeof(conn->u.in), sizeof(conn->u.out)))
return -EINVAL;
/* Find a free place in the sessions clients array and claim it */
mutex_lock(&gdev->session_mutex);
for (i = 0; i < ARRAY_SIZE(session->hgcm_client_ids); i++) {
if (!session->hgcm_client_ids[i]) {
session->hgcm_client_ids[i] = U32_MAX;
break;
}
}
mutex_unlock(&gdev->session_mutex);
if (i >= ARRAY_SIZE(session->hgcm_client_ids))
return -EMFILE;
ret = vbg_hgcm_connect(gdev, session->requestor, &conn->u.in.loc,
&client_id, &conn->hdr.rc);
mutex_lock(&gdev->session_mutex);
if (ret == 0 && conn->hdr.rc >= 0) {
conn->u.out.client_id = client_id;
session->hgcm_client_ids[i] = client_id;
} else {
conn->u.out.client_id = 0;
session->hgcm_client_ids[i] = 0;
}
mutex_unlock(&gdev->session_mutex);
return ret;
}