~ubuntu-branches/debian/sid/net-tools/sid

« back to all changes in this revision

Viewing changes to ifconfig.c

  • Committer: Package Import Robot
  • Author(s): Martín Ferrari
  • Date: 2015-09-07 01:54:07 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20150907015407-v2tfsgxayjd3iq4i
Tags: 1.60+git20150829.73cef8a-1
* After 14 years without an upstream release, I am producing a new package
  based on today's upstream repository.
  Closes: #391495, #486448, #323261, #260587, #545328, #511395.
* Remove many patches now merged upstream, delete unmaintainable and
  undocumented local changes, and update the rest.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 *              that either displays or sets the characteristics of
4
4
 *              one or more of the system's networking interfaces.
5
5
 *
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 $
7
7
 *
8
8
 * Author:      Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
9
9
 *              and others.  Copyright 1993 MicroWalt Corporation
19
19
 *
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
26
26
 */
49
49
#include <asm/types.h>
50
50
 
51
51
 
52
 
#ifdef HAVE_HWSLIP
 
52
#if HAVE_HWSLIP
53
53
#include <linux/if_slip.h>
54
54
#endif
55
55
 
85
85
#include "sockets.h"
86
86
#include "util.h"
87
87
 
88
 
char *Release = RELEASE, *Version = "ifconfig 1.42 (2001-04-13)";
 
88
static char *Release = RELEASE;
89
89
 
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        */
94
94
 
95
95
/* for ipv4 add/del modes */
96
 
static int get_nmbc_parent(char *parent, unsigned long *nm, 
97
 
                           unsigned long *bc);
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,
100
98
                       int flag);
101
99
 
102
100
static int if_print(char *ifname)
104
102
    int res;
105
103
 
106
104
    if (ife_short)
107
 
        printf(_("Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
 
105
        printf(_("Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
108
106
 
109
107
    if (!ifname) {
110
108
        res = for_all_interfaces(do_if_print, &opt_a);
115
113
        if (!ife) {
116
114
                return -1;
117
115
        }
118
 
        res = do_if_fetch(ife); 
119
 
        if (res >= 0) 
 
116
        res = do_if_fetch(ife);
 
117
        if (res >= 0)
120
118
            ife_print(ife);
121
119
    }
122
 
    return res; 
 
120
    return res;
123
121
}
124
122
 
125
123
/* Set a certain interface flag. */
129
127
 
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));
134
132
        return (-1);
135
133
    }
161
159
 
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));
166
164
        return -1;
167
165
    }
193
191
 
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));
198
196
        return -1;
199
197
    }
212
210
#ifdef SIOCSKEEPALIVE
213
211
    fprintf(stderr, _("  [outfill <NN>] [keepalive <NN>]\n"));
214
212
#endif
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"));
235
233
 
236
234
static void version(void)
237
235
{
238
 
    fprintf(stderr, "%s\n%s\n", Release, Version);
239
 
    exit(E_USAGE);
 
236
    fprintf(stderr, "%s\n", Release);
 
237
    exit(E_VERSION);
240
238
}
241
239
 
242
240
static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa)
243
241
{
244
242
    int err = 0;
245
243
 
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));
255
252
 
256
253
int main(int argc, char **argv)
257
254
{
258
 
    struct sockaddr sa;
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;
261
259
    char host[128];
262
 
    struct aftype *ap;
263
 
    struct hwtype *hw;
 
260
    const struct aftype *ap;
 
261
    const struct hwtype *hw;
264
262
    struct ifreq ifr;
265
263
    int goterr = 0, didnetmask = 0, neednetmask=0;
266
264
    char **spp;
267
265
    int fd;
268
266
#if HAVE_AFINET6
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;
273
271
    char *cp;
277
275
#endif
278
276
 
279
277
#if I18N
280
 
    setlocale (LC_ALL, "");
 
278
    setlocale(LC_ALL, "");
281
279
    bindtextdomain("net-tools", "/usr/share/locale");
282
280
    textdomain("net-tools");
283
281
#endif
294
292
 
295
293
        else if (!strcmp(*argv, "-v"))
296
294
            opt_v = 1;
297
 
        
 
295
 
298
296
        else if (!strcmp(*argv, "-V") || !strcmp(*argv, "-version") ||
299
297
            !strcmp(*argv, "--version"))
300
298
            version();
304
302
            usage();
305
303
 
306
304
        else {
307
 
            fprintf(stderr, _("ifconfig: option `%s' not recognised.\n"), 
 
305
            fprintf(stderr, _("ifconfig: option `%s' not recognised.\n"),
308
306
                    argv[0]);
309
307
            fprintf(stderr, _("ifconfig: `--help' gives usage information.\n"));
310
308
            exit(1);
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 */
341
 
    else 
 
339
    else
342
340
        ap = get_aftype(DFLT_AF);
343
 
        
 
341
 
344
342
    if (ap) {
345
343
        addr_family = ap->af;
346
344
        skfd = ap->fd;
385
383
                    goterr = 1;
386
384
                } else {
387
385
                    if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
388
 
                        perror("port: SIOCGIFMAP"); 
 
386
                        perror("port: SIOCGIFMAP");
389
387
                        goterr = 1;
390
388
                        continue;
391
389
                    }
441
439
        }
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);
446
444
            spp++;
447
445
            continue;
465
463
        if (!strcmp(*spp, "-dynamic")) {
466
464
            goterr |= clr_flag(ifr.ifr_name, IFF_DYNAMIC);
467
465
            spp++;
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);
470
468
            continue;
471
469
        }
472
470
#endif
473
471
 
474
 
        if (!strcmp(*spp, "metric")) {
475
 
            if (*++spp == NULL)
476
 
                usage();
477
 
            ifr.ifr_metric = atoi(*spp);
478
 
            if (ioctl(skfd, SIOCSIFMETRIC, &ifr) < 0) {
479
 
                fprintf(stderr, "SIOCSIFMETRIC: %s\n", strerror(errno));
480
 
                goterr = 1;
481
 
            }
482
 
            spp++;
483
 
            continue;
484
 
        }
485
472
        if (!strcmp(*spp, "mtu")) {
486
473
            if (*++spp == NULL)
487
474
                usage();
497
484
        if (!strcmp(*spp, "keepalive")) {
498
485
            if (*++spp == NULL)
499
486
                usage();
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));
503
490
                goterr = 1;
511
498
        if (!strcmp(*spp, "outfill")) {
512
499
            if (*++spp == NULL)
513
500
                usage();
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));
517
504
                goterr = 1;
523
510
 
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);
528
515
            spp++;
529
516
            continue;
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) {
535
522
                    if (ap->herror)
536
523
                        ap->herror(host);
537
524
                    else
540
527
                    spp++;
541
528
                    continue;
542
529
                }
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)
557
543
                usage();
558
544
            safe_strncpy(host, *spp, (sizeof host));
559
 
            if (ap->input(0, host, &sa) < 0) {
 
545
            if (ap->input(0, host, sa) < 0) {
560
546
                    if (ap->herror)
561
547
                        ap->herror(host);
562
548
                    else
565
551
                spp++;
566
552
                continue;
567
553
            }
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)
580
565
                usage();
581
566
            safe_strncpy(host, *spp, (sizeof host));
582
 
            if (ap->input(0, host, &sa) < 0) {
 
567
            if (ap->input(0, host, sa) < 0) {
583
568
                    if (ap->herror)
584
569
                        ap->herror(host);
585
570
                    else
589
574
                continue;
590
575
            }
591
576
            didnetmask++;
592
 
            goterr |= set_netmask(ap->fd, &ifr, &sa);
 
577
            goterr |= set_netmask(ap->fd, &ifr, sa);
593
578
            spp++;
594
579
            continue;
595
580
        }
611
596
            if (*++spp == NULL)
612
597
                usage();
613
598
            if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
614
 
                fprintf(stderr, "mem_start: SIOCGIFMAP: %s\n", strerror(errno)); 
615
 
                spp++; 
 
599
                fprintf(stderr, "mem_start: SIOCGIFMAP: %s\n", strerror(errno));
 
600
                spp++;
616
601
                goterr = 1;
617
602
                continue;
618
603
            }
628
613
            if (*++spp == NULL)
629
614
                usage();
630
615
            if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
631
 
                fprintf(stderr, "io_addr: SIOCGIFMAP: %s\n", strerror(errno)); 
632
 
                spp++; 
 
616
                fprintf(stderr, "io_addr: SIOCGIFMAP: %s\n", strerror(errno));
 
617
                spp++;
633
618
                goterr = 1;
634
619
                continue;
635
620
            }
645
630
            if (*++spp == NULL)
646
631
                usage();
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));
649
634
                goterr = 1;
650
 
                spp++; 
 
635
                spp++;
651
636
                continue;
652
637
            }
653
638
            ifr.ifr_map.irq = atoi(*spp);
661
646
        if (!strcmp(*spp, "-pointopoint") || !strcmp(*spp, "-pointtopoint")) {
662
647
            goterr |= clr_flag(ifr.ifr_name, IFF_POINTOPOINT);
663
648
            spp++;
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);
666
651
            continue;
667
652
        }
669
654
            if (*(spp + 1) != NULL) {
670
655
                spp++;
671
656
                safe_strncpy(host, *spp, (sizeof host));
672
 
                if (ap->input(0, host, &sa)) {
 
657
                if (ap->input(0, host, sa)) {
673
658
                    if (ap->herror)
674
659
                        ap->herror(host);
675
660
                    else
678
663
                    spp++;
679
664
                    continue;
680
665
                }
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)
706
690
                usage();
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);
710
694
                goterr = 1;
711
695
                spp++;
712
696
                continue;
713
697
            }
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;
742
725
                }
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);
748
730
                    else
751
733
                    spp++;
752
734
                    continue;
753
735
                }
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));
756
737
 
757
738
                fd = get_socket_for_af(AF_INET6);
758
739
                if (fd < 0) {
759
 
                    fprintf(stderr, 
 
740
                    fprintf(stderr,
760
741
                            _("No support for INET6 on this system.\n"));
761
742
                    goterr = 1;
762
743
                    spp++;
778
759
                continue;
779
760
            }
780
761
#endif
781
 
#ifdef HAVE_AFINET
 
762
#if HAVE_AFINET
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);
787
768
                    goterr = 1;
788
769
                    spp++;
790
771
                }
791
772
                fd = get_socket_for_af(AF_INET);
792
773
                if (fd < 0) {
793
 
                    fprintf(stderr, 
 
774
                    fprintf(stderr,
794
775
                            _("No support for INET on this system.\n"));
795
776
                    goterr = 1;
796
777
                    spp++;
797
778
                    continue;
798
779
                }
799
780
 
800
 
                memcpy(&ip, &sin.sin_addr.s_addr, sizeof(unsigned long));
801
 
                
 
781
                memcpy(&ip, &sin->sin_addr.s_addr, sizeof(ip));
 
782
 
802
783
                if (get_nmbc_parent(ifr.ifr_name, &nm, &bc) < 0) {
803
784
                        fprintf(stderr, _("Interface %s not initialized\n"),
804
785
                                ifr.ifr_name);
807
788
                        continue;
808
789
                }
809
790
                set_ifstate(ifr.ifr_name, ip, nm, bc, 1);
810
 
                
 
791
 
811
792
            }
812
793
            spp++;
813
794
            continue;
834
815
                    prefix_len = 128;
835
816
                }
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);
840
820
                    goterr = 1;
841
821
                    spp++;
842
822
                    continue;
843
823
                }
844
 
                memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr,
 
824
                memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr,
845
825
                       sizeof(struct in6_addr));
846
 
                
 
826
 
847
827
                fd = get_socket_for_af(AF_INET6);
848
828
                if (fd < 0) {
849
 
                    fprintf(stderr, 
 
829
                    fprintf(stderr,
850
830
                            _("No support for INET6 on this system.\n"));
851
831
                    goterr = 1;
852
832
                    spp++;
871
851
                continue;
872
852
            }
873
853
#endif
874
 
#ifdef HAVE_AFINET
 
854
#if HAVE_AFINET
875
855
            {
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);
881
861
                    goterr = 1;
882
862
                    spp++;
889
869
                    spp++;
890
870
                    continue;
891
871
                }
892
 
                
893
 
                memcpy(&ip, &sin.sin_addr.s_addr, sizeof(unsigned long));
894
 
                
 
872
 
 
873
                /* Clear "ip" in case sizeof(unsigned long) > sizeof(sin.sin_addr.s_addr) */
 
874
                ip = 0;
 
875
                memcpy(&ip, &sin->sin_addr.s_addr, sizeof(ip));
 
876
 
895
877
                if (get_nmbc_parent(ifr.ifr_name, &nm, &bc) < 0) {
896
878
                    fprintf(stderr, _("Interface %s not initialized\n"),
897
879
                            ifr.ifr_name);
924
906
                prefix_len = 128;
925
907
            }
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);
929
911
                goterr = 1;
930
912
                spp++;
931
913
                continue;
932
914
            }
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));
935
916
 
936
917
            fd = get_socket_for_af(AF_INET6);
937
918
            if (fd < 0) {
962
943
        /* If the next argument is a valid hostname, assume OK. */
963
944
        safe_strncpy(host, *spp, (sizeof host));
964
945
 
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)) {
969
950
            case -1:
970
951
                usage();
971
952
                break;
982
963
           fprintf(stderr, _("ifconfig: Cannot set address for this protocol family.\n"));
983
964
           exit(1);
984
965
        }
985
 
        if (ap->input(0, host, &sa) < 0) {
 
966
        if (ap->input(0, host, sa) < 0) {
986
967
            if (ap->herror)
987
968
                ap->herror(host);
988
969
            else
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);
991
972
        }
992
 
        memcpy((char *) &ifr.ifr_addr, (char *) &sa, sizeof(struct sockaddr));
 
973
        memcpy(&ifr.ifr_addr, sa, sizeof(struct sockaddr));
993
974
        {
994
975
            int r = 0;          /* to shut gcc up */
995
976
            switch (ap->af) {
1029
1010
        * end, since it's deleted already! - Roman
1030
1011
        *
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.
1033
1014
        */
1034
1015
        {
1035
1016
            char *ptr;
1036
1017
            short int found_colon = 0;
1037
1018
            for (ptr = ifr.ifr_name; *ptr; ptr++ )
1038
1019
                if (*ptr == ':') found_colon++;
1039
 
                
 
1020
 
1040
1021
            if (!(found_colon && *(ptr - 1) == '-'))
1041
1022
                goterr |= set_flag(ifr.ifr_name, (IFF_UP | IFF_RUNNING));
1042
1023
        }
1045
1026
    }
1046
1027
 
1047
1028
    if (neednetmask) {
1048
 
        goterr |= set_netmask(skfd, &ifr, &samask);
 
1029
        goterr |= set_netmask(skfd, &ifr, samask);
1049
1030
        didnetmask++;
1050
1031
    }
1051
1032
 
1084
1065
    char *z, *e;
1085
1066
    struct sockaddr_in *sin;
1086
1067
    int i;
1087
 
    
 
1068
 
1088
1069
    if (do_if_fetch(x) < 0)
1089
1070
        return 0;
1090
1071
    if (strncmp(x->name, ptr->base, ptr->baselen) != 0)
1100
1081
    if (i < 0 || i > 255)
1101
1082
        abort();
1102
1083
    searcher[i] = 1;
1103
 
    
 
1084
 
1104
1085
    /* copy */
1105
1086
    sin = (struct sockaddr_in *)&x->dstaddr;
1106
1087
    if (sin->sin_addr.s_addr != ptr->addr) {
1107
1088
        return 0;
1108
1089
    }
1109
 
    
 
1090
 
1110
1091
    if (ptr->flag) {
1111
1092
        /* turn UP */
1112
1093
        if (set_flag(x->name, IFF_UP | IFF_RUNNING) == -1)
1116
1097
        if (clr_flag(x->name, IFF_UP) == -1)
1117
1098
            return -1;
1118
1099
    }
1119
 
    
 
1100
 
1120
1101
    return 1; /* all done! */
1121
1102
}
1122
1103
 
1123
1104
 
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)
1126
1107
{
1127
1108
    struct interface *i;
1128
1109
    struct sockaddr_in *sin;
1129
 
    
 
1110
 
1130
1111
    i = lookup_interface(parent);
1131
1112
    if (!i)
1132
1113
        return -1;
1133
1114
    if (do_if_fetch(i) < 0)
1134
1115
        return 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));
1139
1120
    return 0;
1140
1121
}
1141
1122
 
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,
1144
1124
                       int flag)
1145
1125
{
1146
1126
    char buf[IFNAMSIZ];
1147
1127
    struct ifcmd pt;
1148
1128
    int i;
1149
 
    
 
1129
 
1150
1130
    pt.base = parent;
1151
1131
    pt.baselen = strlen(parent);
1152
1132
    pt.addr = ip;
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,
1156
1136
                           &pt);
1157
1137
    if (i == -1)
1158
1138
        return -1;
1159
1139
    if (i == 1)
1160
1140
        return 0;
1161
 
    
 
1141
 
1162
1142
    /* add a new interface */
1163
1143
    for (i = 0; i < 256; i++)
1164
1144
        if (searcher[i] == 0)
1166
1146
 
1167
1147
    if (i == 256)
1168
1148
        return -1; /* FAILURE!!! out of ip addresses */
1169
 
    
 
1149
 
1170
1150
    if (snprintf(buf, IFNAMSIZ, "%s:%d", parent, i) > IFNAMSIZ)
1171
1151
        return -1;
1172
1152
    if (set_ip_using(buf, SIOCSIFADDR, ip) == -1)