#ifndef SC_PROCESS_H #define SC_PROCESS_H #include #include "common.h" #ifdef _WIN32 // not needed here, but winsock2.h must never be included AFTER windows.h # include # include # define PATH_SEPARATOR '\\' # define PRIexitcode "lu" // # define PRIsizet "Iu" # define PROCESS_NONE NULL # define NO_EXIT_CODE -1u // max value as unsigned typedef HANDLE process_t; typedef DWORD exit_code_t; #else # include # define PATH_SEPARATOR '/' # define PRIsizet "zu" # define PRIexitcode "d" # define PROCESS_NONE -1 # define NO_EXIT_CODE -1 typedef pid_t process_t; typedef int exit_code_t; #endif enum process_result { PROCESS_SUCCESS, PROCESS_ERROR_GENERIC, PROCESS_ERROR_MISSING_BINARY, }; // execute the command and write the result to the output parameter "process" enum process_result process_execute(const char *const argv[], process_t *process); // kill the process bool process_terminate(process_t pid); // wait and close the process (like waitpid()) bool process_wait(process_t pid, exit_code_t *exit_code); // wait (but does not close) the process (waitid() with WNOWAIT) bool process_wait_noclose(process_t pid, exit_code_t *exit_code); // close the process // // Semantically, process_wait = process_wait_noclose + process_close. void process_close(process_t pid); // convenience function to wait for a successful process execution // automatically log process errors with the provided process name bool process_check_success(process_t proc, const char *name); #ifndef _WIN32 // only used to find package manager, not implemented for Windows bool search_executable(const char *file); #endif // return the absolute path of the executable (the scrcpy binary) // may be NULL on error; to be freed by SDL_free char * get_executable_path(void); // returns true if the file exists and is not a directory bool is_regular_file(const char *path); #endif