]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sbin/ifconfig/ifmac.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sbin / ifconfig / ifmac.c
1 /*-
2  * Copyright (c) 2001 Networks Associates Technology, Inc.
3  * All rights reserved.
4  *
5  * This software was developed for the FreeBSD Project by NAI Labs, the
6  * Security Research Division of Network Associates, Inc. under
7  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
8  * CHATS research program.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. The name of the author may not be used to endorse or promote
19  *    products derived from this software without specific prior written
20  *    permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  * $FreeBSD$
35  */
36
37 #include <sys/param.h>
38 #include <sys/ioctl.h>
39 #include <sys/mac.h>
40 #include <sys/socket.h>
41 #include <sys/sockio.h>
42
43 #include <net/if.h>
44 #include <net/route.h>
45
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49
50 #include "ifconfig.h"
51
52 static void
53 maclabel_status(int s)
54 {
55         struct ifreq ifr;
56         mac_t label;
57         char *label_text;
58
59         memset(&ifr, 0, sizeof(ifr));
60         strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
61
62         if (mac_prepare_ifnet_label(&label) == -1)
63                 return;
64         ifr.ifr_ifru.ifru_data = (void *)label;
65         if (ioctl(s, SIOCGIFMAC, &ifr) == -1)
66                 goto mac_free;
67
68         
69         if (mac_to_text(label, &label_text) == -1)
70                 goto mac_free;
71
72         if (strlen(label_text) != 0)
73                 printf("\tmaclabel %s\n", label_text);
74         free(label_text);
75
76 mac_free:
77         mac_free(label);
78 }
79
80 static void
81 setifmaclabel(const char *val, int d, int s, const struct afswtch *rafp)
82 {
83         struct ifreq ifr;
84         mac_t label;
85         int error;
86
87         if (mac_from_text(&label, val) == -1) {
88                 perror(val);
89                 return;
90         }
91
92         memset(&ifr, 0, sizeof(ifr));
93         strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
94         ifr.ifr_ifru.ifru_data = (void *)label;
95
96         error = ioctl(s, SIOCSIFMAC, &ifr);
97         mac_free(label);
98         if (error == -1)
99                 perror("setifmac");
100 }
101
102 static struct cmd mac_cmds[] = {
103         DEF_CMD_ARG("maclabel", setifmaclabel),
104 };
105 static struct afswtch af_mac = {
106         .af_name        = "af_maclabel",
107         .af_af          = AF_UNSPEC,
108         .af_other_status = maclabel_status,
109 };
110
111 static __constructor void
112 mac_ctor(void)
113 {
114 #define N(a)    (sizeof(a) / sizeof(a[0]))
115         size_t i;
116
117         for (i = 0; i < N(mac_cmds);  i++)
118                 cmd_register(&mac_cmds[i]);
119         af_register(&af_mac);
120 #undef N
121 }