Author: danielsh
Date: Wed Jan 28 07:58:40 2015
New Revision: 1655235
URL: http://svn.apache.org/r1655235
Log:
svn --version --verbose: Support /etc/os-release, the systemd "what distro
am I running" API.
Review by: stsp, brane, philip
* subversion/libsvn_subr/sysinfo.c
(linux_release_name): Try /etc/os-release if /usr/bin/lsb_release fails.
(systemd_release): New helper for linux_release_name().
Modified:
subversion/trunk/subversion/libsvn_subr/sysinfo.c
Modified: subversion/trunk/subversion/libsvn_subr/sysinfo.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sysinfo.c?rev=1655235&r1=1655234&r2=1655235&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sysinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sysinfo.c Wed Jan 28 07:58:40 2015
@@ -410,6 +410,63 @@ lsb_release(apr_pool_t *pool)
return NULL;
}
+/* Read /etc/os-release, as documented here:
+ * http://www.freedesktop.org/software/systemd/man/os-release.html
+ */
+static const char *
+systemd_release(apr_pool_t *pool)
+{
+ svn_error_t *err;
+ svn_stream_t *stream;
+
+ /* Open the file. */
+ err = svn_stream_open_readonly(&stream, "/etc/os-release", pool, pool);
+ if (err && APR_STATUS_IS_ENOENT(err->apr_err))
+ {
+ svn_error_clear(err);
+ err = svn_stream_open_readonly(&stream, "/usr/lib/os-release", pool,
+ pool);
+ }
+ if (err)
+ {
+ svn_error_clear(err);
+ return NULL;
+ }
+
+ /* Look for the PRETTY_NAME line. */
+ while (TRUE)
+ {
+ svn_stringbuf_t *line;
+ svn_boolean_t eof;
+
+ err = svn_stream_readline(stream, &line, "\n", &eof, pool);
+ if (err)
+ {
+ svn_error_clear(err);
+ return NULL;
+ }
+
+ if (!strncmp(line->data, "PRETTY_NAME=", 12))
+ {
+ svn_stringbuf_t *release_name;
+
+ /* The value may or may not be enclosed by double quotes. We don't
+ * attempt to strip them. */
+ release_name = svn_stringbuf_create(line->data + 12, pool);
+ svn_error_clear(svn_stream_close(stream));
+ svn_stringbuf_strip_whitespace(release_name);
+ return release_name->data;
+ }
+
+ if (eof)
+ break;
+ }
+
+ /* The file did not contain a PRETTY_NAME line. */
+ svn_error_clear(svn_stream_close(stream));
+ return NULL;
+}
+
/* Read the whole contents of a file. */
static svn_stringbuf_t *
read_file_contents(const char *filename, apr_pool_t *pool)
@@ -527,6 +584,10 @@ linux_release_name(apr_pool_t *pool)
Covers, for example, Debian, Ubuntu and SuSE. */
const char *release_name = lsb_release(pool);
+ /* Try the systemd way (covers Arch). */
+ if (!release_name)
+ release_name = systemd_release(pool);
+
/* Try RHEL/Fedora/CentOS */
if (!release_name)
release_name = redhat_release(pool);