about summary refs log tree commit diff stats
path: root/src/steam.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-26 13:20:34 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-03-26 13:20:34 +0100
commit1eaa7159a6416640bccf3cc3541adedcde2649b0 (patch)
treea45af1710cc233e1deeef13374af8ed7b59d79c1 /src/steam.c
parent4015c26e68a5ce812673a3d434f8d98fa21755c1 (diff)
downloadbox64-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.c93
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