diff options
author | Martin Pitt <martin.pitt@ubuntu.com> | 2015-05-19 07:49:56 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-05-19 12:18:08 +0200 |
commit | 139e5336286c37d9d4a2df01931ba0a86abbac69 (patch) | |
tree | 3edcfb5098607cca83f3139260002e5a545152ae /src/shared | |
parent | e861098bf22d8e65c3b2589e7ca056e720a06483 (diff) |
hostname: Allow comments in /etc/hostname
The hostname(1) tool allows comments in /etc/hostname. Introduce a new
read_hostname_config() in hostname-util which reads a hostname configuration
file like /etc/hostname, strips out comments, whitespace, and cleans the
hostname. Use it in hostname-setup.c and hostnamed and remove duplicated code.
Update hostname manpage. Add tests.
https://launchpad.net/bugs/1053048
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/hostname-util.c | 33 | ||||
-rw-r--r-- | src/shared/hostname-util.h | 2 |
2 files changed, 35 insertions, 0 deletions
diff --git a/src/shared/hostname-util.c b/src/shared/hostname-util.c index 2998fdf2c7..e336f269fa 100644 --- a/src/shared/hostname-util.c +++ b/src/shared/hostname-util.c @@ -158,3 +158,36 @@ int sethostname_idempotent(const char *s) { return 1; } + +int read_hostname_config(const char *path, char **hostname) { + _cleanup_fclose_ FILE *f = NULL; + char l[LINE_MAX]; + char *name = NULL; + + assert(path); + assert(hostname); + + f = fopen(path, "re"); + if (!f) + return -errno; + + /* may have comments, ignore them */ + FOREACH_LINE(l, f, return -errno) { + truncate_nl(l); + if (l[0] != '\0' && l[0] != '#') { + /* found line with value */ + name = hostname_cleanup(l, false); + name = strdup(name); + if (!name) + return -ENOMEM; + break; + } + } + + if (!name) + /* no non-empty line found */ + return -ENOENT; + + *hostname = name; + return 0; +} diff --git a/src/shared/hostname-util.h b/src/shared/hostname-util.h index f2821c3078..0c4763cf5a 100644 --- a/src/shared/hostname-util.h +++ b/src/shared/hostname-util.h @@ -35,3 +35,5 @@ char* hostname_cleanup(char *s, bool lowercase); bool is_localhost(const char *hostname); int sethostname_idempotent(const char *s); + +int read_hostname_config(const char *path, char **hostname); |