@ -4,7 +4,10 @@
*/
# include <ctype.h>
# include <net/if.h>
# include <sys/socket.h>
# include <sys/ioctl.h>
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
@ -13,173 +16,135 @@
# include <sys/stat.h>
# include <debconfclient.h>
# include "util.h"
static char * interface = NULL ;
static char * hostname = NULL ;
static char * domain = NULL ;
static char * dhcp_hostname = NULL ;
static int do_dhcp = 0 ;
static u_int32_t ipaddress = 0 ;
static u_int32_t network = 0 ;
static u_int32_t broadcast = 0 ;
static u_int32_t netmask = 0 ;
static u_int32_t gateway = 0 ;
static u_int32_t nameservers [ 4 ] = { 0 } ;
static struct debconfclient * client ;
static char buf [ MAXLINE ] ;
# ifdef DEBUG
# define INTERFACES_FILE "etc / network / interfaces"
# define HOSTS_FILE "etc / hosts"
# define NETWORKS_FILE "etc / networks"
# define RESOLV_FILE "etc / resolv.conf"
# define DHCPCD_FILE "etc / dhcpc / config"
# else
# define INTERFACES_FILE " / etc / network / interfaces"
# define HOSTS_FILE " / etc / hosts"
# define NETWORKS_FILE " / etc / networks"
# define RESOLV_FILE " / etc / resolv.conf"
# define DHCPCD_FILE " / etc / dhcpc / config"
# endif
# define MAXLINE 1024
static char * interface = NULL ;
static char * hostname = NULL ;
static struct debconfclient * client ;
static char buf [ MAXLINE ] ;
/**
* dot2num and num2dot
* Copyright : Karl Hammar , Aspö Data
*/
char *
dot2num ( u_int32_t * num , char * dot )
{
char * p = dot - 1 ;
char * e ;
int ix ;
unsigned long val ;
int is_interface_up ( char * inter ) ;
void getif_start ( void ) ;
void getif_end ( void ) ;
char * getif ( int all ) ;
void get_name ( char * name , char * p ) ;
char * get_ifdsc ( const char * ifp ) ;
int get_interface ( ) ;
FILE * file_open ( char * path ) ;
int activate_net ( ) ;
if ( ! dot )
return NULL ;
* num = 0 ;
for ( ix = 0 ; ix < 4 ; ix + + )
{
* num < < = 8 ;
p + + ;
val = strtoul ( p , & e , 10 ) ;
if ( e = = p )
val = 0 ;
else if ( val > 255 )
return NULL ;
* num + = val ;
/*printf("%#8x, %#2x\n", *num, val); */
if ( ix < 3 & & * e ! = ' . ' )
return NULL ;
p = e ;
}
void debconf_unseen ( char * template ) ;
void debconf_subst ( char * template , char * key , char * string ) ;
char * debconf_input ( char * priority , char * template ) ;
return p ;
}
# ifdef DHCP
static char * dhcp_hostname = NULL ;
static char num2dot_buf [ 16 ] ;
void write_dhcp_cfg ( void ) ;
char *
num2dot ( u_int32_t num )
int
main ( int argc , char * argv [ ] )
{
int byte [ 4 ] ;
int ix ;
char * dot = num2dot_buf ;
client = debconfclient_new ( ) ;
if ( num = = 0 )
return NULL ;
client - > command ( client , " title " , " Network Configuration " , NULL ) ;
for ( ix = 3 ; ix > = 0 ; ix - - )
{
byte [ ix ] = num & 0xff ;
num > > = 8 ;
}
sprintf ( dot , " %d.%d.%d.%d " , byte [ 0 ] , byte [ 1 ] , byte [ 2 ] , byte [ 3 ] ) ;
client - > command ( client , " input " , " high " , " netcfg/dhcp_hostname " , NULL ) ;
client - > command ( client , " go " , NULL ) ;
client - > command ( client , " get " , " netcfg/dhcp_hostname " , NULL ) ;
dhcp_hostname = client - > value ;
write_dhcp_cfg ( ) ;
activate_dhcp_net ( ) ;
return dot ;
return 0 ;
}
void
write_dhcp_cfg ( void ) {
char *
debconf_input ( char * priority , char * template )
{
client - > command ( client , " input " , priority , template , NULL ) ;
client - > command ( client , " go " , NULL ) ;
client - > command ( client , " get " , template , NULL ) ;
return client - > value ;
FILE * fp ;
if ( ( fp = file_open ( INTERFACES_FILE ) ) )
{
fprintf ( fp , " \n # This entry was created during the Debian installation \n " ) ;
fprintf ( fp , " iface %s inet dhcp \n " , interface ) ;
}
if ( ( fp = file_open ( DHCPCD_FILE ) ) )
{
fprintf ( fp , " \n # dhcpcd configuration: created during the Debian installation \n " ) ;
fprintf ( fp , " IFACE=%s " , interface ) ;
if ( dhcp_hostname )
fprintf ( fp , " OPTIONS='-h %s' " , dhcp_hostname ) ;
}
}
void
debconf_subst ( char * template , char * key , char * string )
int
activate_dhcp_net ( )
{
if ( string )
client - > command ( client , " subst " , template , key , string , NULL ) ;
else
client - > command ( client , " subst " , template , key , " <none> " , NULL ) ;
}
char * ptr ;
int rv ;
system ( " /sbin/ifconfig lo 127.0.0.1 " ) ;
ptr = buf ;
ptr + = snprintf ( buf , sizeof ( buf ) , " /sbin/dhcpcd-2.2.x " ) ;
if ( dhcp_hostname )
snprintf ( ptr , sizeof ( buf ) - ( ptr - buf ) , " -h %s " , dhcp_hostname ) ;
void
debconf_unseen ( char * template )
{
client - > command ( client , " fset " , template , " seen " , " false " , NULL ) ;
rv = system ( buf ) ;
fprintf ( stderr , " rv = %d \n " , rv ) ;
if ( rv ! = 0 ) {
client - > command ( client , " input " , " critical " , " netcfg/error_cfg " , NULL ) ;
client - > command ( client , " go " , NULL ) ;
}
return 0 ;
}
/*
* Get all available interfaces from the kernel and ask the user which one
* he wants to configure
*/
int
get_interface ( )
{
char * ptr = buf ;
char * inter ;
debconf_unseen ( " netcfg/choose_interface " ) ;
# endif /* DHCP */
getif_start ( ) ;
while ( ( inter = getif ( 1 ) ) ! = NULL )
{
ptr + =
snprintf ( ptr , sizeof ( buf ) - strlen ( buf ) , " %s: %s, " , inter ,
get_ifdsc ( inter ) ) ;
if ( ptr > ( buf + sizeof ( buf ) ) )
{
fprintf ( stderr , " Internal error. \n " ) ;
exit ( 1 ) ;
}
}
getif_end ( ) ;
# ifdef STATIC
if ( ptr = = buf )
{
client - > command ( client , " input " , " high " , " netcfg/no_interfaces " , NULL ) ;
client - > command ( client , " go " , NULL ) ;
return - 1 ;
}
static char * domain = NULL ;
static u_int32_t ipaddress = 0 ;
static u_int32_t network = 0 ;
static u_int32_t broadcast = 0 ;
static u_int32_t netmask = 0 ;
static u_int32_t gateway = 0 ;
static u_int32_t nameservers [ 4 ] = { 0 } ;
debconf_subst ( " netcfg/choose_interface " , " ifchoices " , buf ) ;
static struct debconfclient * client ;
ptr = debconf_input ( " critical " , " netcfg/choose_interface " ) ;
/* grab just the interface name, not the description too */
* ( strchr ( ptr , ' : ' ) ) = ' \0 ' ;
static char buf [ MAXLINE ] ;
interface = strdup ( ptr ) ;
debconf_subst ( " netcfg/confirm_static_cfg " , " interface " , interface ) ;
void get_static_cfg ( void ) ;
void write_static_cfg ( void ) ;
char * dot2num ( u_int32_t * num , char * dot ) ;
char * num2dot ( u_int32_t num ) ;
int
main ( int argc , char * argv [ ] )
{
client = debconfclient_new ( ) ;
client - > command ( client , " title " , " Network Configuration " , NULL ) ;
get_static_cfg ( ) ;
write_static_cfg ( ) ;
activate_static_net ( ) ;
return 0 ;
}
void
get_static_cfg ( void )
{
@ -287,21 +252,6 @@ get_static_cfg (void)
}
FILE *
file_open ( char * path )
{
FILE * fp ;
if ( ( fp = fopen ( path , " w " ) ) )
return fp ;
else
{
perror ( " fopen " ) ;
return NULL ;
}
}
void
write_static_cfg ( void )
@ -359,46 +309,72 @@ write_static_cfg (void)
}
/**
* dot2num and num2dot
* Copyright : Karl Hammar , Aspö Data
*/
char *
dot2num ( u_int32_t * num , char * dot )
{
char * p = dot - 1 ;
char * e ;
int ix ;
unsigned long val ;
if ( ! dot )
return NULL ;
* num = 0 ;
for ( ix = 0 ; ix < 4 ; ix + + )
{
* num < < = 8 ;
p + + ;
val = strtoul ( p , & e , 10 ) ;
if ( e = = p )
val = 0 ;
else if ( val > 255 )
return NULL ;
* num + = val ;
/*printf("%#8x, %#2x\n", *num, val); */
if ( ix < 3 & & * e ! = ' . ' )
return NULL ;
p = e ;
}
return p ;
}
static char num2dot_buf [ 16 ] ;
void
write_dhcp_cfg ( void ) {
char *
num2dot ( u_int32_t num )
{
int byte [ 4 ] ;
int ix ;
char * dot = num2dot_buf ;
FILE * fp ;
if ( ( fp = file_open ( INTERFACES_FILE ) ) )
if ( num = = 0 )
return NULL ;
for ( ix = 3 ; ix > = 0 ; ix - - )
{
fprintf ( fp , " \n # This entry was created during the Debian installation \n " ) ;
fprintf ( fp , " iface %s inet dhcp \n " , interface ) ;
byte [ ix ] = num & 0xff ;
num > > = 8 ;
}
if ( ( fp = file_open ( DHCPCD_FILE ) ) )
{
fprintf ( fp , " \n # dhcpcd configuration: created during the Debian installation \n " ) ;
fprintf ( fp , " IFACE=%s " , interface ) ;
if ( dhcp_hostname )
fprintf ( fp , " OPTIONS='-h %s' " , dhcp_hostname ) ;
}
}
sprintf ( dot , " %d.%d.%d.%d " , byte [ 0 ] , byte [ 1 ] , byte [ 2 ] , byte [ 3 ] ) ;
return dot ;
}
int
activate_net ( )
activate_static_net ( )
{
char * ptr ;
int rv ;
system ( " /sbin/ifconfig lo 127.0.0.1 " ) ;
if ( do_dhcp ) {
ptr = buf ;
ptr + = snprintf ( buf , sizeof ( buf ) , " /sbin/dhcpcd-2.2.x " ) ;
if ( dhcp_hostname )
snprintf ( ptr , sizeof ( buf ) - ( ptr - buf ) , " -h %s " , dhcp_hostname ) ;
}
else {
snprintf ( buf , sizeof ( buf ) ,
" /sbin/ifconfig %s %s netmask %s broadcast %s " , interface ,
num2dot ( ipaddress ) , num2dot ( netmask ) , num2dot ( broadcast ) ) ;
}
rv = system ( buf ) ;
fprintf ( stderr , " rv = %d \n " , rv ) ;
@ -410,31 +386,253 @@ activate_net ()
}
# endif /* STATIC */
char *
debconf_input ( char * priority , char * template )
{
client - > command ( client , " input " , priority , template , NULL ) ;
client - > command ( client , " go " , NULL ) ;
client - > command ( client , " get " , template , NULL ) ;
return client - > value ;
}
void
debconf_subst ( char * template , char * key , char * string )
{
if ( string )
client - > command ( client , " subst " , template , key , string , NULL ) ;
else
client - > command ( client , " subst " , template , key , " <none> " , NULL ) ;
}
void
debconf_unseen ( char * template )
{
client - > command ( client , " fset " , template , " seen " , " false " , NULL ) ;
}
int
main ( int argc , char * argv [ ] )
is_interface_up ( char * inter )
{
struct ifreq ifr ;
int sfd = - 1 , ret = - 1 ;
char * ptr ;
client = debconfclient_new ( ) ;
if ( ( sfd = socket ( AF_INET , SOCK_DGRAM , 0 ) ) = = - 1 )
goto int_up_done ;
client - > command ( client , " title " , " Network Configuration " , NULL ) ;
strncpy ( ifr . ifr_name , inter , sizeof ( ifr . ifr_name ) ) ;
if ( ioctl ( sfd , SIOCGIFFLAGS , & ifr ) < 0 )
goto int_up_done ;
ret = ( ifr . ifr_flags & IFF_UP ) ? 1 : 0 ;
int_up_done :
if ( sfd ! = - 1 )
close ( sfd ) ;
return ret ;
}
static FILE * ifs = NULL ;
static char ibuf [ 512 ] ;
void
getif_start ( void )
{
if ( ifs ! = NULL )
{
fclose ( ifs ) ;
ifs = NULL ;
}
if ( ( ifs = fopen ( " /proc/net/dev " , " r " ) ) ! = NULL )
{
fgets ( ibuf , sizeof ( ibuf ) , ifs ) ; /* eat header */
fgets ( ibuf , sizeof ( ibuf ) , ifs ) ; /* ditto */
}
return ;
}
void
getif_end ( void )
{
if ( ifs ! = NULL )
{
fclose ( ifs ) ;
ifs = NULL ;
}
return ;
}
char *
getif ( int all )
{
char rbuf [ 512 ] ;
if ( ifs = = NULL )
return NULL ;
if ( fgets ( rbuf , sizeof ( rbuf ) , ifs ) ! = NULL )
{
get_name ( ibuf , rbuf ) ;
if ( ! strcmp ( ibuf , " lo " ) ) /* ignore the loopback */
return getif ( all ) ; /* seriously doubt there is an infinite number of lo devices */
if ( all | | is_interface_up ( ibuf ) = = 1 )
return ibuf ;
}
return NULL ;
}
void
get_name ( char * name , char * p )
{
while ( isspace ( * p ) )
p + + ;
while ( * p )
{
if ( isspace ( * p ) )
break ;
if ( * p = = ' : ' )
{ /* could be an alias */
char * dot = p , * dotname = name ;
* name + + = * p + + ;
while ( isdigit ( * p ) )
* name + + = * p + + ;
if ( * p ! = ' : ' )
{ /* it wasn't, backup */
p = dot ;
name = dotname ;
}
if ( * p = = ' \0 ' )
return ;
p + + ;
break ;
}
* name + + = * p + + ;
}
* name + + = ' \0 ' ;
return ;
}
ptr = debconf_input ( " critical " , " netcfg/dhcp_option " ) ;
if ( strstr ( ptr , " true " ) )
/*
* Get a description for an interface ( i . e . " Ethernet " for ethX ) .
*/
char *
get_ifdsc ( const char * ifp )
{
int i ;
struct if_alist_struct
{
do_dhcp = 1 ;
dhcp_hostname = debconf_input ( " high " , " netcfg/dhcp_hostname " ) ;
write_dhcp_cfg ( ) ;
char * interface ;
char * description ;
}
else
interface_alist [ ] =
{
get_static_cfg ( ) ;
write_static_cfg ( ) ;
}
/*
* A _ ( " string " ) is an element of a char * [ ] , and the linker will
* know where to find the elements . This works with ` pointerize ' ;
* perhaps that ' s different with ` gettext ' . . . though if it expands
* to a function call , this initializer should still work fine .
* Also see the 1.66 version of choose_cdrom ( ) , which uses the
* similar technique . If it works there , it will work here .
*/
{
" eth " , " Ethernet or Fast Ethernet " }
,
{
" pcmcia " , " PC-Card (PCMCIA) Ethernet or Token Ring " }
,
{
" tr " , " Token Ring " }
,
{
" arc " , " Arcnet " }
,
{
" slip " , " Serial-line IP " }
,
{
" plip " , " Parallel-line IP " }
,
{
NULL , NULL }
} ;
for ( i = 0 ; interface_alist [ i ] . interface ! = NULL ; i + + )
if ( ! strncmp ( ifp , interface_alist [ i ] . interface ,
strlen ( interface_alist [ i ] . interface ) ) )
return interface_alist [ i ] . description ;
return NULL ;
}
/*
* Get all available interfaces from the kernel and ask the user which one
* he wants to configure
*/
int
get_interface ( )
{
char * ptr = buf ;
char * inter ;
activate_net ( ) ;
debconf_unseen ( " netcfg/choose_interface " ) ;
getif_start ( ) ;
while ( ( inter = getif ( 1 ) ) ! = NULL )
{
ptr + =
snprintf ( ptr , sizeof ( buf ) - strlen ( buf ) , " %s: %s, " , inter ,
get_ifdsc ( inter ) ) ;
if ( ptr > ( buf + sizeof ( buf ) ) )
{
fprintf ( stderr , " Internal error. \n " ) ;
exit ( 1 ) ;
}
}
getif_end ( ) ;
if ( ptr = = buf )
{
client - > command ( client , " input " , " high " , " netcfg/no_interfaces " , NULL ) ;
client - > command ( client , " go " , NULL ) ;
return - 1 ;
}
debconf_subst ( " netcfg/choose_interface " , " ifchoices " , buf ) ;
ptr = debconf_input ( " critical " , " netcfg/choose_interface " ) ;
/* grab just the interface name, not the description too */
* ( strchr ( ptr , ' : ' ) ) = ' \0 ' ;
interface = strdup ( ptr ) ;
debconf_subst ( " netcfg/confirm_static_cfg " , " interface " , interface ) ;
return 0 ;
}
FILE *
file_open ( char * path )
{
FILE * fp ;
if ( ( fp = fopen ( path , " w " ) ) )
return fp ;
else
{
perror ( " fopen " ) ;
return NULL ;
}
}