diff options
-rw-r--r-- | main.c | 10 | ||||
-rw-r--r-- | src/gpu.c | 37 | ||||
-rw-r--r-- | src/gpu.h | 2 |
3 files changed, 38 insertions, 11 deletions
@@ -143,11 +143,11 @@ int main(int argc, char *argv[]) { printf("\n"); lc++; - printf("%s ", LOGO[lc]); - printf(COLOR"%s%s"RESET, "GPU", ": "); - display_gpu(); - printf("\n"); - lc++; + if (display_gpu()) { + printf("%s ", LOGO[lc]); + printf(COLOR"%s%s%s\n"RESET, "GPU", ": ", display_gpu()); + lc++; + } printf("%s ", LOGO[lc]); printf(COLOR"%s%s"RESET, "Memory", ": "); @@ -3,26 +3,53 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <unistd.h> -void run_gpu_command(const char *command) { +const char *run_gpu_command(const char *command) { + if ( + access("/bin/glxinfo", F_OK) == -1 || + access("/usr/bin/glxinfo", F_OK) == -1 || + access("/usr/local/bin/glxinfo", F_OK) == -1 || + access("/usr/X11R6/bin/glxinfo", F_OK) == -1 || + access("/usr/X11R7/bin/glxinfo", F_OK) == -1 || + access("/usr/pkg/bin/glxinfo", F_OK) == -1 + ) return NULL; char buf[128]; + char *out = NULL; + size_t outsize = 0; FILE *p = popen(command, "r"); if (!p) { fprintf(stderr, "GPUコマンドを実効に失敗: %s", command); - return; + return NULL; } while (fgets(buf, sizeof(buf), p) != NULL) { buf[strcspn(buf, "\n")] = '\0'; - printf("%s", buf); + + size_t len = strlen(buf); + char *nout = realloc(out, outsize + len + 1); + if (nout == NULL) { + perror("メモリの役割に失敗"); + free(out); + pclose(p); + return NULL; + } + + out = nout; + + memccpy(out + outsize, buf, sizeof(buf), len); + outsize += len; + out[outsize] = '\0'; } pclose(p); + + return out; } -void display_gpu() { - run_gpu_command("glxinfo -B | grep -F 'OpenGL renderer string' | " +const char *display_gpu() { + return run_gpu_command("glxinfo -B | grep -F 'OpenGL renderer string' | " "sed 's/OpenGL renderer string: //' | sed 's/Mesa //' | " "sed 's/DRI //' | sed 's/(R)//' | sed 's/(.*$//'"); } @@ -1,6 +1,6 @@ #ifndef GPU_H #define GPU_H -void display_gpu(); +const char *display_gpu(); #endif |