16 {
17 static char binary_path[256];
19
21 return binary_path;
22 }
23
24#ifdef _WIN32
25
26 const char *candidates[] = {
27 "./build/bin/ascii-chat.exe",
28 "./bin/ascii-chat.exe",
29 "ascii-chat.exe",
30 };
31 const char *fallback = "./build/bin/ascii-chat.exe";
32#else
33
34 bool in_docker = (access("/.dockerenv", F_OK) == 0);
35 const char *build_dir = getenv("BUILD_DIR");
36
37
38 if (build_dir) {
39 safe_snprintf(binary_path,
sizeof(binary_path),
"./%s/bin/ascii-chat", build_dir);
40 if (access(binary_path, X_OK) == 0) {
42 return binary_path;
43 }
44 }
45
46
47 const char *candidates[] = {
48
49 in_docker ? "./build_docker/bin/ascii-chat" : "./build/bin/ascii-chat",
50
51 "./bin/ascii-chat",
52
53 in_docker ? "/app/build_docker/bin/ascii-chat" : NULL,
54 };
55 const char *fallback = in_docker ? "./build_docker/bin/ascii-chat" : "./build/bin/ascii-chat";
56#endif
57
58
59 for (size_t i = 0; i < sizeof(candidates) / sizeof(candidates[0]); i++) {
60 if (candidates[i] && access(candidates[i], X_OK) == 0) {
61 safe_snprintf(binary_path,
sizeof(binary_path),
"%s", candidates[i]);
63 return binary_path;
64 }
65 }
66
67
68 safe_snprintf(binary_path,
sizeof(binary_path),
"%s", fallback);
70 return binary_path;
71}
int safe_snprintf(char *buffer, size_t buffer_size, const char *format,...)
Safe formatted string printing to buffer.