#define USE_THE_REPOSITORY_VARIABLE #include "git-compat-util.h" #include "version.h" #include "strbuf.h" #include "gettext.h" #ifndef GIT_VERSION_H # include "version-def.h" #else # include GIT_VERSION_H #endif const char git_version_string[] = GIT_VERSION; const char git_built_from_commit_string[] = GIT_BUILT_FROM_COMMIT; /* * Trim and replace each character with ascii code below 32 or above * 127 (included) using a dot '.' character. */ static void redact_non_printables(struct strbuf *buf) { strbuf_trim(buf); for (size_t i = 0; i < buf->len; i++) { if (!isprint(buf->buf[i]) || buf->buf[i] == ' ') buf->buf[i] = '.'; } } const char *git_user_agent(void) { static const char *agent = NULL; if (!agent) { agent = getenv("GIT_USER_AGENT"); if (!agent) agent = GIT_USER_AGENT; } return agent; } /* Retrieve, sanitize and cache operating system info for subsequent calls. Return a pointer to the sanitized operating system info string. */ static const char *os_info(void) { static const char *os = NULL; if (!os) { struct strbuf buf = STRBUF_INIT; get_uname_info(&buf, 0); /* Sanitize the os information immediately */ redact_non_printables(&buf); os = strbuf_detach(&buf, NULL); } return os; } const char *git_user_agent_sanitized(void) { static const char *agent = NULL; if (!agent) { struct strbuf buf = STRBUF_INIT; strbuf_addstr(&buf, git_user_agent()); if (!getenv("GIT_USER_AGENT")) { strbuf_addch(&buf, '-'); strbuf_addstr(&buf, os_info()); } redact_non_printables(&buf); agent = strbuf_detach(&buf, NULL); } return agent; } int get_uname_info(struct strbuf *buf, unsigned int full) { struct utsname uname_info; if (uname(&uname_info)) { strbuf_addf(buf, _("uname() failed with error '%s' (%d)\n"), strerror(errno), errno); return -1; } if (full) strbuf_addf(buf, "%s %s %s %s\n", uname_info.sysname, uname_info.release, uname_info.version, uname_info.machine); else strbuf_addf(buf, "%s\n", uname_info.sysname); return 0; }