*
* Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
*
+ * Changes: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ * 20010404 - use setlocale
+ *
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
-#include <linux/netdevice.h>
-#include <linux/if.h>
-#include <linux/if_arp.h>
-#include <linux/sockios.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
+#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1))
+#include <net/if.h>
+#else
+#include <linux/if.h>
+#endif
+
+#include "config.h"
#include "intl.h"
-#include "utils.h"
+#include "util.h"
+#include "util-ank.h"
#include "net-support.h"
#include "version.h"
#include "pathnames.h"
#define DELADDR 2
char *Release = RELEASE,
- *Version = "ipmaddr 1.0",
+ *Version = "ipmaddr 1.1",
*Signature = "Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>";
static void version(void)
}
}
-static int parse_lla(char *str, unsigned char *addr)
+static int parse_lla(char *str, char *addr)
{
int len=0;
len = parse_hex(hexa, (unsigned char*)&m.addr.data);
if (len >= 0) {
- struct ma_info *ma = malloc(sizeof(m));
-
+ struct ma_info *ma = xmalloc(sizeof(m));
memcpy(ma, &m, sizeof(m));
ma->addr.bytelen = len;
ma->addr.bitlen = len<<3;
void read_igmp(struct ma_info **result_p)
{
- struct ma_info m;
+ struct ma_info m, *ma = NULL;
char buf[256];
FILE *fp = fopen(_PATH_PROCNET_IGMP, "r");
if (!fp)
return;
memset(&m, 0, sizeof(m));
- fgets(buf, sizeof(buf), fp);
+ if (fgets(buf, sizeof(buf), fp))
+ /* eat line */;
m.addr.family = AF_INET;
m.addr.bitlen = 32;
m.addr.bytelen = 4;
while (fgets(buf, sizeof(buf), fp)) {
- struct ma_info *ma = malloc(sizeof(m));
-
if (buf[0] != '\t') {
sscanf(buf, "%d%s", &m.index, m.name);
continue;
sscanf(buf, "%08x%d", (__u32*)&m.addr.data, &m.users);
- ma = malloc(sizeof(m));
+ ma = xmalloc(sizeof(m));
memcpy(ma, &m, sizeof(m));
maddr_ins(result_p, ma);
}
len = parse_hex(hexa, (unsigned char*)&m.addr.data);
if (len >= 0) {
- struct ma_info *ma = malloc(sizeof(m));
-
+ struct ma_info *ma = xmalloc(sizeof(m));
memcpy(ma, &m, sizeof(m));
ma->addr.bytelen = len;
static int multiaddr_list(int argc, char **argv)
{
struct ma_info *list = NULL;
+ size_t l;
while (argc > 0) {
if (strcmp(*argv, "dev") == 0) {
NEXT_ARG();
- if (filter_dev[0])
+ l = strlen(*argv);
+ if (l <= 0 || l >= sizeof(filter_dev))
usage();
- strcpy(filter_dev, *argv);
+ strncpy(filter_dev, *argv, sizeof (filter_dev));
} else if (strcmp(*argv, "all") == 0) {
filter_family = AF_UNSPEC;
} else if (strcmp(*argv, "ipv4") == 0) {
} else if (strcmp(*argv, "link") == 0) {
filter_family = AF_PACKET;
} else {
- if (filter_dev[0])
+ l = strlen(*argv);
+ if (l <= 0 || l >= sizeof(filter_dev))
usage();
- strcpy(filter_dev, *argv);
+ strncpy(filter_dev, *argv, sizeof (filter_dev));
}
argv++; argc--;
}
{
char *basename;
+#if I18N
+ setlocale (LC_ALL, "");
+ bindtextdomain("net-tools", "/usr/share/locale");
+ textdomain("net-tools");
+#endif
+
basename = strrchr(argv[0], '/');
if (basename == NULL)
basename = argv[0];