2010-08-14 21:59:25 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2010-04-10 07:00:38 +04:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
2012-04-12 02:20:58 +04:00
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 of the License , or
2010-04-10 07:00:38 +04:00
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
2012-04-12 02:20:58 +04:00
Lesser General Public License for more details .
2010-04-10 07:00:38 +04:00
2012-04-12 02:20:58 +04:00
You should have received a copy of the GNU Lesser General Public License
2010-04-10 07:00:38 +04:00
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <unistd.h>
# include <stdio.h>
# include <errno.h>
# include <string.h>
# include <stdlib.h>
# include "hostname-setup.h"
# include "macro.h"
# include "util.h"
# include "log.h"
2011-10-28 21:16:33 +04:00
# if defined(TARGET_FEDORA) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MEEGO) || defined(TARGET_MAGEIA)
2010-05-08 17:00:53 +04:00
# define FILENAME " / etc / sysconfig / network"
2011-09-27 22:45:51 +04:00
# elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
2010-05-08 17:00:53 +04:00
# define FILENAME " / etc / HOSTNAME"
# elif defined(TARGET_ARCH)
# define FILENAME " / etc / rc.conf"
2010-05-09 20:13:02 +04:00
# elif defined(TARGET_GENTOO)
# define FILENAME " / etc / conf.d / hostname"
2010-05-08 17:00:53 +04:00
# endif
2010-04-10 07:00:38 +04:00
2010-08-19 05:29:43 +04:00
static int read_and_strip_hostname ( const char * path , char * * hn ) {
2011-04-16 03:57:23 +04:00
char * s ;
2010-08-19 05:29:43 +04:00
int r ;
assert ( path ) ;
assert ( hn ) ;
2012-04-22 17:47:38 +04:00
r = read_one_line_file ( path , & s ) ;
if ( r < 0 )
2010-08-19 05:29:43 +04:00
return r ;
2011-04-16 03:57:23 +04:00
hostname_cleanup ( s ) ;
2010-08-19 05:29:43 +04:00
2011-04-16 03:57:23 +04:00
if ( isempty ( s ) ) {
free ( s ) ;
2010-08-19 05:29:43 +04:00
return - ENOENT ;
}
2011-04-16 03:57:23 +04:00
* hn = s ;
2010-08-19 05:29:43 +04:00
return 0 ;
}
2010-08-19 05:02:22 +04:00
static int read_distro_hostname ( char * * hn ) {
2010-04-10 07:00:38 +04:00
2011-10-28 21:16:33 +04:00
# if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MEEGO) || defined(TARGET_MAGEIA)
2010-05-05 23:59:24 +04:00
int r ;
FILE * f ;
assert ( hn ) ;
2012-04-22 17:47:38 +04:00
f = fopen ( FILENAME , " re " ) ;
if ( ! f )
2010-05-05 23:59:24 +04:00
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 ) ;
2010-05-09 20:13:02 +04:00
if ( ! startswith_no_case ( s , " HOSTNAME= " ) )
2010-05-05 23:59:24 +04:00
continue ;
2012-04-22 17:47:38 +04:00
k = strdup ( s + 9 ) ;
if ( ! k ) {
2010-05-05 23:59:24 +04:00
r = - ENOMEM ;
goto finish ;
}
2011-04-16 03:57:23 +04:00
hostname_cleanup ( k ) ;
2010-05-09 21:12:06 +04:00
2011-04-16 03:57:23 +04:00
if ( isempty ( k ) ) {
2010-05-09 21:12:06 +04:00
free ( k ) ;
r = - ENOENT ;
2010-05-09 20:13:02 +04:00
goto finish ;
}
2010-05-05 23:59:24 +04:00
* hn = k ;
2010-07-20 23:34:25 +04:00
r = 0 ;
goto finish ;
2010-05-05 23:59:24 +04:00
}
2010-07-20 23:34:25 +04:00
r = - ENOENT ;
2010-05-05 23:59:24 +04:00
finish :
fclose ( f ) ;
return r ;
2011-09-27 22:45:51 +04:00
# elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
2010-08-19 05:29:43 +04:00
return read_and_strip_hostname ( FILENAME , hn ) ;
2010-04-10 07:00:38 +04:00
# else
return - ENOENT ;
# endif
2010-08-19 05:02:22 +04:00
}
static int read_hostname ( char * * hn ) {
int r ;
assert ( hn ) ;
/* First, try to load the generic hostname configuration file,
* that we support on all distributions */
2012-04-22 17:47:38 +04:00
r = read_and_strip_hostname ( " /etc/hostname " , hn ) ;
if ( r < 0 ) {
2010-08-19 05:02:22 +04:00
if ( r = = - ENOENT )
return read_distro_hostname ( hn ) ;
return r ;
}
2010-04-10 07:00:38 +04:00
return 0 ;
}
int hostname_setup ( void ) {
int r ;
2010-08-19 05:29:43 +04:00
char * b = NULL ;
const char * hn = NULL ;
2012-04-22 17:47:38 +04:00
bool enoent = false ;
2010-04-10 07:00:38 +04:00
2012-04-22 17:47:38 +04:00
r = read_hostname ( & b ) ;
if ( r < 0 ) {
2012-05-21 19:19:58 +04:00
hn = NULL ;
2010-08-19 05:29:43 +04:00
if ( r = = - ENOENT )
2012-04-22 17:47:38 +04:00
enoent = true ;
2010-08-19 05:29:43 +04:00
else
2010-04-10 07:00:38 +04:00
log_warning ( " Failed to read configured hostname: %s " , strerror ( - r ) ) ;
2010-08-19 05:29:43 +04:00
} else
hn = b ;
2010-04-10 07:00:38 +04:00
2012-05-21 19:19:58 +04:00
if ( isempty ( hn ) ) {
/* Don't override the hostname if it is already set
* and not explicitly configured */
if ( hostname_is_set ( ) )
goto finish ;
2011-03-14 20:05:52 +03:00
2012-04-22 17:47:38 +04:00
if ( enoent )
log_info ( " No hostname configured. " ) ;
2011-03-14 20:05:52 +03:00
hn = " localhost " ;
}
2010-08-19 05:29:43 +04:00
if ( sethostname ( hn , strlen ( hn ) ) < 0 ) {
log_warning ( " Failed to set hostname to <%s>: %m " , hn ) ;
r = - errno ;
} else
2010-04-10 07:00:38 +04:00
log_info ( " Set hostname to <%s>. " , hn ) ;
2011-03-14 20:05:52 +03:00
finish :
2010-08-19 05:29:43 +04:00
free ( b ) ;
2010-04-10 07:00:38 +04:00
return r ;
}