X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=hostname-setup.c;h=3b988d4c8b68dfdad2c25c545d736e0adb4b470a;hb=136337ff74f05be3d42a769d9f0cb99716c5c40f;hp=67891a52e62c9d82ef49faa86ad41a45774072d4;hpb=d7c114c00030309435fc56c77c8578a25d228ebe;p=elogind.git diff --git a/hostname-setup.c b/hostname-setup.c index 67891a52e..3b988d4c8 100644 --- a/hostname-setup.c +++ b/hostname-setup.c @@ -32,56 +32,43 @@ #define LINE_MAX 4096 -static int read_hostname(char **hn) { - #if defined(TARGET_FEDORA) - int r; - FILE *f; - - assert(hn); - - if (!(f = fopen("/etc/sysconfig/network", "re"))) - return -errno; - - for (;;) { - char line[LINE_MAX]; - char *s, *k; - - if (!fgets(line, sizeof(line), f)) { - if (feof(f)) - break; - - r = -errno; - goto finish; - } - - s = strstrip(line); +#define FILENAME "/etc/sysconfig/network" +#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE) +#define FILENAME "/etc/HOSTNAME" +#elif defined(TARGET_DEBIAN) +#define FILENAME "/etc/hostname" +#elif defined(TARGET_ARCH) +#define FILENAME "/etc/rc.conf" +#elif defined(TARGET_GENTOO) +#define FILENAME "/etc/conf.d/hostname" +#endif - if (!startswith(s, "HOSTNAME=")) - continue; +static char* strip_bad_chars(char *s) { + char *p, *d; - if (!(k = strdup(s+9))) { - r = -ENOMEM; - goto finish; - } + for (p = s, d = s; *p; p++) + if ((*p >= 'a' && *p <= 'z') || + (*p >= 'A' && *p <= 'Z') || + (*p >= '0' && *p <= '9') || + *p == '-' || + *p == '_') + *(d++) = *p; - *hn = k; - break; - } + *d = 0; - r = 0; + return s; +} -finish: - fclose(f); - return r; +static int read_hostname(char **hn) { -#elif defined(TARGET_ARCH) +#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) int r; FILE *f; assert(hn); - if (!(f = fopen("/etc/rc.conf", "re"))) + if (!(f = fopen(FILENAME, "re"))) return -errno; for (;;) { @@ -98,7 +85,7 @@ finish: s = strstrip(line); - if (!startswith(s, "HOSTNAME=")) + if (!startswith_no_case(s, "HOSTNAME=")) continue; if (!(k = strdup(s+9))) { @@ -106,6 +93,14 @@ finish: goto finish; } + strip_bad_chars(k); + + if (k[0] == 0) { + free(k); + r = -ENOENT; + goto finish; + } + *hn = k; break; } @@ -116,13 +111,13 @@ finish: fclose(f); return r; -#elif defined(TARGET_SUSE) +#elif defined(TARGET_SUSE) || defined(TARGET_DEBIAN) || defined(TARGET_SLACKWARE) int r; char *s, *k; assert(hn); - if ((r = read_one_line_file("/etc/HOSTNAME", &s)) < 0) + if ((r = read_one_line_file(FILENAME, &s)) < 0) return r; k = strdup(strstrip(s)); @@ -131,24 +126,15 @@ finish: if (!k) return -ENOMEM; - *hn = k; - -#elif defined(TARGET_DEBIAN) - int r; - char *s, *k; - - assert(hn); - - if ((r = read_one_line_file("/etc/hostname", &s)) < 0) - return r; + strip_bad_chars(k); - k = strdup(strstrip(s)); - free(s); - - if (!k) - return -ENOMEM; + if (k[0] == 0) { + free(k); + return -ENOENT; + } *hn = k; + #else #warning "Don't know how to read the hostname"