X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fatalkd%2Fmain.c;h=b8080c29150a56646de93a5f2b167911a9e1578e;hb=567ceececbc94d854e94c84bbd61980240777f7a;hp=39146f3c422a4a47b241b5b00b9effad7ccaaf4d;hpb=3287e3ece12494ce5caf17d0fbbc4eaf86df47a3;p=netatalk.git diff --git a/etc/atalkd/main.c b/etc/atalkd/main.c index 39146f3c..b8080c29 100644 --- a/etc/atalkd/main.c +++ b/etc/atalkd/main.c @@ -1,5 +1,5 @@ /* - * $Id: main.c,v 1.7 2001-08-15 01:39:39 srittau Exp $ + * $Id: main.c,v 1.22 2009-10-14 02:24:05 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -9,18 +9,28 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ -#include #include #include -#if defined( sun ) && defined( __svr4__ ) -#include -#else /* sun __svr4__ */ #include -#endif /* sun __svr4__ */ #include #include #include + +/* POSIX.1 check */ +#include +#ifdef HAVE_SYS_WAIT_H #include +#endif /* HAVE_SYS_WAIT_H */ +#ifndef WEXITSTATUS +#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif /* ! WEXITSTATUS */ +#ifndef WIFEXITED +#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif /* ! WIFEXITED */ +#ifndef WIFSTOPPED +#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) +#endif + #include #ifdef TRU64 #include @@ -29,8 +39,10 @@ #include #include +#include + #include -#include +#include #include #include #include @@ -43,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +71,7 @@ #include "list.h" #include "rtmp.h" #include "zip.h" +#include "nbp.h" #include "atserv.h" #include "main.h" @@ -85,34 +99,33 @@ int ifconfig(const char *iname, unsigned long cmd, struct sockaddr_at *sa); #define PKTSZ 1024 -extern int rtmp_packet(); -extern int nbp_packet(); -extern int aep_packet(); -extern int zip_packet(); +extern int aep_packet(struct atport *ap, struct sockaddr_at *from, char *data, int len); int rtfd; +int transition = 0; +int stabletimer, newrtmpdata = 0; -struct atserv atserv[] = { +static struct atserv atserv[] = { { "rtmp", 1, rtmp_packet }, /* 0 */ { "nbp", 2, nbp_packet }, /* 1 */ { "echo", 4, aep_packet }, /* 2 */ { "zip", 6, zip_packet }, /* 3 */ }; -int atservNATSERV = elements( atserv ); +static int atservNATSERV = elements( atserv ); struct interface *interfaces = NULL, *ciface = NULL; -int debug = 0, quiet = 0, chatty = 0; -char *configfile = NULL; -int ziptimeout = 0, transition = 0; -int stabletimer, stable = 0, newrtmpdata = 0, noparent = 0; -static int ninterfaces; -int defphase = IFACE_PHASE2; -int nfds = 0; -fd_set fds; -char Packet[ PKTSZ ]; -char *version = VERSION; -static char *pidfile = _PATH_ATALKDLOCK; +static int debug = 0, quiet = 0, chatty = 0; +static char *configfile = NULL; +static int ziptimeout = 0; +static int stable = 0, noparent = 0; +static int ninterfaces; +static int defphase = IFACE_PHASE2; +static int nfds = 0; +static fd_set fds; +static char Packet[ PKTSZ ]; +static char *version = VERSION; +static char *pidfile = _PATH_ATALKDLOCK; /* from config.c */ @@ -136,10 +149,14 @@ static void atalkd_exit(const int i) continue; #endif /* SIOCDIFADDR != SIOCATALKDIFADDR */ #endif /* SIOCATALKIFADDR */ - syslog( LOG_ERR, "difaddr(%u.%u): %m", + LOG(log_error, logtype_atalkd, "difaddr(%u.%u): %s", ntohs(iface->i_addr.sat_addr.s_net), - iface->i_addr.sat_addr.s_node); + iface->i_addr.sat_addr.s_node, strerror(errno)); } +#ifdef linux + if (!(iface->i_flags & IFACE_WASALLMULTI) && (iface->i_flags & IFACE_ALLMULTI)) + ifsetallmulti(iface->i_name, 0); +#endif /* linux */ } #endif /* SOPCDOFADDR */ @@ -148,10 +165,7 @@ static void atalkd_exit(const int i) } -#if !defined( ibm032 ) && !defined( _IBMR2 ) - void -#endif /* ibm032 _IBMR2 */ -as_timer() +static void as_timer(int sig _U_) { struct sockaddr_at sat; struct ziphdr zh; @@ -166,6 +180,8 @@ as_timer() int sentzipq = 0; int n, cc; + ap=zap=rap=NULL; + memset(&sat, 0, sizeof( struct sockaddr_at )); for ( iface = interfaces; iface; iface = iface->i_next ) { if ( iface->i_flags & IFACE_LOOPBACK ) { @@ -185,13 +201,13 @@ as_timer() if ( iface->i_time < 3 ) { if ( iface->i_flags & IFACE_PHASE1 ) { if (rtmp_request( iface ) < 0) { - syslog(LOG_ERR, "rtmp_request: %m"); + LOG(log_error, logtype_atalkd, "rtmp_request: %s", strerror(errno)); atalkd_exit(1); } newrtmpdata = 1; } else { if (zip_getnetinfo( iface ) < 0) { - syslog(LOG_ERR, "zip_getnetinfo: %m"); + LOG(log_error, logtype_atalkd, "zip_getnetinfo: %s", strerror(errno)); atalkd_exit(1); } sentzipq = 1; @@ -205,11 +221,11 @@ as_timer() * No seed info, and we've got multiple interfaces. * Wait forever. */ - syslog( LOG_INFO, + LOG(log_info, logtype_atalkd, "as_timer multiple interfaces, no seed" ); - syslog( LOG_INFO, "as_timer can't configure %s", + LOG(log_info, logtype_atalkd, "as_timer can't configure %s", iface->i_name ); - syslog( LOG_INFO, "as_timer waiting for router" ); + LOG(log_info, logtype_atalkd, "as_timer waiting for router" ); iface->i_time = 0; continue; } else { @@ -221,7 +237,7 @@ as_timer() for ( zt = iface->i_czt; zt; zt = zt->zt_next ) { if (addzone( iface->i_rt, zt->zt_len, zt->zt_name) < 0) { - syslog(LOG_ERR, "addzone: %m"); + LOG(log_error, logtype_atalkd, "addzone: %s", strerror(errno)); atalkd_exit(1); } } @@ -230,7 +246,7 @@ as_timer() iface->i_rt->rt_flags |= RTMPTAB_HASZONES; } if ( iface->i_flags & IFACE_PHASE1 ) { - syslog( LOG_INFO, + LOG(log_info, logtype_atalkd, "as_timer configured %s phase 1 from seed", iface->i_name ); setaddr( iface, IFACE_PHASE1, @@ -239,16 +255,17 @@ as_timer() iface->i_caddr.sat_addr.s_net, iface->i_caddr.sat_addr.s_net ); } else { - syslog( LOG_INFO, + LOG(log_info, logtype_atalkd, "as_timer configured %s phase 2 from seed", iface->i_name ); } if ( looproute( iface, RTMP_ADD )) { /* -1 or 1 */ - syslog( LOG_ERR, - "as_timer: can't route %u.%u to loop: %m", + LOG(log_error, logtype_atalkd, + "as_timer: can't route %u.%u to loop: %s", ntohs( iface->i_addr.sat_addr.s_net ), - iface->i_addr.sat_addr.s_node ); + iface->i_addr.sat_addr.s_node, + strerror(errno) ); atalkd_exit( 1 ); } if ( iface == ciface ) { @@ -261,7 +278,7 @@ as_timer() * Configure for no router operation. Wait for a route * to become available in rtmp_packet(). */ - syslog( LOG_INFO, "config for no router" ); + LOG(log_info, logtype_atalkd, "config for no router" ); if ( iface->i_flags & IFACE_PHASE2 ) { iface->i_rt->rt_firstnet = 0; @@ -272,10 +289,11 @@ as_timer() 0, htons( STARTUP_LASTNET )); } if ( looproute( iface, RTMP_ADD ) ) { /* -1 or 1 */ - syslog( LOG_ERR, - "as_timer: can't route %u.%u to loopback: %m", + LOG(log_error, logtype_atalkd, + "as_timer: can't route %u.%u to loopback: %s", ntohs( iface->i_addr.sat_addr.s_net ), - iface->i_addr.sat_addr.s_node ); + iface->i_addr.sat_addr.s_node, + strerror(errno) ); atalkd_exit( 1 ); } @@ -306,19 +324,19 @@ as_timer() * our zone has gone away. */ if ( ++gate->g_state >= RTMPTAB_BAD ) { - syslog( LOG_INFO, "as_timer gateway %u.%u down", + LOG(log_info, logtype_atalkd, "as_timer gateway %u.%u down", ntohs( gate->g_sat.sat_addr.s_net ), gate->g_sat.sat_addr.s_node ); rtmp = gate->g_rt; while ( rtmp ) { frtmp = rtmp->rt_next; if ( rtmp->rt_hops == RTMPHOPS_POISON || - rtmp->rt_iprev == 0 ) { + rtmp->rt_iprev == NULL ) { rtmp_free( rtmp ); } else { rtmp->rt_hops = RTMPHOPS_POISON; if ((cc = rtmp_replace( rtmp )) < 0) { - syslog(LOG_ERR, "rtmp_replace: %m"); + LOG(log_error, logtype_atalkd, "rtmp_replace: %s", strerror(errno)); atalkd_exit(1); } if (cc) { @@ -327,13 +345,13 @@ as_timer() } rtmp = frtmp; } - if ( gate->g_rt == 0 ) { - if ( gate->g_prev == 0 ) { + if ( gate->g_rt == NULL ) { + if ( gate->g_prev == NULL ) { gate->g_iface->i_gate = gate->g_next; } else { gate->g_prev->g_next = gate->g_next; } - if ( gate->g_next != 0 ) { + if ( gate->g_next != NULL ) { gate->g_next->g_prev = gate->g_prev; } fgate = gate; /* can't free here, just mark it */ @@ -348,7 +366,7 @@ as_timer() * if we're not a seed router. */ - if ( gate->g_iface->i_gate == 0 && + if ( gate->g_iface->i_gate == NULL && ((iface->i_flags & IFACE_SEED) == 0)) { gate->g_iface->i_flags |= IFACE_NOROUTER; gate->g_iface->i_flags &= ~IFACE_CONFIG; @@ -359,7 +377,7 @@ as_timer() gate->g_iface->i_rt->rt_flags &= ~RTMPTAB_HASZONES; } - syslog( LOG_INFO, "as_timer last gateway down" ); + LOG(log_info, logtype_atalkd, "as_timer last gateway down" ); /* Set netrange to 0-fffe. */ if ( gate->g_iface->i_flags & IFACE_PHASE2 ) { @@ -406,7 +424,7 @@ as_timer() */ if ( rtmp->rt_state >= RTMPTAB_BAD ) { frtmp = rtmp->rt_next; - if ( rtmp->rt_iprev == 0 ) { /* not in use */ + if ( rtmp->rt_iprev == NULL ) { /* not in use */ rtmp_free( rtmp ); } else { /* in use */ if ( rtmp->rt_hops == RTMPHOPS_POISON ) { @@ -414,7 +432,7 @@ as_timer() } else { rtmp->rt_hops = RTMPHOPS_POISON; if ((cc = rtmp_replace( rtmp )) < 0) { - syslog(LOG_ERR, "rtmp_replace: %m"); + LOG(log_error, logtype_atalkd, "rtmp_replace: %s", strerror(errno)); atalkd_exit(1); } if (cc) @@ -442,7 +460,7 @@ as_timer() if ( sendto( zap->ap_fd, packet, cc, 0, (struct sockaddr *)&sat, sizeof( struct sockaddr_at )) < 0 ) { - syslog( LOG_ERR, "as_timer sendto: %m" ); + LOG(log_error, logtype_atalkd, "as_timer sendto: %s", strerror(errno) ); } sentzipq = 1; @@ -461,7 +479,7 @@ as_timer() * ask about, and warn that we can't get it's zone. */ if ( rtmp->rt_nzq++ == 3 ) { - syslog( LOG_INFO, "as_timer can't get zone for %u", + LOG(log_info, logtype_atalkd, "as_timer can't get zone for %u", ntohs( rtmp->rt_firstnet )); } if ( rtmp->rt_nzq > 3 ) { @@ -491,7 +509,7 @@ as_timer() if ( sendto( zap->ap_fd, packet, cc, 0, (struct sockaddr *)&sat, sizeof( struct sockaddr_at )) < 0 ) { - syslog( LOG_ERR, "as_timer sendto: %m" ); + LOG(log_error, logtype_atalkd, "as_timer sendto: %s", strerror(errno) ); } } } @@ -558,7 +576,7 @@ as_timer() */ for ( rtmp = iface2->i_rt; rtmp; rtmp = rtmp->rt_inext ) { /* don't broadcast routes we have no zone for */ - if ( rtmp->rt_zt == 0 || + if ( rtmp->rt_zt == NULL || ( rtmp->rt_flags & RTMPTAB_ZIPQUERY ) || ( rtmp->rt_flags & RTMPTAB_HASZONES ) == 0 ) { continue; @@ -570,10 +588,11 @@ as_timer() if ( sendto( rap->ap_fd, packet, data - packet, 0, (struct sockaddr *)&sat, sizeof( struct sockaddr_at )) < 0 ) { - syslog( LOG_ERR, "as_timer sendto %u.%u (%u): %m", + LOG(log_error, logtype_atalkd, "as_timer sendto %u.%u (%u): %s", ntohs( sat.sat_addr.s_net ), sat.sat_addr.s_node, - ntohs( iface->i_rt->rt_firstnet )); + ntohs( iface->i_rt->rt_firstnet ), + strerror(errno) ); } if ( iface->i_flags & IFACE_PHASE2 ) { @@ -609,10 +628,11 @@ as_timer() if ( sendto( rap->ap_fd, packet, data - packet, 0, (struct sockaddr *)&sat, sizeof( struct sockaddr_at )) < 0 ) { - syslog( LOG_ERR, "as_timer sendto %u.%u (%u): %m", + LOG(log_error, logtype_atalkd, "as_timer sendto %u.%u (%u): %s", ntohs( sat.sat_addr.s_net ), sat.sat_addr.s_node, - ntohs( iface->i_rt->rt_firstnet )); + ntohs( iface->i_rt->rt_firstnet ), + strerror(errno) ); } } } @@ -639,14 +659,14 @@ as_timer() if ( stable && !noparent ) { noparent = 1; - syslog( LOG_INFO, "ready %d/%d/%d", stabletimer, newrtmpdata, + LOG(log_info, logtype_atalkd, "ready %d/%d/%d", stabletimer, newrtmpdata, sentzipq ); if ( !debug ) { /* * Seems like we could get here more than once... */ if ( kill( getpid(), SIGSTOP ) < 0 ) { - syslog( LOG_ERR, "as_timer: kill-self failed!" ); + LOG(log_error, logtype_atalkd, "as_timer: kill-self failed!" ); atalkd_exit( 1 ); } } @@ -672,7 +692,7 @@ consistency() for ( lr = zt->zt_rt; lr; lr = lr->l_next ) { rtmp = (struct rtmptab *)lr->l_data; if ( rtmp->rt_iprev == 0 && rtmp->rt_gate != 0 ) { - syslog( LOG_ERR, "%.*s has %u-%u (unused)\n", + LOG(log_error, logtype_atalkd, "%.*s has %u-%u (unused)", zt->zt_len, zt->zt_name, ntohs( rtmp->rt_firstnet ), ntohs( rtmp->rt_lastnet )); atalkd_exit(1); @@ -683,7 +703,7 @@ consistency() } } if ( lz == 0 ) { - syslog( LOG_ERR, "no map from %u-%u to %.*s\n", + LOG(log_error, logtype_atalkd, "no map from %u-%u to %.*s", ntohs( rtmp->rt_firstnet ), ntohs( rtmp->rt_lastnet ), zt->zt_len, zt->zt_name ); @@ -694,10 +714,8 @@ consistency() } #endif /* DEBUG */ -#if !defined( ibm032 ) && !defined( _IBMR2 ) - void -#endif /* ! ibm032 && ! _IBMR2 */ -as_debug() +static void +as_debug(int sig _U_) { struct interface *iface; struct list *l; @@ -707,7 +725,7 @@ as_debug() FILE *rtmpdebug; if (( rtmpdebug = fopen( _PATH_ATALKDEBUG, "w" )) == NULL ) { - syslog( LOG_ERR, "rtmp: %m" ); + LOG(log_error, logtype_atalkd, "rtmp: %s", strerror(errno) ); } for ( iface = interfaces; iface; iface = iface->i_next ) { @@ -798,10 +816,8 @@ as_debug() /* * Called when SIGTERM is recieved. Remove all routes and then exit. */ -#if !defined( ibm032 ) && !defined( _IBMR2 ) - void -#endif /* ! ibm032 && ! _IBMR2 */ -as_down() +static void +as_down(int sig _U_) { struct interface *iface; struct gate *gate; @@ -812,29 +828,29 @@ as_down() for ( rt = gate->g_rt; rt; rt = rt->rt_next ) { if ( rt->rt_iprev ) { if ( gateroute( RTMP_DEL, rt ) < 0 ) { - syslog( LOG_ERR, "as_down remove %u-%u failed: %m", + LOG(log_error, logtype_atalkd, "as_down remove %u-%u failed: %s", ntohs( rt->rt_firstnet ), - ntohs( rt->rt_lastnet )); + ntohs( rt->rt_lastnet ), + strerror(errno) ); } } } } if ( iface->i_flags & IFACE_LOOP ) { if (looproute( iface, RTMP_DEL )) { - syslog( LOG_ERR, "as_down remove %s %u.%u failed: %m", + LOG(log_error, logtype_atalkd, "as_down remove %s %u.%u failed: %s", iface->i_name, ntohs( iface->i_addr.sat_addr.s_net ), - iface->i_addr.sat_addr.s_node ); + iface->i_addr.sat_addr.s_node, + strerror(errno) ); } } } - syslog( LOG_INFO, "done" ); + LOG(log_info, logtype_atalkd, "done" ); atalkd_exit( 0 ); } -int main( ac, av ) - int ac; - char **av; +int main( int ac, char **av) { extern char *optarg; extern int optind; @@ -842,16 +858,17 @@ int main( ac, av ) struct sockaddr_at sat; struct sigaction sv; struct itimerval it; + sigset_t signal_set, old_set; + struct interface *iface; int status; struct atport *ap; fd_set readfds; - int i, mask, c; + int i, c; SOCKLEN_T fromlen; char *prog; -; - while (( c = getopt( ac, av, "12qsdtf:P:" )) != EOF ) { + while (( c = getopt( ac, av, "12qsdtf:P:v" )) != EOF ) { switch ( c ) { case '1' : defphase = IFACE_PHASE1; @@ -885,6 +902,11 @@ int main( ac, av ) pidfile = optarg; break; + case 'v' : /* version */ + printf( "atalkd (version %s)\n", version ); + exit ( 1 ); + break; + default : fprintf( stderr, "Unknown option -- '%c'\n", c ); exit( 1 ); @@ -999,6 +1021,12 @@ int main( ac, av ) exit( 1 ); } + /* + * Set process name for logging + */ + + set_processname("atalkd"); + /* do this here so that we can use ifconfig */ #ifdef __svr4__ if ( plumb() < 0 ) { @@ -1059,10 +1087,11 @@ int main( ac, av ) #ifdef ultrix openlog( prog, LOG_PID ); #else /* ultrix */ - openlog( prog, LOG_PID, LOG_DAEMON ); + set_processname(prog); + syslog_setup(log_debug, logtype_default, logoption_pid, logfacility_daemon ); #endif /* ultrix */ - syslog( LOG_INFO, "restart (%s)", version ); + LOG(log_info, logtype_atalkd, "restart (%s)", version ); /* * Socket for use in routing ioctl()s. Can't add routes to our @@ -1070,20 +1099,23 @@ int main( ac, av ) */ #ifdef BSD4_4 if (( rtfd = socket( PF_ROUTE, SOCK_RAW, AF_APPLETALK )) < 0 ) { - syslog( LOG_ERR, "route socket: %m" ); + LOG(log_error, logtype_atalkd, "route socket: %s", strerror(errno) ); atalkd_exit( 1 ); } if ( shutdown( rtfd, 0 ) < 0 ) { - syslog( LOG_ERR, "route shutdown: %m" ); + LOG(log_error, logtype_atalkd, "route shutdown: %s", strerror(errno) ); atalkd_exit( 1 ); } #else /* BSD4_4 */ if (( rtfd = socket( AF_APPLETALK, SOCK_DGRAM, 0 )) < 0 ) { - syslog( LOG_ERR, "route socket: %m" ); + LOG(log_error, logtype_atalkd, "route socket: %s", strerror(errno) ); atalkd_exit( 1 ); } #endif /* BSD4_4 */ + ciface = interfaces; + bootaddr( ciface ); + memset(&sv, 0, sizeof(sv)); sv.sa_handler = as_down; sigemptyset( &sv.sa_mask ); @@ -1092,7 +1124,7 @@ int main( ac, av ) sigaddset( &sv.sa_mask, SIGTERM ); sv.sa_flags = SA_RESTART; if ( sigaction( SIGTERM, &sv, NULL) < 0 ) { - syslog( LOG_ERR, "sigterm: %m" ); + LOG(log_error, logtype_atalkd, "sigterm: %s", strerror(errno) ); atalkd_exit( 1 ); } @@ -1103,7 +1135,7 @@ int main( ac, av ) sigaddset( &sv.sa_mask, SIGTERM ); sv.sa_flags = SA_RESTART; if ( sigaction( SIGUSR1, &sv, NULL) < 0 ) { - syslog( LOG_ERR, "sigusr1: %m" ); + LOG(log_error, logtype_atalkd, "sigusr1: %s", strerror(errno) ); atalkd_exit( 1 ); } @@ -1114,7 +1146,7 @@ int main( ac, av ) sigaddset( &sv.sa_mask, SIGTERM ); sv.sa_flags = SA_RESTART; if ( sigaction( SIGALRM, &sv, NULL) < 0 ) { - syslog( LOG_ERR, "sigalrm: %m" ); + LOG(log_error, logtype_atalkd, "sigalrm: %s", strerror(errno) ); atalkd_exit( 1 ); } @@ -1123,12 +1155,18 @@ int main( ac, av ) it.it_value.tv_sec = 10L; it.it_value.tv_usec = 0L; if ( setitimer( ITIMER_REAL, &it, NULL) < 0 ) { - syslog( LOG_ERR, "setitimer: %m" ); + LOG(log_error, logtype_atalkd, "setitimer: %s", strerror(errno) ); atalkd_exit( 1 ); } - ciface = interfaces; - bootaddr( ciface ); + sigemptyset( &signal_set ); + sigaddset(&signal_set, SIGALRM); +#if 0 + /* don't block SIGTERM */ + sigaddset(&signal_set, SIGTERM); +#endif + sigaddset(&signal_set, SIGUSR1); + for (;;) { readfds = fds; if ( select( nfds, &readfds, NULL, NULL, NULL) < 0 ) { @@ -1136,7 +1174,7 @@ int main( ac, av ) errno = 0; continue; } else { - syslog( LOG_ERR, "select: %m" ); + LOG(log_error, logtype_atalkd, "select: %s", strerror(errno) ); atalkd_exit( 1 ); } } @@ -1148,10 +1186,10 @@ int main( ac, av ) fromlen = sizeof( struct sockaddr_at ); if (( c = recvfrom( ap->ap_fd, Packet, sizeof( Packet ), 0, (struct sockaddr *)&sat, &fromlen )) < 0 ) { - syslog( LOG_ERR, "recvfrom: %m" ); + LOG(log_error, logtype_atalkd, "recvfrom: %s", strerror(errno) ); continue; } -#ifdef DEBUG +#ifdef DEBUG1 if ( debug ) { printf( "packet from %u.%u on %s (%x) %d (%d)\n", ntohs( sat.sat_addr.s_net ), @@ -1159,32 +1197,25 @@ int main( ac, av ) iface->i_flags, ap->ap_port, ap->ap_fd ); bprint( Packet, c ); } -#endif /* DEBUG */ -#ifdef __svr4__ - if ( sighold( SIGALRM ) || sighold( SIGUSR1 )) { - syslog( LOG_ERR, "sighold: %m" ); +#endif + if (sigprocmask(SIG_BLOCK, &signal_set, &old_set) < 0) { + LOG(log_error, logtype_atalkd, "sigprocmask: %s", strerror(errno) ); atalkd_exit( 1 ); } -#else /* __svr4__ */ - mask = sigsetmask( sigmask( SIGALRM ) | - sigmask( SIGUSR1 )); -#endif /* __svr4__ */ + if (( *ap->ap_packet )( ap, &sat, Packet, c ) < 0) { - syslog(LOG_ERR, "ap->ap_packet: %m"); + LOG(log_error, logtype_atalkd, "ap->ap_packet: %s", strerror(errno)); atalkd_exit(1); } #ifdef DEBUG consistency(); -#endif /* DEBUG */ -#ifdef __svr4__ - if ( sigrelse( SIGUSR1 ) || sigrelse( SIGALRM )) { - syslog( LOG_ERR, "sigrelse: %m" ); +#endif + if (sigprocmask(SIG_SETMASK, &old_set, NULL) < 0) { + LOG(log_error, logtype_atalkd, "sigprocmask old set: %s", strerror(errno) ); atalkd_exit( 1 ); } -#else /* __svr4__ */ - sigsetmask( mask ); -#endif /* __svr4__ */ + } } } @@ -1197,16 +1228,15 @@ int main( ac, av ) * and rtmp_packet()) to set the initial "bootstrapping" address * on an interface. */ -void bootaddr( iface ) - struct interface *iface; +void bootaddr(struct interface *iface) { - if ( iface == 0 ) { + if ( iface == NULL ) { return; } /* consistency */ if ( iface->i_flags & IFACE_ADDR ) { - syslog( LOG_ERR, "bootaddr OOPS!" ); + LOG(log_error, logtype_atalkd, "bootaddr OOPS!" ); atalkd_exit(1); } @@ -1222,7 +1252,7 @@ void bootaddr( iface ) } } else if (rtmp_request( iface ) < 0) { - syslog(LOG_ERR, "bootaddr (rtmp_request): %m"); + LOG(log_error, logtype_atalkd, "bootaddr (rtmp_request): %s", strerror(errno)); atalkd_exit(1); } @@ -1239,7 +1269,7 @@ void bootaddr( iface ) } } else if (zip_getnetinfo( iface ) < 0) { - syslog(LOG_ERR, "bootaddr (zip_getnetinfo): %m"); + LOG(log_error, logtype_atalkd, "bootaddr (zip_getnetinfo): %s", strerror(errno)); atalkd_exit(1); } } @@ -1253,12 +1283,9 @@ void bootaddr( iface ) * Change setaddr() * to manage the i_ports field and the fds for select(). */ -void setaddr( iface, phase, net, node, first, last ) - struct interface *iface; - u_int8_t phase; - u_int16_t net; - u_int8_t node; - u_int16_t first, last; +void setaddr(struct interface *iface, + u_int8_t phase, u_int16_t net, u_int8_t node, + u_int16_t first, u_int16_t last) { int i; struct atserv *as; @@ -1270,13 +1297,13 @@ void setaddr( iface, phase, net, node, first, last ) if ( iface->i_ports == NULL ) { /* allocate port structures */ for ( i = 0, as = atserv; i < atservNATSERV; i++, as++ ) { if (( se = getservbyname( as->as_name, "ddp" )) == NULL ) { - syslog( LOG_INFO, "%s: service unknown", as->as_name ); + LOG(log_info, logtype_atalkd, "%s: service unknown", as->as_name ); } else { as->as_port = ntohs( se->s_port ); } if (( ap = (struct atport *)malloc( sizeof( struct atport ))) == NULL ) { - syslog( LOG_ERR, "malloc: %m" ); + LOG(log_error, logtype_atalkd, "malloc: %s", strerror(errno) ); atalkd_exit( 1 ); } ap->ap_fd = 0; @@ -1306,23 +1333,24 @@ void setaddr( iface, phase, net, node, first, last ) memcpy( iface->i_addr.sat_zero, &nr, sizeof( struct netrange )); if ( ifconfig( iface->i_name, SIOCSIFADDR, &iface->i_addr )) { - syslog( LOG_ERR, "setifaddr: %s (%u-%u): %m. try specifying a \ -smaller net range.", iface->i_name, ntohs(first), ntohs(last)); + LOG(log_error, logtype_atalkd, "setifaddr: %s (%u-%u): %s. try specifying a \ +smaller net range.", iface->i_name, ntohs(first), ntohs(last), strerror(errno)); atalkd_exit( 1 ); } if ( ifconfig( iface->i_name, SIOCGIFADDR, &iface->i_addr )) { - syslog( LOG_ERR, "getifaddr: %s: %m", iface->i_name ); + LOG(log_error, logtype_atalkd, "getifaddr: %s: %s", iface->i_name, strerror(errno) ); atalkd_exit( 1 ); } /* open ports */ i = 1; /* enable broadcasts */ -#ifdef __svr4__ - syslog(LOG_INFO, "setsockopt incompatible w/ Solaris STREAMS module."); +#if 0 + /* useless message, no? */ + LOG(log_info, logtype_atalkd, "setsockopt incompatible w/ Solaris STREAMS module."); #endif /* __svr4__ */ for ( ap = iface->i_ports; ap; ap = ap->ap_next ) { if (( ap->ap_fd = socket( AF_APPLETALK, SOCK_DGRAM, 0 )) < 0 ) { - syslog( LOG_ERR, "socket: %m" ); + LOG(log_error, logtype_atalkd, "socket: %s", strerror(errno) ); atalkd_exit( 1 ); } #ifndef __svr4__ @@ -1340,9 +1368,9 @@ smaller net range.", iface->i_name, ntohs(first), ntohs(last)); if ( bind( ap->ap_fd, (struct sockaddr *)&sat, sizeof( struct sockaddr_at )) < 0 ) { - syslog( LOG_ERR, "bind %u.%u:%u: %m", + LOG(log_error, logtype_atalkd, "bind %u.%u:%u: %s", ntohs( sat.sat_addr.s_net ), - sat.sat_addr.s_node, sat.sat_port ); + sat.sat_addr.s_node, sat.sat_port, strerror(errno) ); #ifdef SIOCDIFADDR /* remove all interfaces if we have a problem with bind */ for (iface = interfaces; iface; iface = iface->i_next) { @@ -1372,10 +1400,42 @@ smaller net range.", iface->i_name, ntohs(first), ntohs(last)); nfds++; } -int ifconfig( iname, cmd, sa ) - const char *iname; - unsigned long cmd; - struct sockaddr_at *sa; +int ifsetallmulti (const char *iname, int set) +{ + int sock; + struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); + + if (( sock = socket( AF_APPLETALK, SOCK_DGRAM, 0 )) < 0 ) { + return( -1 ); + } + + /* get interface config */ + strlcpy(ifr.ifr_name, iname, sizeof(ifr.ifr_name)); + if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { + close(sock); + return (-1); + } + + /* should we set or unset IFF_ALLMULTI */ + if (set) + ifr.ifr_flags |= IFF_ALLMULTI; + else + ifr.ifr_flags &= ~IFF_ALLMULTI; + + /* set interface config */ + strlcpy(ifr.ifr_name, iname, sizeof(ifr.ifr_name)); + if (ioctl(sock, SIOCSIFFLAGS, &ifr) < 0) { + close(sock); + return -1; + } + + close(sock); + return (0); +} + +int ifconfig( const char *iname, unsigned long cmd, struct sockaddr_at *sa) { struct ifreq ifr; int s; @@ -1398,8 +1458,7 @@ int ifconfig( iname, cmd, sa ) return( 0 ); } -void dumpconfig( iface ) - struct interface *iface; +void dumpconfig( struct interface *iface) { struct list *l; @@ -1435,7 +1494,7 @@ void dumpconfig( iface ) } #ifdef DEBUG -void dumproutes() +void dumproutes(void) { struct interface *iface; struct rtmptab *rtmp; @@ -1483,7 +1542,7 @@ void dumproutes() fflush( stdout ); } -void dumpzones() +void dumpzones(void) { struct interface *iface; struct rtmptab *rtmp;