* FreeBSD specific portions written by and Copyright (c) 1999
* Andy Doran <ad@psn.ie>.
*
- * This is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free
- * Software Foundation; version 2, or (at your option) any later version.
+ * For license terms, see the file COPYING in this directory.
*/
#include <sys/types.h>
#include <sys/param.h>
+#if defined(linux)
+#include <sys/utsname.h>
+#endif
+
#if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__)
#include "config.h"
#include <net/if.h>
#if defined(__FreeBSD__)
#if defined __FreeBSD_USE_KVM
- #if __FreeBSD_version >= 300001
- #include <net/if_var.h>
- #endif
- #include <kvm.h>
- #include <nlist.h>
- #include <sys/fcntl.h>
+#if __FreeBSD_version >= 300001
+#include <net/if_var.h>
+#endif
+#include <kvm.h>
+#include <nlist.h>
+#include <sys/fcntl.h>
#else
- #include <sys/sysctl.h>
- #include <net/route.h>
- #include <net/if_dl.h>
+#include <sys/sysctl.h>
+#include <net/route.h>
+#include <net/if_dl.h>
#endif
#endif
#include "config.h"
#if defined(linux)
void interface_init(void)
-/* figure out which /proc/dev/net format to use */
+/* figure out which /proc/net/dev format to use */
{
- FILE *fp = popen("uname -r", "r"); /* still wins if /proc is out */
+ struct utsname utsname;
- /* pre-linux-2.2 format -- transmit packet count in 8th field */
- netdevfmt = "%d %d %*d %*d %*d %d %*d %d %*d %*d %*d %*d %d";
+ /* Linux 2.2 -- transmit packet count in 10th field */
+ netdevfmt = "%d %d %*d %*d %*d %d %*d %*d %*d %d %*d %*d %d";
- if (!fp)
- return;
+ if (uname(&utsname) < 0)
+ return;
else
{
int major, minor;
- if (fscanf(fp, "%d.%d.%*d", &major, &minor) >= 2
- && major >= 2 && minor >= 2)
- /* Linux 2.2 -- transmit packet count in 10th field */
- netdevfmt = "%d %d %*d %*d %*d %d %*d %*d %*d %d %*d %*d %d";
- pclose(fp);
+ if (sscanf(utsname.release, "%d.%d.%*d", &major, &minor) >= 2
+ && (major < 2 || (major == 2 && minor < 2)))
+ /* pre-linux-2.2 format -- transmit packet count in 8th field */
+ netdevfmt = "%d %d %*d %*d %*d %d %*d %d %*d %*d %*d %*d %d";
}
}
-static int _get_ifinfo_(int socket_fd, FILE *stats_file, const char *ifname,
+static int _get_ifinfoGT_(int socket_fd, FILE *stats_file, const char *ifname,
ifinfo_t *ifinfo)
/* get active network interface information - return non-zero upon success */
{
if (sp)
*sp = '\0';
- result = _get_ifinfo_(socket_fd, stats_file, ifname, ifinfo);
+ result = _get_ifinfoGT_(socket_fd, stats_file, ifname, ifinfo);
if (sp)
*sp = '/';
}
static int
get_ifinfo(const char *ifname, ifinfo_t *ifinfo)
{
- char tname[16];
+ char tname[16];
char iname[16];
- struct ifnet ifnet;
+ struct ifnet ifnet;
unsigned long ifnet_addr = ifnet_savedaddr;
#if __FreeBSD_version >= 300001
struct ifnethead ifnethead;
if (if_egid)
setegid(if_egid);
- for (i = 0; ifname[i] && ifname[i] != '/'; i++)
+ for (i = 0; ifname[i] && ifname[i] != '/' && i < sizeof(iname) - 1; i++)
iname[i] = ifname[i];
iname[i] = '\0';
{
if (!openkvm())
{
- report(stderr, 0, _("Unable to open kvm interface. Make sure fetchmail is SGID kmem."));
+ report(stderr, 0, GT_("Unable to open kvm interface. Make sure fetchmail is SGID kmem."));
if (if_egid)
setegid(if_rgid);
exit(1);
{
kvm_read(kvmfd, ifnet_addr, &ifnet, sizeof(ifnet));
kvm_read(kvmfd, (unsigned long) ifnet.if_name, tname, sizeof tname);
-#ifdef HAVE_SNPRINTF
- snprintf(tname, sizeof tname - 1,
-#else
- sprintf(tname,
-#endif
- "%s%d", tname, ifnet.if_unit);
+ snprintf(tname, sizeof tname, "%s%d", tname, ifnet.if_unit);
if (!strcmp(tname, iname))
{
if (i == 0 || i == sizeof(iname))
{
- report(stderr, _("Unable to parse interface name from %s"), ifname);
+ report(stderr, GT_("Unable to parse interface name from %s"), ifname);
return 0;
}
if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1)
{
report(stderr,
- _("get_ifinfo: sysctl (iflist estimate) failed"));
+ GT_("get_ifinfo: sysctl (iflist estimate) failed"));
exit(1);
}
if ((buf = malloc(needed)) == NULL)
{
report(stderr,
- _("get_ifinfo: malloc failed"));
+ GT_("get_ifinfo: malloc failed"));
exit(1);
}
if (sysctl(mib, 6, buf, &needed, NULL, 0) == -1)
{
report(stderr,
- _("get_ifinfo: sysctl (iflist) failed"));
+ GT_("get_ifinfo: sysctl (iflist) failed"));
exit(1);
}
if (ifm->ifm_version != RTM_VERSION)
{
report(stderr,
- _("Routing message version %d not understood."),
+ GT_("Routing message version %d not understood."),
ifm->ifm_version);
exit(1);
}
if (ifindex < 0)
{
/* we did not find an interface with a matching name */
- report(stderr, _("No interface found with name %s"), iname);
+ report(stderr, GT_("No interface found with name %s"), iname);
goto get_ifinfo_end;
}
if (rc == 0)
{
- report(stderr, _("No IP address found for %s"), iname);
+ report(stderr, GT_("No IP address found for %s"), iname);
}
get_ifinfo_end:
if (!(cp1 = strchr(buf, '/')))
{
(void) report(stderr,
- _("missing IP interface address\n"));
+ GT_("missing IP interface address\n"));
exit(PS_SYNTAX);
}
*cp1++ = '\000';
if (!inet_aton(cp1, &hp->interface_pair->interface_address))
{
(void) report(stderr,
- _("invalid IP interface address\n"));
+ GT_("invalid IP interface address\n"));
exit(PS_SYNTAX);
}
if (!inet_aton(cp2, &hp->interface_pair->interface_mask))
{
(void) report(stderr,
- _("invalid IP interface mask\n"));
+ GT_("invalid IP interface mask\n"));
exit(PS_SYNTAX);
}
/* apply the mask now to the IP address (range) required */
#ifdef ACTIVITY_DEBUG
(void) report(stdout,
- _("activity on %s -noted- as %d\n"),
+ GT_("activity on %s -noted- as %d\n"),
hp->monitor, hp->monitor_io);
#endif
}
/* get interface info */
if (!get_ifinfo(hp->interface, &ifinfo)) {
(void) report(stdout,
- _("skipping poll of %s, %s down\n"),
+ GT_("skipping poll of %s, %s down\n"),
hp->pollname, hp->interface);
return(FALSE);
}
) )
{
(void) report(stdout,
- _("skipping poll of %s, %s IP address excluded\n"),
+ GT_("skipping poll of %s, %s IP address excluded\n"),
hp->pollname, hp->interface);
return(FALSE);
}
#ifdef ACTIVITY_DEBUG
(void) report(stdout,
- _("activity on %s checked as %d\n"),
+ GT_("activity on %s checked as %d\n"),
hp->monitor, hp->monitor_io);
#endif
/* if monitoring, check link for activity if it is up */
if (diff >= 0 && diff <= MONITOR_SLOP)
{
(void) report(stdout,
- _("skipping poll of %s, %s inactive\n"),
+ GT_("skipping poll of %s, %s inactive\n"),
hp->pollname, hp->monitor);
return(FALSE);
}
}
#ifdef ACTIVITY_DEBUG
- report(stdout, _("activity on %s was %d, is %d\n"),
+ report(stdout, GT_("activity on %s was %d, is %d\n"),
hp->monitor, hp->monitor_io,
ifinfo.rx_packets + ifinfo.tx_packets);
#endif