Update SCP with connect session calls

This commit is contained in:
matt335672
2025-06-09 11:07:08 +01:00
parent 3e38d9be80
commit f52f4778eb
4 changed files with 280 additions and 1 deletions
+154
View File
@@ -53,6 +53,9 @@ msgno_to_str(unsigned short n)
(n == E_SCP_CREATE_SESSION_REQUEST) ? "SCP_CREATE_SESSION_REQUEST" :
(n == E_SCP_CREATE_SESSION_RESPONSE) ? "SCP_CREATE_SESSION_RESPONSE" :
(n == E_SCP_CONNECT_SESSION_REQUEST) ? "SCP_CONNECT_SESSION_REQUEST" :
(n == E_SCP_CONNECT_SESSION_RESPONSE) ? "SCP_CONNECT_SESSION_RESPONSE" :
(n == E_SCP_LIST_SESSIONS_REQUEST) ? "SCP_LIST_SESSIONS_REQUEST" :
(n == E_SCP_LIST_SESSIONS_RESPONSE) ? "SCP_LIST_SESSIONS_RESPONSE" :
@@ -519,6 +522,157 @@ scp_get_create_session_response(struct trans *trans,
/*****************************************************************************/
int
scp_send_connect_session_request(struct trans *trans,
const struct guid *guid,
unsigned int flags)
{
struct libipm_fsb guid_descriptor = { (void *)guid, sizeof(*guid) };
return libipm_msg_out_simple_send(
trans,
(int)E_SCP_CONNECT_SESSION_REQUEST,
"Bu", &guid_descriptor, flags);
}
/*****************************************************************************/
int
scp_get_connect_session_request(struct trans *trans,
struct guid *guid,
unsigned int *flags)
{
struct libipm_fsb guid_descriptor = { (void *)guid, sizeof(*guid) };
/* Intermediate values */
uint32_t i_flags;
int rv = libipm_msg_in_parse( trans, "Bu", &guid_descriptor, &i_flags);
if (rv == 0)
{
*flags = i_flags;
}
return rv;
}
/*****************************************************************************/
int
scp_send_connect_session_response(struct trans *trans,
enum scp_sconnect_status status,
int display_fd,
int chan_fd)
{
int rv = libipm_msg_out_init(
trans, (int)E_SCP_CONNECT_SESSION_RESPONSE,
"i", status);
// Send the display file descriptor, guarded by a boolean
if (rv == 0)
{
if (display_fd >= 0)
{
rv = libipm_msg_out_append(
trans, "bh", 1, display_fd);
}
else
{
rv = libipm_msg_out_append(trans, "b", 0);
}
}
// Send the chansrv file descriptor, guarded by a boolean
if (rv == 0)
{
if (chan_fd >= 0)
{
rv = libipm_msg_out_append(
trans, "bh", 1, chan_fd);
}
else
{
rv = libipm_msg_out_append(trans, "b", 0);
}
}
if (rv == 0)
{
libipm_msg_out_mark_end(trans);
if (trans_force_write(trans) != 0)
{
rv = E_LI_TRANSPORT_ERROR;
}
}
return rv;
}
/*****************************************************************************/
int
scp_get_connect_session_response(struct trans *trans,
enum scp_sconnect_status *status,
int *display_fd,
int *chan_fd)
{
int fd_present;
int got_display_fd = 0;
int got_chan_fd = 0;
/* Intermediate values */
int32_t i_status;
int rv = libipm_msg_in_parse( trans, "i", &i_status);
// Read the X11 file descriptor
if (rv == 0 && libipm_msg_in_parse(trans, "b", &fd_present) == 0)
{
if (!fd_present)
{
// Caller didn't send display_fd
*display_fd = -1;
}
else
{
got_display_fd = (libipm_msg_in_parse(trans, "h", display_fd) == 0);
}
}
// Read the chansrv file descriptor
if (rv == 0 && libipm_msg_in_parse(trans, "b", &fd_present) == 0)
{
if (!fd_present)
{
// Caller didn't send chan_fd
*chan_fd = -1;
}
else
{
got_chan_fd = (libipm_msg_in_parse(trans, "h", chan_fd) == 0);
}
}
// If we've failed, close any file descriptors we've parsed so far
if (rv != 0)
{
if (got_display_fd)
{
g_file_close(*display_fd);
}
if (got_chan_fd)
{
g_file_close(*chan_fd);
}
}
else
{
*status = (enum scp_sconnect_status)i_status;
}
return rv;
}
/*****************************************************************************/
int
scp_send_list_sessions_request(struct trans *trans)
{
+65
View File
@@ -56,6 +56,9 @@ enum scp_msg_code
E_SCP_CREATE_SESSION_REQUEST,
E_SCP_CREATE_SESSION_RESPONSE,
E_SCP_CONNECT_SESSION_REQUEST,
E_SCP_CONNECT_SESSION_RESPONSE,
E_SCP_LIST_SESSIONS_REQUEST,
E_SCP_LIST_SESSIONS_RESPONSE,
@@ -413,6 +416,68 @@ scp_get_create_session_response(struct trans *trans,
int *display,
struct guid *guid);
/**
* Send an E_SCP_CONNECT_SESSION_REQUEST (SCP client)
*
* @param trans SCP transport
* @param guid Session guid
* @param flags Flags which affect the returned FDs
* @return != 0 for error
*
* Server replies with E_SCP_CONNECT_SESSION_RESPONSE
*/
int
scp_send_connect_session_request(struct trans *trans,
const struct guid *guid,
unsigned int flags);
/**
* Parse an incoming E_SCP_CONNECT_SESSION_REQUEST (SCP server)
*
* @param trans SCP transport
* @param[out] guid Session guid
* @param[out] flags Flags which affect the returned FDs
* @return != 0 for error
*/
int
scp_get_connect_session_request(struct trans *trans,
struct guid *guid,
unsigned int *flags);
/**
* Send an E_SCP_CONNECT_SESSION_RESPONSE (SCP server)
*
* @param trans SCP transport
* @param status Status of connection request
* @param display_fd File descriptor for display server
* @param chan_fd File descriptor for chansrv, or -1 for no chansrv
*
* @return != 0 for error
*/
int
scp_send_connect_session_response(struct trans *trans,
enum scp_sconnect_status status,
int display_fd,
int chan_fd);
/**
* Parse an incoming E_SCP_CONNECT_SESSION_RESPONSE (SCP client)
*
* @param trans SCP transport
* @param[out] status Status of connection request
* @param[out] display_fd File descriptor for display server
* @param[out] chan_fd File descriptor for chansrv, or -1 for no chansrv
*
* @return != 0 for error
*/
int
scp_get_connect_session_response(struct trans *trans,
enum scp_sconnect_status *status,
int *display_fd,
int *chan_fd);
/**
* Send an E_SCP_LIST_SESSIONS_REQUEST (SCP client)
*
+28
View File
@@ -85,3 +85,31 @@ scp_screate_status_to_str(enum scp_screate_status n,
return buff;
}
/*****************************************************************************/
const char *
scp_sconnect_status_to_str(enum scp_sconnect_status n,
char *buff, unsigned int buff_size)
{
const char *str =
(n == E_SCP_SCONNECT_OK) ? "OK" :
(n == E_SCP_SCONNECT_NOT_LOGGED_IN) ? "Connection is not logged in" :
(n == E_SCP_SCONNECT_NO_SUCH_GUID) ? "No such session for this user" :
(n == E_SCP_SCONNECT_NO_MEMORY) ? "No memory for connection" :
(n == E_SCP_SCONNECT_SERVER_FAIL) ? "Can't connect to X server" :
(n == E_SCP_SCONNECT_GENERAL_ERROR) ? "General session connection error" :
/* Default */ NULL;
if (str == NULL)
{
g_snprintf(buff, buff_size, "[session connection error code #%d]",
(int)n);
}
else
{
g_snprintf(buff, buff_size, "%s", str);
}
return buff;
}
+33 -1
View File
@@ -114,6 +114,39 @@ const char *
scp_screate_status_to_str(enum scp_screate_status n,
char *buff, unsigned int buff_size);
/*
* Flags passed to scp_send_connect_session_request()
*/
/**
* Set this to get an FD for chansrv
*/
#define E_SCP_SCONNECT_FLAG_NEED_CHANSRV (1<<0)
/**
* Status of a session connection request
*/
enum scp_sconnect_status
{
E_SCP_SCONNECT_OK = 0, ///< Session created
E_SCP_SCONNECT_NOT_LOGGED_IN, ///< Connection is not logged in
E_SCP_SCONNECT_NO_SUCH_GUID, ///< GUID does not exist for this user
E_SCP_SCONNECT_NO_MEMORY, ///< Memory allocation failure
E_SCP_SCONNECT_SERVER_FAIL, ///< Can't connect to X server
E_SCP_SCONNECT_GENERAL_ERROR ///< An unspecific error has occurred
};
/**
* Convert an scp_session connection code to a readable string for output
* @param n Message code
* @param buff to contain string
* @param buff_size length of buff
* @return buff is returned for convenience.
*/
const char *
scp_sconnect_status_to_str(enum scp_sconnect_status n,
char *buff, unsigned int buff_size);
/**
* Status of an list sessions message
*/
@@ -158,5 +191,4 @@ enum scp_create_sockdir_status
E_SCP_CS_OTHER_ERROR
};
#endif /* SCP_APPLICATION_TYPES_H */