3
3
* that either displays or sets the characteristics of
4
4
* one or more of the system's networking interfaces.
6
* Version: $Id: ifconfig.c,v 1.58 2008/10/02 23:31:04 ecki Exp $
6
* Version: $Id: ifconfig.c,v 1.59 2011-01-01 03:22:31 ecki Exp $
8
8
* Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
9
9
* and others. Copyright 1993 MicroWalt Corporation
20
20
* {1.34} - 19980630 - Arnaldo Carvalho de Melo <acme@conectiva.com.br>
21
21
* - gettext instead of catgets for i18n
22
* 10/1998 - Andi Kleen. Use interface list primitives.
23
* 20001008 - Bernd Eckenfels, Patch from RH for setting mtu
22
* 10/1998 - Andi Kleen. Use interface list primitives.
23
* 20001008 - Bernd Eckenfels, Patch from RH for setting mtu
24
24
* (default AF was wrong)
25
25
* 20010404 - Arnaldo Carvalho de Melo, use setlocale
85
85
#include "sockets.h"
88
char *Release = RELEASE, *Version = "ifconfig 1.42 (2001-04-13)";
88
static char *Release = RELEASE;
90
90
int opt_a = 0; /* show all interfaces */
91
91
int opt_v = 0; /* debugging output flag */
93
93
int addr_family = 0; /* currently selected AF */
95
95
/* for ipv4 add/del modes */
96
static int get_nmbc_parent(char *parent, unsigned long *nm,
98
static int set_ifstate(char *parent, unsigned long ip,
99
unsigned long nm, unsigned long bc,
96
static int get_nmbc_parent(char *parent, in_addr_t *nm, in_addr_t *bc);
97
static int set_ifstate(char *parent, in_addr_t ip, in_addr_t nm, in_addr_t bc,
102
100
static int if_print(char *ifname)
130
128
safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
131
129
if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) {
132
fprintf(stderr, _("%s: ERROR while getting interface flags: %s\n"),
130
fprintf(stderr, _("%s: ERROR while getting interface flags: %s\n"),
133
131
ifname, strerror(errno));
162
160
safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
163
161
if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
164
fprintf(stderr, _("%s: ERROR while getting interface flags: %s\n"),
162
fprintf(stderr, _("%s: ERROR while getting interface flags: %s\n"),
165
163
ifname, strerror(errno));
194
192
safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
195
193
if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
196
fprintf(stderr, _("%s: ERROR while testing interface flags: %s\n"),
194
fprintf(stderr, _("%s: ERROR while testing interface flags: %s\n"),
197
195
ifname, strerror(errno));
212
210
#ifdef SIOCSKEEPALIVE
213
211
fprintf(stderr, _(" [outfill <NN>] [keepalive <NN>]\n"));
215
fprintf(stderr, _(" [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n"));
213
fprintf(stderr, _(" [hw <HW> <address>] [mtu <NN>]\n"));
216
214
fprintf(stderr, _(" [[-]trailers] [[-]arp] [[-]allmulti]\n"));
217
215
fprintf(stderr, _(" [multicast] [[-]promisc]\n"));
218
216
fprintf(stderr, _(" [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n"));
236
234
static void version(void)
238
fprintf(stderr, "%s\n%s\n", Release, Version);
236
fprintf(stderr, "%s\n", Release);
242
240
static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa)
246
memcpy((char *) &ifr->ifr_netmask, (char *) sa,
247
sizeof(struct sockaddr));
244
memcpy(&ifr->ifr_netmask, sa, sizeof(struct sockaddr));
248
245
if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) {
249
246
fprintf(stderr, "SIOCSIFNETMASK: %s\n",
250
247
strerror(errno));
256
253
int main(int argc, char **argv)
259
struct sockaddr samask;
260
struct sockaddr_in sin;
255
struct sockaddr_storage _sa, _samask;
256
struct sockaddr *sa = (struct sockaddr *)&_sa;
257
struct sockaddr *samask = (struct sockaddr *)&_samask;
258
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
260
const struct aftype *ap;
261
const struct hwtype *hw;
264
262
struct ifreq ifr;
265
263
int goterr = 0, didnetmask = 0, neednetmask=0;
269
267
extern struct aftype inet6_aftype;
270
struct sockaddr_in6 sa6;
268
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
271
269
struct in6_ifreq ifr6;
272
270
unsigned long prefix_len;
295
293
else if (!strcmp(*argv, "-v"))
298
296
else if (!strcmp(*argv, "-V") || !strcmp(*argv, "-version") ||
299
297
!strcmp(*argv, "--version"))
307
fprintf(stderr, _("ifconfig: option `%s' not recognised.\n"),
305
fprintf(stderr, _("ifconfig: option `%s' not recognised.\n"),
309
307
fprintf(stderr, _("ifconfig: `--help' gives usage information.\n"));
338
336
/* The next argument is either an address family name, or an option. */
339
337
if ((ap = get_aftype(*spp)) != NULL)
340
338
spp++; /* it was a AF name */
342
340
ap = get_aftype(DFLT_AF);
345
343
addr_family = ap->af;
442
440
if (!strcmp(*spp, "-allmulti")) {
443
441
goterr |= clr_flag(ifr.ifr_name, IFF_ALLMULTI);
444
if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
442
if (test_flag(ifr.ifr_name, IFF_ALLMULTI) > 0)
445
443
fprintf(stderr, _("Warning: Interface %s still in ALLMULTI mode.\n"), ifr.ifr_name);
465
463
if (!strcmp(*spp, "-dynamic")) {
466
464
goterr |= clr_flag(ifr.ifr_name, IFF_DYNAMIC);
468
if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
466
if (test_flag(ifr.ifr_name, IFF_DYNAMIC) > 0)
469
467
fprintf(stderr, _("Warning: Interface %s still in DYNAMIC mode.\n"), ifr.ifr_name);
474
if (!strcmp(*spp, "metric")) {
477
ifr.ifr_metric = atoi(*spp);
478
if (ioctl(skfd, SIOCSIFMETRIC, &ifr) < 0) {
479
fprintf(stderr, "SIOCSIFMETRIC: %s\n", strerror(errno));
485
472
if (!strcmp(*spp, "mtu")) {
486
473
if (*++spp == NULL)
497
484
if (!strcmp(*spp, "keepalive")) {
498
485
if (*++spp == NULL)
500
ifr.ifr_data = (caddr_t) atoi(*spp);
487
ifr.ifr_data = (caddr_t) (uintptr_t) atoi(*spp);
501
488
if (ioctl(skfd, SIOCSKEEPALIVE, &ifr) < 0) {
502
489
fprintf(stderr, "SIOCSKEEPALIVE: %s\n", strerror(errno));
511
498
if (!strcmp(*spp, "outfill")) {
512
499
if (*++spp == NULL)
514
ifr.ifr_data = (caddr_t) atoi(*spp);
501
ifr.ifr_data = (caddr_t) (uintptr_t) atoi(*spp);
515
502
if (ioctl(skfd, SIOCSOUTFILL, &ifr) < 0) {
516
503
fprintf(stderr, "SIOCSOUTFILL: %s\n", strerror(errno));
524
511
if (!strcmp(*spp, "-broadcast")) {
525
512
goterr |= clr_flag(ifr.ifr_name, IFF_BROADCAST);
526
if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
513
if (test_flag(ifr.ifr_name, IFF_BROADCAST) > 0)
527
514
fprintf(stderr, _("Warning: Interface %s still in BROADCAST mode.\n"), ifr.ifr_name);
531
518
if (!strcmp(*spp, "broadcast")) {
532
519
if (*++spp != NULL) {
533
520
safe_strncpy(host, *spp, (sizeof host));
534
if (ap->input(0, host, &sa) < 0) {
521
if (ap->input(0, host, sa) < 0) {
536
523
ap->herror(host);
543
memcpy((char *) &ifr.ifr_broadaddr, (char *) &sa,
544
sizeof(struct sockaddr));
530
memcpy(&ifr.ifr_broadaddr, sa, sizeof(struct sockaddr));
545
531
if (ioctl(ap->fd, SIOCSIFBRDADDR, &ifr) < 0) {
546
532
fprintf(stderr, "SIOCSIFBRDADDR: %s\n",
547
533
strerror(errno));
556
542
if (*++spp == NULL)
558
544
safe_strncpy(host, *spp, (sizeof host));
559
if (ap->input(0, host, &sa) < 0) {
545
if (ap->input(0, host, sa) < 0) {
561
547
ap->herror(host);
568
memcpy((char *) &ifr.ifr_dstaddr, (char *) &sa,
569
sizeof(struct sockaddr));
554
memcpy(&ifr.ifr_dstaddr, sa, sizeof(struct sockaddr));
570
555
if (ioctl(ap->fd, SIOCSIFDSTADDR, &ifr) < 0) {
571
556
fprintf(stderr, "SIOCSIFDSTADDR: %s\n",
572
557
strerror(errno));
579
564
if (*++spp == NULL || didnetmask)
581
566
safe_strncpy(host, *spp, (sizeof host));
582
if (ap->input(0, host, &sa) < 0) {
567
if (ap->input(0, host, sa) < 0) {
584
569
ap->herror(host);
611
596
if (*++spp == NULL)
613
598
if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
614
fprintf(stderr, "mem_start: SIOCGIFMAP: %s\n", strerror(errno));
599
fprintf(stderr, "mem_start: SIOCGIFMAP: %s\n", strerror(errno));
628
613
if (*++spp == NULL)
630
615
if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
631
fprintf(stderr, "io_addr: SIOCGIFMAP: %s\n", strerror(errno));
616
fprintf(stderr, "io_addr: SIOCGIFMAP: %s\n", strerror(errno));
645
630
if (*++spp == NULL)
647
632
if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
648
fprintf(stderr, "irq: SIOCGIFMAP: %s\n", strerror(errno));
633
fprintf(stderr, "irq: SIOCGIFMAP: %s\n", strerror(errno));
653
638
ifr.ifr_map.irq = atoi(*spp);
661
646
if (!strcmp(*spp, "-pointopoint")) {
662
647
goterr |= clr_flag(ifr.ifr_name, IFF_POINTOPOINT);
664
if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
649
if (test_flag(ifr.ifr_name, IFF_POINTOPOINT) > 0)
665
650
fprintf(stderr, _("Warning: Interface %s still in POINTOPOINT mode.\n"), ifr.ifr_name);
669
654
if (*(spp + 1) != NULL) {
671
656
safe_strncpy(host, *spp, (sizeof host));
672
if (ap->input(0, host, &sa)) {
657
if (ap->input(0, host, sa)) {
674
659
ap->herror(host);
681
memcpy((char *) &ifr.ifr_dstaddr, (char *) &sa,
682
sizeof(struct sockaddr));
666
memcpy(&ifr.ifr_dstaddr, sa, sizeof(struct sockaddr));
683
667
if (ioctl(ap->fd, SIOCSIFDSTADDR, &ifr) < 0) {
684
668
fprintf(stderr, "SIOCSIFDSTADDR: %s\n",
685
669
strerror(errno));
705
689
if (*++spp == NULL)
707
691
safe_strncpy(host, *spp, (sizeof host));
708
if (hw->input(host, &sa) < 0) {
692
if (hw->input(host, sa) < 0) {
709
693
fprintf(stderr, _("%s: invalid %s address.\n"), host, hw->name);
714
memcpy((char *) &ifr.ifr_hwaddr, (char *) &sa,
715
sizeof(struct sockaddr));
698
memcpy(&ifr.ifr_hwaddr, sa, sizeof(struct sockaddr));
716
699
if (ioctl(skfd, SIOCSIFHWADDR, &ifr) < 0) {
717
700
if (errno == EBUSY)
718
701
fprintf(stderr, "SIOCSIFHWADDR: %s - you may need to down the interface\n",
741
724
prefix_len = 128;
743
726
safe_strncpy(host, *spp, (sizeof host));
744
if (inet6_aftype.input(1, host,
745
(struct sockaddr *) &sa6) < 0) {
727
if (inet6_aftype.input(1, host, sa) < 0) {
746
728
if (inet6_aftype.herror)
747
729
inet6_aftype.herror(host);
754
memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr,
755
sizeof(struct in6_addr));
736
memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
757
738
fd = get_socket_for_af(AF_INET6);
760
741
_("No support for INET6 on this system.\n"));
782
763
{ /* ipv4 address a.b.c.d */
783
unsigned long ip, nm, bc;
764
in_addr_t ip, nm, bc;
784
765
safe_strncpy(host, *spp, (sizeof host));
785
if (inet_aftype.input(0, host, (struct sockaddr *)&sin) < 0) {
766
if (inet_aftype.input(0, host, sa) < 0) {
786
767
ap->herror(host);
791
772
fd = get_socket_for_af(AF_INET);
794
775
_("No support for INET on this system.\n"));
800
memcpy(&ip, &sin.sin_addr.s_addr, sizeof(unsigned long));
781
memcpy(&ip, &sin->sin_addr.s_addr, sizeof(ip));
802
783
if (get_nmbc_parent(ifr.ifr_name, &nm, &bc) < 0) {
803
784
fprintf(stderr, _("Interface %s not initialized\n"),
834
815
prefix_len = 128;
836
817
safe_strncpy(host, *spp, (sizeof host));
837
if (inet6_aftype.input(1, host,
838
(struct sockaddr *) &sa6) < 0) {
818
if (inet6_aftype.input(1, host, sa) < 0) {
839
819
inet6_aftype.herror(host);
844
memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr,
824
memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr,
845
825
sizeof(struct in6_addr));
847
827
fd = get_socket_for_af(AF_INET6);
850
830
_("No support for INET6 on this system.\n"));
876
856
/* ipv4 address a.b.c.d */
877
unsigned long ip, nm, bc;
857
in_addr_t ip, nm, bc;
878
858
safe_strncpy(host, *spp, (sizeof host));
879
if (inet_aftype.input(0, host, (struct sockaddr *)&sin) < 0) {
859
if (inet_aftype.input(0, host, sa) < 0) {
880
860
ap->herror(host);
893
memcpy(&ip, &sin.sin_addr.s_addr, sizeof(unsigned long));
873
/* Clear "ip" in case sizeof(unsigned long) > sizeof(sin.sin_addr.s_addr) */
875
memcpy(&ip, &sin->sin_addr.s_addr, sizeof(ip));
895
877
if (get_nmbc_parent(ifr.ifr_name, &nm, &bc) < 0) {
896
878
fprintf(stderr, _("Interface %s not initialized\n"),
924
906
prefix_len = 128;
926
908
safe_strncpy(host, *spp, (sizeof host));
927
if (inet6_aftype.input(1, host, (struct sockaddr *) &sa6) < 0) {
909
if (inet6_aftype.input(1, host, sa) < 0) {
928
910
inet6_aftype.herror(host);
933
memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr,
934
sizeof(struct in6_addr));
915
memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
936
917
fd = get_socket_for_af(AF_INET6);
962
943
/* If the next argument is a valid hostname, assume OK. */
963
944
safe_strncpy(host, *spp, (sizeof host));
965
/* FIXME: sa is too small for INET6 addresses, inet6 should use that too,
946
/* FIXME: sa is too small for INET6 addresses, inet6 should use that too,
966
947
broadcast is unexpected */
967
948
if (ap->getmask) {
968
switch (ap->getmask(host, &samask, NULL)) {
949
switch (ap->getmask(host, samask, NULL)) {
982
963
fprintf(stderr, _("ifconfig: Cannot set address for this protocol family.\n"));
985
if (ap->input(0, host, &sa) < 0) {
966
if (ap->input(0, host, sa) < 0) {
987
968
ap->herror(host);
989
970
fprintf(stderr,_("ifconfig: error resolving '%s' to set address for af=%s\n"), host, ap->name); fprintf(stderr,
990
971
_("ifconfig: `--help' gives usage information.\n")); exit(1);
992
memcpy((char *) &ifr.ifr_addr, (char *) &sa, sizeof(struct sockaddr));
973
memcpy(&ifr.ifr_addr, sa, sizeof(struct sockaddr));
994
975
int r = 0; /* to shut gcc up */
995
976
switch (ap->af) {
1029
1010
* end, since it's deleted already! - Roman
1031
1012
* Should really use regex.h here, not sure though how well it'll go
1032
* with the cross-platform support etc.
1013
* with the cross-platform support etc.
1036
1017
short int found_colon = 0;
1037
1018
for (ptr = ifr.ifr_name; *ptr; ptr++ )
1038
1019
if (*ptr == ':') found_colon++;
1040
1021
if (!(found_colon && *(ptr - 1) == '-'))
1041
1022
goterr |= set_flag(ifr.ifr_name, (IFF_UP | IFF_RUNNING));
1116
1097
if (clr_flag(x->name, IFF_UP) == -1)
1120
1101
return 1; /* all done! */
1124
1105
static int get_nmbc_parent(char *parent,
1125
unsigned long *nm, unsigned long *bc)
1106
in_addr_t *nm, in_addr_t *bc)
1127
1108
struct interface *i;
1128
1109
struct sockaddr_in *sin;
1130
1111
i = lookup_interface(parent);
1133
1114
if (do_if_fetch(i) < 0)
1135
1116
sin = (struct sockaddr_in *)&i->netmask;
1136
memcpy(nm, &sin->sin_addr.s_addr, sizeof(unsigned long));
1117
memcpy(nm, &sin->sin_addr.s_addr, sizeof(*nm));
1137
1118
sin = (struct sockaddr_in *)&i->broadaddr;
1138
memcpy(bc, &sin->sin_addr.s_addr, sizeof(unsigned long));
1119
memcpy(bc, &sin->sin_addr.s_addr, sizeof(*bc));
1142
static int set_ifstate(char *parent, unsigned long ip,
1143
unsigned long nm, unsigned long bc,
1123
static int set_ifstate(char *parent, in_addr_t ip, in_addr_t nm, in_addr_t bc,
1146
1126
char buf[IFNAMSIZ];
1147
1127
struct ifcmd pt;
1150
1130
pt.base = parent;
1151
1131
pt.baselen = strlen(parent);
1153
1133
pt.flag = flag;
1154
1134
memset(searcher, 0, sizeof(searcher));
1155
i = for_all_interfaces((int (*)(struct interface *,void *))do_ifcmd,
1135
i = for_all_interfaces((int (*)(struct interface *,void *))do_ifcmd,
1162
1142
/* add a new interface */
1163
1143
for (i = 0; i < 256; i++)
1164
1144
if (searcher[i] == 0)
1168
1148
return -1; /* FAILURE!!! out of ip addresses */
1170
1150
if (snprintf(buf, IFNAMSIZ, "%s:%d", parent, i) > IFNAMSIZ)
1172
1152
if (set_ip_using(buf, SIOCSIFADDR, ip) == -1)