/*
+ * $Id: main.c,v 1.25 2009-12-13 02:21:47 didg Exp $
+ *
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
*/
-#include <sys/types.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
#include <sys/param.h>
#include <sys/socket.h>
-#if defined( sun ) && defined( __svr4__ )
-#include </usr/ucbinclude/sys/file.h>
-#else sun __svr4__
#include <sys/file.h>
-#endif sun __svr4__
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/ioctl.h>
+
+/* POSIX.1 check */
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
+#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 <errno.h>
+#ifdef TRU64
+#include <sys/mbuf.h>
+#include <net/route.h>
+#endif /* TRU64 */
#include <net/if.h>
#include <net/route.h>
+#include <netinet/in.h>
+
#include <signal.h>
-#include <syslog.h>
+#include <atalk/logger.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atalk/compat.h>
#include <atalk/zip.h>
#include <atalk/rtmp.h>
+#include <atalk/nbp.h>
#include <atalk/ddp.h>
#include <atalk/atp.h>
#include <atalk/paths.h>
#ifdef __svr4__
#include <sys/sockio.h>
#include <termios.h>
-#endif __svr4__
+#endif /* __svr4__ */
#include "interface.h"
#include "gate.h"
#include "list.h"
#include "rtmp.h"
#include "zip.h"
+#include "nbp.h"
#include "atserv.h"
+#include "main.h"
+
+/* Forward Declarations */
+int ifconfig(const char *iname, unsigned long cmd, struct sockaddr_at *sa);
/* FIXME/SOCKLEN_T: socklen_t is a unix98 feature */
#ifndef SOCKLEN_T
#define SOCKLEN_T unsigned int
-#endif
+#endif /* SOCKLEN_T */
#ifndef WEXITSTATUS
#define WEXITSTATUS(x) ((x).w_retcode)
-#endif WEXITSTATUS
+#endif /* WEXITSTATUS */
/* linux has a special ioctl for appletalk device destruction. as of
* 2.1.57, SIOCDIFADDR works w/ linux. okay, we need to deal with the
#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 */
+
+int readconf( char * );
+int getifconf( void );
+int writeconf( char * );
+
/* this is the messiest of the bunch as atalkd can exit pretty much
* everywhere. we delete interfaces here instead of in as_down. */
static void atalkd_exit(const int i)
#if (SIOCDIFADDR != SIOCATALKDIFADDR)
if (!ifconfig(iface->i_name, SIOCATALKDIFADDR, &iface->i_addr))
continue;
-#endif
-#endif
- syslog( LOG_ERR, "difaddr(%u.%u): %m",
+#endif /* SIOCDIFADDR != SIOCATALKDIFADDR */
+#endif /* SIOCATALKIFADDR */
+ 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
+#endif /* SOPCDOFADDR */
server_unlock(pidfile);
exit(i);
}
+/* XXX need better error handling for gone interfaces, delete routes and so on
+ * moreover there's no way to put an interface back short of restarting atalkd
+ * thus after the first time, silently fail
+*/
+static ssize_t sendto_iface(struct interface *iface, int sockfd, const void *buf, size_t len,
+ const struct sockaddr_at *dest_addr)
+{
+ ssize_t ret = sendto( sockfd, buf, len, 0, (struct sockaddr *)dest_addr, sizeof( struct sockaddr_at ));
+
+ if (ret < 0 ) {
+ if (!(iface->i_flags & IFACE_ERROR)) {
+ LOG(log_error, logtype_atalkd, "as_timer sendto %u.%u (%u): %s",
+ ntohs( dest_addr->sat_addr.s_net ),
+ dest_addr->sat_addr.s_node,
+ ntohs( iface->i_rt->rt_firstnet ),
+ strerror(errno) );
+ }
+ iface->i_flags |= IFACE_ERROR;
+ }
+ else {
+ iface->i_flags &= ~IFACE_ERROR;
+ }
+ return ret;
+}
-#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;
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 ) {
continue;
}
}
- if (( iface->i_flags & ( IFACE_ADDR|IFACE_CONFIG|IFACE_NOROUTER )) ==
- IFACE_ADDR ) {
+ if (( iface->i_flags & ( IFACE_ADDR|IFACE_CONFIG|IFACE_NOROUTER )) == IFACE_ADDR ) {
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;
* No seed info, and we've got multiple interfaces.
* Wait forever.
*/
- syslog( LOG_INFO,
- "as_timer multiple interfaces, no seed" );
- syslog( LOG_INFO, "as_timer can't configure %s",
- iface->i_name );
- syslog( LOG_INFO, "as_timer waiting for router" );
+ LOG(log_info, logtype_atalkd, "as_timer multiple interfaces, no seed" );
+ LOG(log_info, logtype_atalkd, "as_timer can't configure %s", iface->i_name );
+ LOG(log_info, logtype_atalkd, "as_timer waiting for router" );
iface->i_time = 0;
continue;
} else {
*/
iface->i_flags |= IFACE_CONFIG;
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");
+ if (addzone( iface->i_rt, zt->zt_len, zt->zt_name) < 0) {
+ LOG(log_error, logtype_atalkd, "addzone: %s", strerror(errno));
atalkd_exit(1);
}
}
iface->i_rt->rt_flags |= RTMPTAB_HASZONES;
}
if ( iface->i_flags & IFACE_PHASE1 ) {
- syslog( LOG_INFO,
- "as_timer configured %s phase 1 from seed",
- iface->i_name );
+ LOG(log_info, logtype_atalkd, "as_timer configured %s phase 1 from seed", iface->i_name );
setaddr( iface, IFACE_PHASE1,
iface->i_caddr.sat_addr.s_net,
iface->i_addr.sat_addr.s_node,
iface->i_caddr.sat_addr.s_net,
iface->i_caddr.sat_addr.s_net );
} else {
- syslog( LOG_INFO,
- "as_timer configured %s phase 2 from seed",
- iface->i_name );
+ 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",
- ntohs( iface->i_addr.sat_addr.s_net ),
- iface->i_addr.sat_addr.s_node );
+ 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, strerror(errno) );
atalkd_exit( 1 );
}
if ( iface == ciface ) {
* 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;
iface->i_rt->rt_lastnet = htons( STARTUP_LASTNET );
- setaddr( iface, IFACE_PHASE2,
- iface->i_addr.sat_addr.s_net,
- iface->i_addr.sat_addr.s_node,
+ setaddr( iface, IFACE_PHASE2, iface->i_addr.sat_addr.s_net, iface->i_addr.sat_addr.s_node,
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",
- ntohs( iface->i_addr.sat_addr.s_net ),
- iface->i_addr.sat_addr.s_node );
+ 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,
+ strerror(errno) );
atalkd_exit( 1 );
}
* our zone has gone away.
*/
if ( ++gate->g_state >= RTMPTAB_BAD ) {
- syslog( LOG_INFO, "as_timer gateway %u.%u down",
- ntohs( gate->g_sat.sat_addr.s_net ),
+ 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 ) {
+ if ( rtmp->rt_hops == RTMPHOPS_POISON || 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) {
}
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 */
* if we're not a seed router.
*/
- if ( gate->g_iface->i_gate == 0 &&
- ((iface->i_flags & IFACE_SEED) == 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;
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 ) {
*/
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 ) {
} 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)
/*
* Do ZIP lookups.
*/
- if ( rtmp->rt_iprev &&
- ( rtmp->rt_flags & RTMPTAB_HASZONES ) == 0 ) {
+ if ( rtmp->rt_iprev && ( rtmp->rt_flags & RTMPTAB_HASZONES ) == 0 ) {
if ( data + sizeof( u_short ) > end || n == 255 ) {
/* send what we've got */
zh.zh_op = ZIPOP_QUERY;
*data++ = DDPTYPE_ZIP;
memcpy( data, &zh, sizeof( struct ziphdr ));
- if ( sendto( zap->ap_fd, packet, cc, 0,
- (struct sockaddr *)&sat,
- sizeof( struct sockaddr_at )) < 0 ) {
- syslog( LOG_ERR, "as_timer sendto: %m" );
- }
+ sendto_iface(iface, zap->ap_fd, packet, cc, &sat);
sentzipq = 1;
n = 0;
* 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",
- ntohs( rtmp->rt_firstnet ));
+ LOG(log_info, logtype_atalkd, "as_timer can't get zone for %u", ntohs( rtmp->rt_firstnet ));
}
if ( rtmp->rt_nzq > 3 ) {
if ( ziptimeout ) {
*data++ = DDPTYPE_ZIP;
memcpy( data, &zh, sizeof( struct ziphdr ));
- if ( sendto( zap->ap_fd, packet, cc, 0, (struct sockaddr *)&sat,
- sizeof( struct sockaddr_at )) < 0 ) {
- syslog( LOG_ERR, "as_timer sendto: %m" );
- }
+ sendto_iface( iface, zap->ap_fd, packet, cc, &sat);
}
}
if ( fgate ) {
if ((iface->i_flags & IFACE_ISROUTER)) {
#ifdef BSD4_4
sat.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
sat.sat_family = AF_APPLETALK;
sat.sat_addr.s_net = ATADDR_ANYNET;
sat.sat_addr.s_node = ATADDR_BCAST;
*/
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;
}
+ /* split horizon */
+ if (rtmp->rt_iface == iface) {
+ continue;
+ }
+
if ((( rtmp->rt_flags & RTMPTAB_EXTENDED ) &&
data + 2 * SZ_RTMPTUPLE > end ) ||
data + SZ_RTMPTUPLE > end ) {
- 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",
- ntohs( sat.sat_addr.s_net ),
- sat.sat_addr.s_node,
- ntohs( iface->i_rt->rt_firstnet ));
- }
+
+ sendto_iface(iface,rap->ap_fd, packet, data - packet, &sat);
if ( iface->i_flags & IFACE_PHASE2 ) {
- data = packet + 1 + sizeof( struct rtmp_head ) +
- 2 * SZ_RTMPTUPLE;
+ data = packet + 1 + sizeof( struct rtmp_head ) + 2 * SZ_RTMPTUPLE;
} else {
- data = packet + 1 + sizeof( struct rtmp_head ) +
- SZ_RTMPTUPLE;
+ data = packet + 1 + sizeof( struct rtmp_head ) + SZ_RTMPTUPLE;
}
n = 0;
}
/* send rest */
if ( n ) {
- 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",
- ntohs( sat.sat_addr.s_net ),
- sat.sat_addr.s_node,
- ntohs( iface->i_rt->rt_firstnet ));
- }
+ sendto_iface(iface, rap->ap_fd, packet, data - packet, &sat);
}
}
}
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 );
}
}
#ifdef DEBUG
consistency();
-#endif DEBUG
+#endif /* DEBUG */
}
#ifdef DEBUG
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);
}
}
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 );
}
}
}
-#endif DEBUG
+#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;
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 ) {
/*
* 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;
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 );
}
-main( ac, av )
- int ac;
- char **av;
+int main( int ac, char **av)
{
extern char *optarg;
extern int optind;
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;
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 );
exit( 1 );
}
+ /*
+ * Set process name for logging
+ */
+
+ set_processname("atalkd");
+
/* do this here so that we can use ifconfig */
#ifdef __svr4__
if ( plumb() < 0 ) {
fprintf(stderr, "can't establish STREAMS plumbing, exiting.\n" );
atalkd_exit( 1 );
}
-#endif __svr4__
+#endif /* __svr4__ */
/* delete pre-existing interface addresses. */
#ifdef SIOCDIFADDR
#ifdef SIOCATALKDIFADDR
#if (SIOCDIFADDR != SIOCATALKDIFADDR)
ifconfig(iface->i_name, SIOCATALKDIFADDR, &iface->i_addr);
-#endif
-#endif
+#endif /* SIOCDIFADDR != SIOCATALKDIFADDR */
+#endif /* SIOCATALKDIFADDR */
}
}
-#endif
+#endif /* SIOCDIFADDR */
/*
* Disassociate. The child will send itself a signal when it is
#ifdef ultrix
openlog( prog, LOG_PID );
-#else ultrix
- openlog( prog, LOG_PID, LOG_DAEMON );
-#endif ultrix
+#else /* ultrix */
+ 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
*/
#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
+#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
+#endif /* BSD4_4 */
+
+ ciface = interfaces;
+ bootaddr( ciface );
memset(&sv, 0, sizeof(sv));
sv.sa_handler = as_down;
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 );
}
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 );
}
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 );
}
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 ) {
errno = 0;
continue;
} else {
- syslog( LOG_ERR, "select: %m" );
+ LOG(log_error, logtype_atalkd, "select: %s", strerror(errno) );
atalkd_exit( 1 );
}
}
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 ),
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__
+
}
}
}
* and rtmp_packet()) to set the initial "bootstrapping" address
* on an interface.
*/
-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);
}
}
} 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);
}
}
} 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);
}
}
* Change setaddr()
* to manage the i_ports field and the fds for select().
*/
-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;
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;
#ifdef BSD4_4
iface->i_addr.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
iface->i_addr.sat_family = AF_APPLETALK;
iface->i_addr.sat_addr.s_net = net;
iface->i_addr.sat_addr.s_node = node;
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 */
-#if defined(__svr4__)
- syslog(LOG_INFO, "setsockopt incompatible w/ Solaris STREAMS module.");
-#endif
+#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 );
}
-#if !defined(__svr4__)
+#ifndef __svr4__
setsockopt(ap->ap_fd, SOL_SOCKET, SO_BROADCAST, &i, sizeof(i));
-#endif
+#endif /* ! __svr4 */
memset( &sat, 0, sizeof( struct sockaddr_at ));
#ifdef BSD4_4
sat.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
sat.sat_family = AF_APPLETALK;
sat.sat_addr.s_net = iface->i_addr.sat_addr.s_net;
sat.sat_addr.s_node = iface->i_addr.sat_addr.s_node;
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) {
#ifdef SIOCATALKDIFADDR
#if (SIOCDIFADDR != SIOCATALKDIFADDR)
ifconfig( iface->i_name, SIOCATALKDIFADDR, &iface->i_addr );
-#endif
-#endif
+#endif /* SIOCDIFADDR != SIOCATALKDIFADDR */
+#endif /* SIOCATALKDIFADDR */
}
}
-#endif
+#endif /* SIOCDIFADDR */
atalkd_exit( 1 );
}
}
nfds++;
}
-ifconfig( iname, cmd, sa )
- 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;
return( 0 );
}
-dumpconfig( iface )
- struct interface *iface;
+void dumpconfig( struct interface *iface)
{
struct list *l;
}
#ifdef DEBUG
-dumproutes()
+void dumproutes(void)
{
struct interface *iface;
struct rtmptab *rtmp;
fflush( stdout );
}
-dumpzones()
+void dumpzones(void)
{
struct interface *iface;
struct rtmptab *rtmp;
printf( "\n" );
fflush( stdout );
}
-#endif DEBUG
+#endif /* DEBUG */