diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-26 13:20:34 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-26 13:20:34 +0100 |
| commit | 1eaa7159a6416640bccf3cc3541adedcde2649b0 (patch) | |
| tree | a45af1710cc233e1deeef13374af8ed7b59d79c1 /src/steam.c | |
| parent | 4015c26e68a5ce812673a3d434f8d98fa21755c1 (diff) | |
| download | box64-1eaa7159a6416640bccf3cc3541adedcde2649b0.tar.gz box64-1eaa7159a6416640bccf3cc3541adedcde2649b0.zip | |
More work around steam and proton/SteamPlay (working, but need also latest box86)
Diffstat (limited to 'src/steam.c')
| -rw-r--r-- | src/steam.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/steam.c b/src/steam.c new file mode 100644 index 00000000..ddbb7c6a --- /dev/null +++ b/src/steam.c @@ -0,0 +1,93 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/wait.h> +#include <unistd.h> +#include <errno.h> + +#include "debug.h" +#include "box64context.h" +#include "fileutils.h" + +void pressure_vessel(int argc, const char** argv, int nextarg) +{ + // skip all the parameter, but parse some of them + if(argv[nextarg][0]=='-' && argv[nextarg][1]=='-') + while(argv[nextarg][0]=='-' && argv[nextarg][1]=='-') { + if(strstr(argv[nextarg], "--env-if-host=PRESSURE_VESSEL_APP_LD_LIBRARY_PATH=")==argv[nextarg]) { + // transform RESSURE_VESSEL_APP_LD_LIBRARY_PATH to BOX86_ / BOX64_ LD_LIBRARY_PATH + char tmp[strlen(argv[nextarg])]; + strcpy(tmp, ""); + strcat(tmp, argv[nextarg]+strlen("--env-if-host=PRESSURE_VESSEL_APP_")); + char *p = strchr(tmp, '='); + *p ='\0'; ++p; + setenv(tmp, p, 1); + printf_log(/*LOG_DEBUG*/LOG_INFO, "setenv(%s, %s, 1)\n", tmp, p); + } else if(strstr(argv[nextarg], "--env-if-host=STEAM_RUNTIME_LIBRARY_PATH=")==argv[nextarg]) { + // transform RESSURE_VESSEL_APP_LD_LIBRARY_PATH to BOX86_ / BOX64_ LD_LIBRARY_PATH + char tmp[strlen(argv[nextarg])]; + strcpy(tmp, "BOX86_LD_"); + strcat(tmp, argv[nextarg]+strlen("--env-if-host=STEAM_RUNTIME_")); + char *p = strchr(tmp, '='); + *p ='\0'; ++p; + setenv(tmp, p, 1); + printf_log(/*LOG_DEBUG*/LOG_INFO, "setenv(%s, %s, 1)\n", tmp, p); + tmp[3] = '6'; + tmp[4] = '4'; + setenv(tmp, p, 1); + printf_log(/*LOG_DEBUG*/LOG_INFO, "setenv(%s, %s, 1)\n", tmp, p); + } else if(!strcmp(argv[nextarg], "--")) { + printf_log(/*LOG_DEBUG*/LOG_INFO, "End of pressure-vessel-wrap parameters\n"); + }else { + printf_log(/*LOG_DEBUG*/LOG_INFO, "Ignored parameter: \"%s\"\n", argv[nextarg]); + } + ++nextarg; + } + printf_log(/*LOG_DEBUG*/LOG_INFO, "Ready to launch \"%s\", nextarg=%d, argc=%d\n", argv[nextarg], nextarg, argc); + const char* prog = argv[nextarg]; + my_context = NewBox64Context(argc - nextarg); + int x86 = my_context->box86path?FileIsX86ELF(argv[nextarg]):0; + int x64 = my_context->box64path?FileIsX64ELF(argv[nextarg]):0; + // create the new argv array + const char** newargv = (const char**)calloc((argc-nextarg)+1+((x86 || x64)?1:0), sizeof(char*)); + if(x86 || x64) { + newargv[0] = x64?my_context->box64path:my_context->box86path; + printf_log(/*LOG_DEBUG*/LOG_INFO, "argv[%d]=\"%s\"\n", 0, newargv[0]); + for(int i=nextarg; i<argc; ++i) { + printf_log(/*LOG_DEBUG*/LOG_INFO, "argv[%d]=\"%s\"\n", 1+i-nextarg, argv[i]); + newargv[1+i-nextarg] = argv[i]; + } + } else { + for(int i=nextarg; i<argc; ++i) { + printf_log(/*LOG_DEBUG*/LOG_INFO, "argv[%d]=\"%s\"\n", i-nextarg, argv[i]); + newargv[i-nextarg] = argv[i]; + } + } + +//setenv("BOX64_TRACE_FILE", "/home/seb/trace64-%pid.txt", 1); +//setenv("BOX86_TRACE_FILE", "/home/seb/trace86-%pid.txt", 1); +//setenv("BOX86_LOG", "1", 1); +//setenv("BOX64_LOG", "1", 1); +//setenv("BOX86_SHOWSEGV", "1", 1); +//setenv("BOX64_SHOWSEGV", "1", 1); + + printf_log(/*LOG_DEBUG*/LOG_INFO, "Run %s %s and wait\n", x86?"i386":(x64?"x86_64":""), argv[nextarg]); + pid_t v = vfork(); + if(v==-1) { + printf_log(LOG_NONE, "vfork failed!\n"); + FreeBox64Context(&my_context); + return; + } + if(!v) { + // child process, exec the program... + int ret = execvp(newargv[0], (char * const*)newargv); + printf_log(/*LOG_DEBUG*/LOG_INFO, "Error launching program: %d (%s)\n", ret, strerror(errno)); + exit(0); + } else { + // parent process, wait the end of child + FreeBox64Context(&my_context); + int wstatus; + waitpid(v, &wstatus, 0); + exit(0); + } +} \ No newline at end of file |