mirror of
https://github.com/FeralInteractive/gamemode.git
synced 2025-06-06 15:47:20 +02:00
Add two new API calls to the client to request gamemode on behalf of another process
gamemode_request_start_for and gamemode_request_end_for
This commit is contained in:
parent
1f49432e7a
commit
ca858d6932
@ -48,6 +48,16 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
* 2 if gamemode is active and this client is registered
|
* 2 if gamemode is active and this client is registered
|
||||||
* -1 if the query failed
|
* -1 if the query failed
|
||||||
*
|
*
|
||||||
|
* int gamemode_request_start_for(pid_t pid) - Request gamemode starts for another process
|
||||||
|
* 0 if the request was sent successfully
|
||||||
|
* -1 if the request failed
|
||||||
|
* -2 if the request was rejected
|
||||||
|
*
|
||||||
|
* int gamemode_request_end_for(pid_t pid) - Request gamemode ends for another process
|
||||||
|
* 0 if the request was sent successfully
|
||||||
|
* -1 if the request failed
|
||||||
|
* -2 if the request was rejected
|
||||||
|
*
|
||||||
* const char* gamemode_error_string() - Get an error string
|
* const char* gamemode_error_string() - Get an error string
|
||||||
* returns a string describing any of the above errors
|
* returns a string describing any of the above errors
|
||||||
*/
|
*/
|
||||||
@ -61,6 +71,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
static char internal_gamemode_client_error_string[512] = { 0 };
|
static char internal_gamemode_client_error_string[512] = { 0 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,12 +86,15 @@ static volatile int internal_libgamemode_loaded = 1;
|
|||||||
/* Typedefs for the functions to load */
|
/* Typedefs for the functions to load */
|
||||||
typedef int (*api_call_return_int)(void);
|
typedef int (*api_call_return_int)(void);
|
||||||
typedef const char *(*api_call_return_cstring)(void);
|
typedef const char *(*api_call_return_cstring)(void);
|
||||||
|
typedef int (*api_call_pid_return_int)(pid_t);
|
||||||
|
|
||||||
/* Storage for functors */
|
/* Storage for functors */
|
||||||
static api_call_return_int REAL_internal_gamemode_request_start = NULL;
|
static api_call_return_int REAL_internal_gamemode_request_start = NULL;
|
||||||
static api_call_return_int REAL_internal_gamemode_request_end = NULL;
|
static api_call_return_int REAL_internal_gamemode_request_end = NULL;
|
||||||
static api_call_return_int REAL_internal_gamemode_query_status = NULL;
|
static api_call_return_int REAL_internal_gamemode_query_status = NULL;
|
||||||
static api_call_return_cstring REAL_internal_gamemode_error_string = NULL;
|
static api_call_return_cstring REAL_internal_gamemode_error_string = NULL;
|
||||||
|
static api_call_pid_return_int REAL_internal_gamemode_request_start_for = NULL;
|
||||||
|
static api_call_pid_return_int REAL_internal_gamemode_request_end_for = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal helper to perform the symbol binding safely.
|
* Internal helper to perform the symbol binding safely.
|
||||||
@ -145,6 +160,14 @@ __attribute__((always_inline)) static inline int internal_load_libgamemode(void)
|
|||||||
(void **)&REAL_internal_gamemode_error_string,
|
(void **)&REAL_internal_gamemode_error_string,
|
||||||
sizeof(REAL_internal_gamemode_error_string),
|
sizeof(REAL_internal_gamemode_error_string),
|
||||||
true },
|
true },
|
||||||
|
{ "real_gamemode_request_start_for",
|
||||||
|
(void **)&REAL_internal_gamemode_request_start_for,
|
||||||
|
sizeof(REAL_internal_gamemode_request_start_for),
|
||||||
|
false },
|
||||||
|
{ "real_gamemode_request_end_for",
|
||||||
|
(void **)&REAL_internal_gamemode_request_end_for,
|
||||||
|
sizeof(REAL_internal_gamemode_request_end_for),
|
||||||
|
false },
|
||||||
};
|
};
|
||||||
|
|
||||||
void *libgamemode = NULL;
|
void *libgamemode = NULL;
|
||||||
@ -273,4 +296,40 @@ __attribute__((always_inline)) static inline int gamemode_query_status(void)
|
|||||||
return REAL_internal_gamemode_query_status();
|
return REAL_internal_gamemode_query_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Redirect to the real libgamemode */
|
||||||
|
__attribute__((always_inline)) static inline int gamemode_request_start_for(pid_t pid)
|
||||||
|
{
|
||||||
|
/* Need to load gamemode */
|
||||||
|
if (internal_load_libgamemode() < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (REAL_internal_gamemode_request_start_for == NULL) {
|
||||||
|
snprintf(internal_gamemode_client_error_string,
|
||||||
|
sizeof(internal_gamemode_client_error_string),
|
||||||
|
"gamemode_request_start_for missing (older host?)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return REAL_internal_gamemode_request_start_for(pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Redirect to the real libgamemode */
|
||||||
|
__attribute__((always_inline)) static inline int gamemode_request_end_for(pid_t pid)
|
||||||
|
{
|
||||||
|
/* Need to load gamemode */
|
||||||
|
if (internal_load_libgamemode() < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (REAL_internal_gamemode_request_end_for == NULL) {
|
||||||
|
snprintf(internal_gamemode_client_error_string,
|
||||||
|
sizeof(internal_gamemode_client_error_string),
|
||||||
|
"gamemode_request_end_for missing (older host?)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return REAL_internal_gamemode_request_end_for(pid);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CLIENT_GAMEMODE_H
|
#endif // CLIENT_GAMEMODE_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user