summaryrefslogtreecommitdiffstats
path: root/freebsd/sbin
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-21 09:39:55 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:40 +0200
commit2df56dbd60bb5d925d2ce0ddbdefdbe6107ea783 (patch)
treebd7bad558534db4a1f400bc38a2c9aa7ea4f411e /freebsd/sbin
parentUpdate to FreeBSD head 2018-02-01 (diff)
downloadrtems-libbsd-2df56dbd60bb5d925d2ce0ddbdefdbe6107ea783.tar.bz2
Update to FreeBSD head 2018-04-01
Git mirror commit 8dfb1ccc26d1cea7e2529303003ff61f9f1784c4. Update #3472.
Diffstat (limited to 'freebsd/sbin')
-rw-r--r--freebsd/sbin/dhclient/clparse.c2
-rw-r--r--freebsd/sbin/dhclient/conflex.c8
-rw-r--r--freebsd/sbin/dhclient/dhclient.c58
-rw-r--r--freebsd/sbin/dhclient/dhcpd.h37
-rw-r--r--freebsd/sbin/dhclient/dispatch.c26
-rw-r--r--freebsd/sbin/dhclient/errwarn.c16
-rw-r--r--freebsd/sbin/dhclient/hash.c12
-rw-r--r--freebsd/sbin/dhclient/options.c2
-rw-r--r--freebsd/sbin/dhclient/privsep.c2
-rw-r--r--freebsd/sbin/dhclient/privsep.h2
-rw-r--r--freebsd/sbin/dhclient/tables.c4
-rw-r--r--freebsd/sbin/dhclient/tree.h6
-rw-r--r--freebsd/sbin/ifconfig/af_link.c138
-rw-r--r--freebsd/sbin/ifconfig/ifconfig.c28
-rw-r--r--freebsd/sbin/ifconfig/ifieee80211.c2
-rw-r--r--freebsd/sbin/route/route.c6
-rw-r--r--freebsd/sbin/sysctl/sysctl.c224
17 files changed, 331 insertions, 242 deletions
diff --git a/freebsd/sbin/dhclient/clparse.c b/freebsd/sbin/dhclient/clparse.c
index 3466d90a..05343067 100644
--- a/freebsd/sbin/dhclient/clparse.c
+++ b/freebsd/sbin/dhclient/clparse.c
@@ -689,7 +689,7 @@ parse_option_decl(FILE *cfile, struct option_data *options)
u_int8_t hunkbuf[1024];
unsigned hunkix = 0;
char *vendor;
- char *fmt;
+ const char *fmt;
struct universe *universe;
struct option *option;
struct iaddr ip_addr;
diff --git a/freebsd/sbin/dhclient/conflex.c b/freebsd/sbin/dhclient/conflex.c
index 73b95d85..b8bf541a 100644
--- a/freebsd/sbin/dhclient/conflex.c
+++ b/freebsd/sbin/dhclient/conflex.c
@@ -57,7 +57,7 @@ int lexchar;
char *token_line;
char *prev_line;
char *cur_line;
-char *tlname;
+const char *tlname;
int eol_token;
static char line1[81];
@@ -80,7 +80,7 @@ static int read_num_or_name(int, FILE *);
static int intern(char *, int);
void
-new_parse(char *name)
+new_parse(const char *name)
{
tlname = name;
lpos = line = 1;
@@ -266,7 +266,7 @@ read_string(FILE *cfile)
static int
read_number(int c, FILE *cfile)
{
- int seenx = 0, token = NUMBER;
+ int seenx = 0, _token = NUMBER;
unsigned i = 0;
tokbuf[i++] = c;
@@ -288,7 +288,7 @@ read_number(int c, FILE *cfile)
tokbuf[i] = 0;
tval = tokbuf;
- return (token);
+ return (_token);
}
static int
diff --git a/freebsd/sbin/dhclient/dhclient.c b/freebsd/sbin/dhclient/dhclient.c
index 51fa6081..d9bae19c 100644
--- a/freebsd/sbin/dhclient/dhclient.c
+++ b/freebsd/sbin/dhclient/dhclient.c
@@ -93,7 +93,7 @@ cap_channel_t *capsyslog;
time_t cur_time;
time_t default_lease_time = 43200; /* 12 hours... */
-char *path_dhclient_conf = _PATH_DHCLIENT_CONF;
+const char *path_dhclient_conf = _PATH_DHCLIENT_CONF;
char *path_dhclient_db = NULL;
int log_perror = 1;
@@ -133,10 +133,10 @@ void routehandler(struct protocol *);
void usage(void);
int check_option(struct client_lease *l, int option);
int check_classless_option(unsigned char *data, int len);
-int ipv4addrs(char * buf);
+int ipv4addrs(const char * buf);
int res_hnok(const char *dn);
int check_search(const char *srch);
-char *option_as_string(unsigned int code, unsigned char *data, int len);
+const char *option_as_string(unsigned int code, unsigned char *data, int len);
int fork_privchld(int, int);
#define ROUNDUP(a) \
@@ -203,26 +203,25 @@ uint8_t curbssid[6];
static void
disassoc(void *arg)
{
- struct interface_info *ifi = arg;
+ struct interface_info *_ifi = arg;
/*
* Clear existing state.
*/
- if (ifi->client->active != NULL) {
+ if (_ifi->client->active != NULL) {
script_init("EXPIRE", NULL);
script_write_params("old_",
- ifi->client->active);
- if (ifi->client->alias)
+ _ifi->client->active);
+ if (_ifi->client->alias)
script_write_params("alias_",
- ifi->client->alias);
+ _ifi->client->alias);
script_go();
}
- ifi->client->state = S_INIT;
+ _ifi->client->state = S_INIT;
}
-/* ARGSUSED */
void
-routehandler(struct protocol *p)
+routehandler(struct protocol *p __unused)
{
char msg[2048], *addr;
struct rt_msghdr *rtm;
@@ -232,7 +231,7 @@ routehandler(struct protocol *p)
struct ieee80211_join_event *jev;
struct client_lease *l;
time_t t = time(NULL);
- struct sockaddr *sa;
+ struct sockaddr_in *sa;
struct iaddr a;
ssize_t n;
int linkstat;
@@ -256,13 +255,13 @@ routehandler(struct protocol *p)
if (scripttime == 0 || t < scripttime + 10)
break;
- sa = get_ifa((char *)(ifam + 1), ifam->ifam_addrs);
+ sa = (struct sockaddr_in*)get_ifa((char *)(ifam + 1), ifam->ifam_addrs);
if (sa == NULL)
break;
if ((a.len = sizeof(struct in_addr)) > sizeof(a.iabuf))
error("king bula sez: len mismatch");
- memcpy(a.iabuf, &((struct sockaddr_in *)sa)->sin_addr, a.len);
+ memcpy(a.iabuf, &sa->sin_addr, a.len);
if (addr_eq(a, defaddr))
break;
@@ -273,7 +272,7 @@ routehandler(struct protocol *p)
if (l == NULL) /* added/deleted addr is not the one we set */
break;
- addr = inet_ntoa(((struct sockaddr_in *)sa)->sin_addr);
+ addr = inet_ntoa(sa->sin_addr);
if (rtm->rtm_type == RTM_NEWADDR) {
/*
* XXX: If someone other than us adds our address,
@@ -948,7 +947,7 @@ dhcp(struct packet *packet)
{
struct iaddrlist *ap;
void (*handler)(struct packet *);
- char *type;
+ const char *type;
switch (packet->packet_type) {
case DHCPOFFER:
@@ -986,7 +985,7 @@ dhcpoffer(struct packet *packet)
struct client_lease *lease, *lp;
int i;
int arp_timeout_needed, stop_selecting;
- char *name = packet->options[DHO_DHCP_MESSAGE_TYPE].len ?
+ const char *name = packet->options[DHO_DHCP_MESSAGE_TYPE].len ?
"DHCPOFFER" : "BOOTREPLY";
/* If we're not receptive to an offer right now, or if the offer
@@ -1516,7 +1515,8 @@ cancel:
memcpy(&to.s_addr, ip->client->destination.iabuf,
sizeof(to.s_addr));
- if (ip->client->state != S_REQUESTING)
+ if (ip->client->state != S_REQUESTING &&
+ ip->client->state != S_REBOOTING)
memcpy(&from, ip->client->active->address.iabuf,
sizeof(from));
else
@@ -1995,7 +1995,7 @@ write_client_lease(struct interface_info *ip, struct client_lease *lease,
}
void
-script_init(char *reason, struct string_list *medium)
+script_init(const char *reason, struct string_list *medium)
{
size_t len, mediumlen = 0;
struct imsg_hdr hdr;
@@ -2030,7 +2030,7 @@ script_init(char *reason, struct string_list *medium)
}
void
-priv_script_init(char *reason, char *medium)
+priv_script_init(const char *reason, char *medium)
{
struct interface_info *ip = ifi;
@@ -2058,7 +2058,7 @@ priv_script_init(char *reason, char *medium)
}
void
-priv_script_write_params(char *prefix, struct client_lease *lease)
+priv_script_write_params(const char *prefix, struct client_lease *lease)
{
struct interface_info *ip = ifi;
u_int8_t dbuf[1500], *dp = NULL;
@@ -2198,7 +2198,7 @@ supersede:
}
void
-script_write_params(char *prefix, struct client_lease *lease)
+script_write_params(const char *prefix, struct client_lease *lease)
{
size_t fn_len = 0, sn_len = 0, pr_len = 0;
struct imsg_hdr hdr;
@@ -2432,7 +2432,7 @@ go_daemon(void)
/* Stop logging to stderr... */
log_perror = 0;
- if (daemon(1, 1) == -1)
+ if (daemonfd(-1, nullfd) == -1)
error("daemon");
cap_rights_init(&rights);
@@ -2445,11 +2445,7 @@ go_daemon(void)
}
}
- /* we are chrooted, daemon(3) fails to open /dev/null */
if (nullfd != -1) {
- dup2(nullfd, STDIN_FILENO);
- dup2(nullfd, STDOUT_FILENO);
- dup2(nullfd, STDERR_FILENO);
close(nullfd);
nullfd = -1;
}
@@ -2466,8 +2462,8 @@ go_daemon(void)
int
check_option(struct client_lease *l, int option)
{
- char *opbuf;
- char *sbuf;
+ const char *opbuf;
+ const char *sbuf;
/* we use this, since this is what gets passed to dhclient-script */
@@ -2727,7 +2723,7 @@ check_search(const char *srch)
* otherwise, return 0
*/
int
-ipv4addrs(char * buf)
+ipv4addrs(const char * buf)
{
struct in_addr jnk;
int count = 0;
@@ -2745,7 +2741,7 @@ ipv4addrs(char * buf)
}
-char *
+const char *
option_as_string(unsigned int code, unsigned char *data, int len)
{
static char optbuf[32768]; /* XXX */
diff --git a/freebsd/sbin/dhclient/dhcpd.h b/freebsd/sbin/dhclient/dhcpd.h
index ad64a441..8f9071aa 100644
--- a/freebsd/sbin/dhclient/dhcpd.h
+++ b/freebsd/sbin/dhclient/dhcpd.h
@@ -235,7 +235,7 @@ struct protocol {
struct hash_bucket {
struct hash_bucket *next;
- unsigned char *name;
+ const unsigned char *name;
int len;
unsigned char *value;
};
@@ -258,26 +258,27 @@ struct hash_table {
/* options.c */
int cons_options(struct packet *, struct dhcp_packet *, int,
struct tree_cache **, int, int, int, u_int8_t *, int);
-char *pretty_print_option(unsigned int,
+const char *pretty_print_option(unsigned int,
unsigned char *, int, int, int);
void do_packet(struct interface_info *, struct dhcp_packet *,
int, unsigned int, struct iaddr, struct hardware *);
/* errwarn.c */
extern int warnings_occurred;
-void error(char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
-int warning(char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
-int note(char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
-int debug(char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
-int parse_warn(char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+void error(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+int warning(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+int note(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+int debug(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+int parse_warn(const char *, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
/* conflex.c */
extern int lexline, lexchar;
-extern char *token_line, *tlname;
+extern char *token_line;
+extern const char *tlname;
extern char comments[4096];
extern int comment_index;
extern int eol_token;
-void new_parse(char *);
+void new_parse(const char *);
int next_token(char **, FILE *);
int peek_token(char **, FILE *);
@@ -321,7 +322,7 @@ void dispatch(void);
void got_one(struct protocol *);
void add_timeout(time_t, void (*)(void *), void *);
void cancel_timeout(void (*)(void *), void *);
-void add_protocol(char *, int, void (*)(struct protocol *), void *);
+void add_protocol(const char *, int, void (*)(struct protocol *), void *);
void remove_protocol(struct protocol *);
int interface_link_status(char *);
void interface_set_mtu_unpriv(int, u_int16_t);
@@ -329,8 +330,8 @@ void interface_set_mtu_priv(char *, u_int16_t);
/* hash.c */
struct hash_table *new_hash(void);
-void add_hash(struct hash_table *, unsigned char *, int, unsigned char *);
-unsigned char *hash_lookup(struct hash_table *, unsigned char *, int);
+void add_hash(struct hash_table *, const unsigned char *, int, unsigned char *);
+void *hash_lookup(struct hash_table *, unsigned char *, int);
/* tables.c */
extern struct option dhcp_options[256];
@@ -358,7 +359,7 @@ char *piaddr(struct iaddr);
/* dhclient.c */
extern cap_channel_t *capsyslog;
-extern char *path_dhclient_conf;
+extern const char *path_dhclient_conf;
extern char *path_dhclient_db;
extern time_t cur_time;
extern int log_priority;
@@ -393,12 +394,12 @@ void free_client_lease(struct client_lease *);
void rewrite_client_leases(void);
void write_client_lease(struct interface_info *, struct client_lease *, int);
-void priv_script_init(char *, char *);
-void priv_script_write_params(char *, struct client_lease *);
+void priv_script_init(const char *, char *);
+void priv_script_write_params(const char *, struct client_lease *);
int priv_script_go(void);
-void script_init(char *, struct string_list *);
-void script_write_params(char *, struct client_lease *);
+void script_init(const char *, struct string_list *);
+void script_write_params(const char *, struct client_lease *);
int script_go(void);
void client_envadd(struct client_state *,
const char *, const char *, const char *, ...);
@@ -442,7 +443,7 @@ void parse_reject_statement(FILE *, struct client_config *);
/* privsep.c */
struct buf *buf_open(size_t);
-int buf_add(struct buf *, void *, size_t);
+int buf_add(struct buf *, const void *, size_t);
int buf_close(int, struct buf *);
ssize_t buf_read(int, void *, size_t);
void dispatch_imsg(struct interface_info *, int);
diff --git a/freebsd/sbin/dhclient/dispatch.c b/freebsd/sbin/dhclient/dispatch.c
index 958e38c7..a9cc65b7 100644
--- a/freebsd/sbin/dhclient/dispatch.c
+++ b/freebsd/sbin/dhclient/dispatch.c
@@ -51,10 +51,14 @@ __FBSDID("$FreeBSD$");
#include <sys/ioctl.h>
+#include <assert.h>
#include <net/if_media.h>
#include <ifaddrs.h>
#include <poll.h>
+/* Assert that pointer p is aligned to at least align bytes */
+#define assert_aligned(p, align) assert((((uintptr_t)p) & ((align) - 1)) == 0)
+
struct protocol *protocols;
struct timeout *timeouts;
static struct timeout *free_timeouts;
@@ -75,7 +79,6 @@ void
discover_interfaces(struct interface_info *iface)
{
struct ifaddrs *ifap, *ifa;
- struct sockaddr_in foo;
struct ifreq *tif;
if (getifaddrs(&ifap) != 0)
@@ -95,8 +98,22 @@ discover_interfaces(struct interface_info *iface)
* and record it in a linked list.
*/
if (ifa->ifa_addr->sa_family == AF_LINK) {
- struct sockaddr_dl *foo =
- (struct sockaddr_dl *)ifa->ifa_addr;
+ struct sockaddr_dl *foo;
+
+ /*
+ * The implementation of getifaddrs should guarantee
+ * this alignment
+ */
+ assert_aligned(ifa->ifa_addr,
+ _Alignof(struct sockaddr_dl));
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wcast-align"
+#endif
+ foo = (struct sockaddr_dl *)ifa->ifa_addr;
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
iface->index = foo->sdl_index;
iface->hw_address.hlen = foo->sdl_alen;
@@ -104,6 +121,7 @@ discover_interfaces(struct interface_info *iface)
memcpy(iface->hw_address.haddr,
LLADDR(foo), foo->sdl_alen);
} else if (ifa->ifa_addr->sa_family == AF_INET) {
+ struct sockaddr_in foo;
struct iaddr addr;
memcpy(&foo, ifa->ifa_addr, sizeof(foo));
@@ -439,7 +457,7 @@ cancel_timeout(void (*where)(void *), void *what)
/* Add a protocol to the list of protocols... */
void
-add_protocol(char *name, int fd, void (*handler)(struct protocol *),
+add_protocol(const char *name, int fd, void (*handler)(struct protocol *),
void *local)
{
struct protocol *p;
diff --git a/freebsd/sbin/dhclient/errwarn.c b/freebsd/sbin/dhclient/errwarn.c
index e99f5f50..ab9a56fd 100644
--- a/freebsd/sbin/dhclient/errwarn.c
+++ b/freebsd/sbin/dhclient/errwarn.c
@@ -51,7 +51,7 @@ __FBSDID("$FreeBSD$");
#include "dhcpd.h"
-static void do_percentm(char *obuf, size_t size, char *ibuf);
+static void do_percentm(char *obuf, size_t size, const char *ibuf);
static char mbuf[1024];
static char fbuf[1024];
@@ -62,7 +62,7 @@ int warnings_occurred;
* Log an error message, then exit.
*/
void
-error(char *fmt, ...)
+error(const char *fmt, ...)
{
va_list list;
@@ -96,7 +96,7 @@ error(char *fmt, ...)
* Log a warning message...
*/
int
-warning(char *fmt, ...)
+warning(const char *fmt, ...)
{
va_list list;
@@ -122,7 +122,7 @@ warning(char *fmt, ...)
* Log a note...
*/
int
-note(char *fmt, ...)
+note(const char *fmt, ...)
{
va_list list;
@@ -148,7 +148,7 @@ note(char *fmt, ...)
* Log a debug message...
*/
int
-debug(char *fmt, ...)
+debug(const char *fmt, ...)
{
va_list list;
@@ -174,10 +174,10 @@ debug(char *fmt, ...)
* Find %m in the input string and substitute an error message string.
*/
static void
-do_percentm(char *obuf, size_t size, char *ibuf)
+do_percentm(char *obuf, size_t size, const char *ibuf)
{
char ch;
- char *s = ibuf;
+ const char *s = ibuf;
char *t = obuf;
size_t prlen;
size_t fmt_left;
@@ -207,7 +207,7 @@ do_percentm(char *obuf, size_t size, char *ibuf)
}
int
-parse_warn(char *fmt, ...)
+parse_warn(const char *fmt, ...)
{
va_list list;
static char spaces[] =
diff --git a/freebsd/sbin/dhclient/hash.c b/freebsd/sbin/dhclient/hash.c
index 879edbfc..f32adb11 100644
--- a/freebsd/sbin/dhclient/hash.c
+++ b/freebsd/sbin/dhclient/hash.c
@@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$");
#include "dhcpd.h"
-static int do_hash(unsigned char *, int, int);
+static int do_hash(const unsigned char *, int, int);
struct hash_table *
new_hash(void)
@@ -64,9 +64,9 @@ new_hash(void)
}
static int
-do_hash(unsigned char *name, int len, int size)
+do_hash(const unsigned char *name, int len, int size)
{
- unsigned char *s = name;
+ const unsigned char *s = name;
int accum = 0, i = len;
while (i--) {
@@ -79,7 +79,7 @@ do_hash(unsigned char *name, int len, int size)
return (accum % size);
}
-void add_hash(struct hash_table *table, unsigned char *name, int len,
+void add_hash(struct hash_table *table, const unsigned char *name, int len,
unsigned char *pointer)
{
struct hash_bucket *bp;
@@ -88,7 +88,7 @@ void add_hash(struct hash_table *table, unsigned char *name, int len,
if (!table)
return;
if (!len)
- len = strlen((char *)name);
+ len = strlen((const char *)name);
hashno = do_hash(name, len, table->hash_count);
bp = new_hash_bucket();
@@ -104,7 +104,7 @@ void add_hash(struct hash_table *table, unsigned char *name, int len,
table->buckets[hashno] = bp;
}
-unsigned char *
+void *
hash_lookup(struct hash_table *table, unsigned char *name, int len)
{
struct hash_bucket *bp;
diff --git a/freebsd/sbin/dhclient/options.c b/freebsd/sbin/dhclient/options.c
index fad7dacd..209b6536 100644
--- a/freebsd/sbin/dhclient/options.c
+++ b/freebsd/sbin/dhclient/options.c
@@ -630,7 +630,7 @@ store_options(unsigned char *buffer, int buflen, struct tree_cache **options,
/*
* Format the specified option so that a human can easily read it.
*/
-char *
+const char *
pretty_print_option(unsigned int code, unsigned char *data, int len,
int emit_commas, int emit_quotes)
{
diff --git a/freebsd/sbin/dhclient/privsep.c b/freebsd/sbin/dhclient/privsep.c
index 0b0d8771..f76d2d5f 100644
--- a/freebsd/sbin/dhclient/privsep.c
+++ b/freebsd/sbin/dhclient/privsep.c
@@ -41,7 +41,7 @@ buf_open(size_t len)
}
int
-buf_add(struct buf *buf, void *data, size_t len)
+buf_add(struct buf *buf, const void *data, size_t len)
{
if (buf->wpos + len > buf->size)
return (-1);
diff --git a/freebsd/sbin/dhclient/privsep.h b/freebsd/sbin/dhclient/privsep.h
index e1a7338f..41b8267e 100644
--- a/freebsd/sbin/dhclient/privsep.h
+++ b/freebsd/sbin/dhclient/privsep.h
@@ -46,6 +46,6 @@ struct imsg_hdr {
};
struct buf *buf_open(size_t);
-int buf_add(struct buf *, void *, size_t);
+int buf_add(struct buf *, const void *, size_t);
int buf_close(int, struct buf *);
ssize_t buf_read(int sock, void *, size_t);
diff --git a/freebsd/sbin/dhclient/tables.c b/freebsd/sbin/dhclient/tables.c
index d33ab6fa..b93193b7 100644
--- a/freebsd/sbin/dhclient/tables.c
+++ b/freebsd/sbin/dhclient/tables.c
@@ -442,11 +442,11 @@ initialize_universes(void)
for (i = 0; i < 256; i++) {
dhcp_universe.options[i] = &dhcp_options[i];
add_hash(dhcp_universe.hash,
- (unsigned char *)dhcp_options[i].name, 0,
+ (const unsigned char *)dhcp_options[i].name, 0,
(unsigned char *)&dhcp_options[i]);
}
universe_hash.hash_count = DEFAULT_HASH_SIZE;
add_hash(&universe_hash,
- (unsigned char *)dhcp_universe.name, 0,
+ (const unsigned char *)dhcp_universe.name, 0,
(unsigned char *)&dhcp_universe);
}
diff --git a/freebsd/sbin/dhclient/tree.h b/freebsd/sbin/dhclient/tree.h
index 9fdcc0d3..7bbd1e4c 100644
--- a/freebsd/sbin/dhclient/tree.h
+++ b/freebsd/sbin/dhclient/tree.h
@@ -57,14 +57,14 @@ struct tree_cache {
};
struct universe {
- char *name;
+ const char *name;
struct hash_table *hash;
struct option *options[256];
};
struct option {
- char *name;
- char *format;
+ const char *name;
+ const char *format;
struct universe *universe;
unsigned char code;
};
diff --git a/freebsd/sbin/ifconfig/af_link.c b/freebsd/sbin/ifconfig/af_link.c
index c08a19fc..61a071ef 100644
--- a/freebsd/sbin/ifconfig/af_link.c
+++ b/freebsd/sbin/ifconfig/af_link.c
@@ -72,78 +72,78 @@ static void
link_status(int s __unused, const struct ifaddrs *ifa)
{
/* XXX no const 'cuz LLADDR is defined wrong */
- struct sockaddr_dl *sdl = (struct sockaddr_dl *) ifa->ifa_addr;
+ struct sockaddr_dl *sdl;
char *ether_format, *format_char;
-
- if (sdl != NULL && sdl->sdl_alen > 0) {
- if ((sdl->sdl_type == IFT_ETHER ||
- sdl->sdl_type == IFT_L2VLAN ||
- sdl->sdl_type == IFT_BRIDGE) &&
- sdl->sdl_alen == ETHER_ADDR_LEN) {
- ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl));
- if (f_ether != NULL && strcmp(f_ether, "dash") == 0) {
- for (format_char = strchr(ether_format, ':');
- format_char != NULL;
- format_char = strchr(ether_format, ':'))
- *format_char = '-';
- }
- printf("\tether %s\n", ether_format);
- } else {
- int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
-
- printf("\tlladdr %s\n", link_ntoa(sdl) + n);
- }
- /* Best-effort (i.e. failures are silent) to get original
- * hardware address, as read by NIC driver at attach time. Only
- * applies to Ethernet NICs (IFT_ETHER). However, laggX
- * interfaces claim to be IFT_ETHER, and re-type their component
- * Ethernet NICs as IFT_IEEE8023ADLAG. So, check for both. If
- * the MAC is zeroed, then it's actually a lagg.
- */
- if ((sdl->sdl_type == IFT_ETHER ||
- sdl->sdl_type == IFT_IEEE8023ADLAG) &&
- sdl->sdl_alen == ETHER_ADDR_LEN) {
- struct ifreq ifr;
- int sock_hw;
- int rc;
- static const u_char laggaddr[6] = {0};
-
- strncpy(ifr.ifr_name, ifa->ifa_name,
- sizeof(ifr.ifr_name));
- memcpy(&ifr.ifr_addr, ifa->ifa_addr,
- sizeof(ifa->ifa_addr->sa_len));
- ifr.ifr_addr.sa_family = AF_LOCAL;
- if ((sock_hw = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) {
- warn("socket(AF_LOCAL,SOCK_DGRAM)");
- return;
- }
- rc = ioctl(sock_hw, SIOCGHWADDR, &ifr);
- close(sock_hw);
- if (rc != 0) {
- return;
- }
-
- /*
- * If this is definitely a lagg device or the hwaddr
- * matches the link addr, don't bother.
- */
- if (memcmp(ifr.ifr_addr.sa_data, laggaddr,
- sdl->sdl_alen) == 0 ||
- memcmp(ifr.ifr_addr.sa_data, LLADDR(sdl),
- sdl->sdl_alen) == 0) {
- return;
- }
- ether_format = ether_ntoa((const struct ether_addr *)
- &ifr.ifr_addr.sa_data);
- if (f_ether != NULL && strcmp(f_ether, "dash") == 0) {
- for (format_char = strchr(ether_format, ':');
- format_char != NULL;
- format_char = strchr(ether_format, ':'))
- *format_char = '-';
- }
- printf("\thwaddr %s\n", ether_format);
+ struct ifreq ifr;
+ int n, rc, sock_hw;
+ static const u_char laggaddr[6] = {0};
+
+ sdl = (struct sockaddr_dl *) ifa->ifa_addr;
+ if (sdl == NULL || sdl->sdl_alen == 0)
+ return;
+
+ if ((sdl->sdl_type == IFT_ETHER || sdl->sdl_type == IFT_L2VLAN ||
+ sdl->sdl_type == IFT_BRIDGE) && sdl->sdl_alen == ETHER_ADDR_LEN) {
+ ether_format = ether_ntoa((struct ether_addr *)LLADDR(sdl));
+ if (f_ether != NULL && strcmp(f_ether, "dash") == 0) {
+ for (format_char = strchr(ether_format, ':');
+ format_char != NULL;
+ format_char = strchr(ether_format, ':'))
+ *format_char = '-';
}
+ printf("\tether %s\n", ether_format);
+ } else {
+ n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
+ printf("\tlladdr %s\n", link_ntoa(sdl) + n);
}
+
+ /*
+ * Best-effort (i.e. failures are silent) to get original
+ * hardware address, as read by NIC driver at attach time. Only
+ * applies to Ethernet NICs (IFT_ETHER). However, laggX
+ * interfaces claim to be IFT_ETHER, and re-type their component
+ * Ethernet NICs as IFT_IEEE8023ADLAG. So, check for both. If
+ * the MAC is zeroed, then it's actually a lagg.
+ */
+ if ((sdl->sdl_type != IFT_ETHER &&
+ sdl->sdl_type != IFT_IEEE8023ADLAG) ||
+ sdl->sdl_alen != ETHER_ADDR_LEN)
+ return;
+
+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name));
+ memcpy(&ifr.ifr_addr, ifa->ifa_addr, sizeof(ifa->ifa_addr->sa_len));
+ ifr.ifr_addr.sa_family = AF_LOCAL;
+ if ((sock_hw = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) {
+ warn("socket(AF_LOCAL,SOCK_DGRAM)");
+ return;
+ }
+ rc = ioctl(sock_hw, SIOCGHWADDR, &ifr);
+ close(sock_hw);
+ if (rc != 0)
+ return;
+
+ /*
+ * If this is definitely a lagg device or the hwaddr
+ * matches the link addr, don't bother.
+ */
+ if (memcmp(ifr.ifr_addr.sa_data, laggaddr, sdl->sdl_alen) == 0 ||
+ memcmp(ifr.ifr_addr.sa_data, LLADDR(sdl), sdl->sdl_alen) == 0)
+ goto pcp;
+
+ ether_format = ether_ntoa((const struct ether_addr *)
+ &ifr.ifr_addr.sa_data);
+ if (f_ether != NULL && strcmp(f_ether, "dash") == 0) {
+ for (format_char = strchr(ether_format, ':');
+ format_char != NULL;
+ format_char = strchr(ether_format, ':'))
+ *format_char = '-';
+ }
+ printf("\thwaddr %s\n", ether_format);
+
+pcp:
+ if (ioctl(s, SIOCGLANPCP, (caddr_t)&ifr) == 0 &&
+ ifr.ifr_lan_pcp != IFNET_PCP_NONE)
+ printf("\tpcp %d\n", ifr.ifr_lan_pcp);
}
static void
diff --git a/freebsd/sbin/ifconfig/ifconfig.c b/freebsd/sbin/ifconfig/ifconfig.c
index 410c4849..e625e42b 100644
--- a/freebsd/sbin/ifconfig/ifconfig.c
+++ b/freebsd/sbin/ifconfig/ifconfig.c
@@ -1161,6 +1161,32 @@ setifmtu(const char *val, int dummy __unused, int s,
}
static void
+setifpcp(const char *val, int arg __unused, int s, const struct afswtch *afp)
+{
+ u_long ul;
+ char *endp;
+
+ ul = strtoul(val, &endp, 0);
+ if (*endp != '\0')
+ errx(1, "invalid value for pcp");
+ if (ul > 7)
+ errx(1, "value for pcp out of range");
+ ifr.ifr_lan_pcp = ul;
+ if (ioctl(s, SIOCSLANPCP, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSLANPCP");
+}
+
+static void
+disableifpcp(const char *val, int arg __unused, int s,
+ const struct afswtch *afp)
+{
+
+ ifr.ifr_lan_pcp = IFNET_PCP_NONE;
+ if (ioctl(s, SIOCSLANPCP, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSLANPCP");
+}
+
+static void
setifname(const char *val, int dummy __unused, int s,
const struct afswtch *afp)
{
@@ -1523,6 +1549,8 @@ static struct cmd basic_cmds[] = {
DEF_CMD("-txcsum", -IFCAP_TXCSUM, setifcap),
DEF_CMD("netcons", IFCAP_NETCONS, setifcap),
DEF_CMD("-netcons", -IFCAP_NETCONS, setifcap),
+ DEF_CMD_ARG("pcp", setifpcp),
+ DEF_CMD("-pcp", 0, disableifpcp),
DEF_CMD("polling", IFCAP_POLLING, setifcap),
DEF_CMD("-polling", -IFCAP_POLLING, setifcap),
DEF_CMD("tso6", IFCAP_TSO6, setifcap),
diff --git a/freebsd/sbin/ifconfig/ifieee80211.c b/freebsd/sbin/ifconfig/ifieee80211.c
index c3139e2c..8faeca23 100644
--- a/freebsd/sbin/ifconfig/ifieee80211.c
+++ b/freebsd/sbin/ifconfig/ifieee80211.c
@@ -3519,7 +3519,7 @@ list_scan(int s)
getchaninfo(s);
- ssidmax = verbose ? IEEE80211_NWID_LEN : 14;
+ ssidmax = verbose ? IEEE80211_NWID_LEN : 32;
printf("%-*.*s %-17.17s %4s %4s %-7s %3s %4s\n"
, ssidmax, ssidmax, "SSID/MESH ID"
, "BSSID"
diff --git a/freebsd/sbin/route/route.c b/freebsd/sbin/route/route.c
index e994dfcc..80404d66 100644
--- a/freebsd/sbin/route/route.c
+++ b/freebsd/sbin/route/route.c
@@ -578,6 +578,7 @@ retry:
printf("done\n");
}
}
+ free(buf);
return (error);
}
@@ -1498,6 +1499,7 @@ retry2:
rtm = (struct rt_msghdr *)(void *)next;
print_rtmsg(rtm, rtm->rtm_msglen);
}
+ free(buf);
}
static void
@@ -1578,8 +1580,10 @@ rtmsg(int cmd, int flags, int fib)
so[RTAX_IFP].ss_len = sizeof(struct sockaddr_dl);
rtm_addrs |= RTA_IFP;
}
- } else
+ } else {
cmd = RTM_DELETE;
+ flags |= RTF_PINNED;
+ }
#define rtm m_rtmsg.m_rtm
rtm.rtm_type = cmd;
rtm.rtm_flags = flags;
diff --git a/freebsd/sbin/sysctl/sysctl.c b/freebsd/sbin/sysctl/sysctl.c
index d69d1ac5..a1b6d268 100644
--- a/freebsd/sbin/sysctl/sysctl.c
+++ b/freebsd/sbin/sysctl/sysctl.c
@@ -77,6 +77,7 @@ static const char rcsid[] =
#include <errno.h>
#include <inttypes.h>
#include <locale.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -281,16 +282,17 @@ main(int argc, char **argv)
}
/*
- * Parse a name into a MIB entry.
- * Lookup and print out the MIB entry if it exists.
- * Set a new value if requested.
+ * Parse a single numeric value, append it to 'newbuf', and update
+ * 'newsize'. Returns true if the value was parsed and false if the
+ * value was invalid. Non-numeric types (strings) are handled
+ * directly in parse().
*/
-static int
-parse(const char *string, int lineno)
+static bool
+parse_numeric(const char *newvalstr, const char *fmt, u_int kind,
+ void **newbufp, size_t *newsizep)
{
- int len, i, j;
+ void *newbuf;
const void *newval;
- const char *newvalstr = NULL;
int8_t i8val;
uint8_t u8val;
int16_t i16val;
@@ -301,11 +303,111 @@ parse(const char *string, int lineno)
unsigned int uintval;
long longval;
unsigned long ulongval;
- size_t newsize = Bflag;
int64_t i64val;
uint64_t u64val;
+ size_t valsize;
+ char *endptr = NULL;
+
+ errno = 0;
+
+ switch (kind & CTLTYPE) {
+ case CTLTYPE_INT:
+ if (strncmp(fmt, "IK", 2) == 0)
+ intval = strIKtoi(newvalstr, &endptr, fmt);
+ else
+ intval = (int)strtol(newvalstr, &endptr, 0);
+ newval = &intval;
+ valsize = sizeof(intval);
+ break;
+ case CTLTYPE_UINT:
+ uintval = (int) strtoul(newvalstr, &endptr, 0);
+ newval = &uintval;
+ valsize = sizeof(uintval);
+ break;
+ case CTLTYPE_LONG:
+ longval = strtol(newvalstr, &endptr, 0);
+ newval = &longval;
+ valsize = sizeof(longval);
+ break;
+ case CTLTYPE_ULONG:
+ ulongval = strtoul(newvalstr, &endptr, 0);
+ newval = &ulongval;
+ valsize = sizeof(ulongval);
+ break;
+ case CTLTYPE_S8:
+ i8val = (int8_t)strtol(newvalstr, &endptr, 0);
+ newval = &i8val;
+ valsize = sizeof(i8val);
+ break;
+ case CTLTYPE_S16:
+ i16val = (int16_t)strtol(newvalstr, &endptr, 0);
+ newval = &i16val;
+ valsize = sizeof(i16val);
+ break;
+ case CTLTYPE_S32:
+ i32val = (int32_t)strtol(newvalstr, &endptr, 0);
+ newval = &i32val;
+ valsize = sizeof(i32val);
+ break;
+ case CTLTYPE_S64:
+ i64val = strtoimax(newvalstr, &endptr, 0);
+ newval = &i64val;
+ valsize = sizeof(i64val);
+ break;
+ case CTLTYPE_U8:
+ u8val = (uint8_t)strtoul(newvalstr, &endptr, 0);
+ newval = &u8val;
+ valsize = sizeof(u8val);
+ break;
+ case CTLTYPE_U16:
+ u16val = (uint16_t)strtoul(newvalstr, &endptr, 0);
+ newval = &u16val;
+ valsize = sizeof(u16val);
+ break;
+ case CTLTYPE_U32:
+ u32val = (uint32_t)strtoul(newvalstr, &endptr, 0);
+ newval = &u32val;
+ valsize = sizeof(u32val);
+ break;
+ case CTLTYPE_U64:
+ u64val = strtoumax(newvalstr, &endptr, 0);
+ newval = &u64val;
+ valsize = sizeof(u64val);
+ break;
+ default:
+ /* NOTREACHED */
+ abort();
+ }
+
+ if (errno != 0 || endptr == newvalstr ||
+ (endptr != NULL && *endptr != '\0'))
+ return (false);
+
+ newbuf = realloc(*newbufp, *newsizep + valsize);
+ if (newbuf == NULL)
+ err(1, "out of memory");
+ memcpy((char *)newbuf + *newsizep, newval, valsize);
+ *newbufp = newbuf;
+ *newsizep += valsize;
+
+ return (true);
+}
+
+/*
+ * Parse a name into a MIB entry.
+ * Lookup and print out the MIB entry if it exists.
+ * Set a new value if requested.
+ */
+static int
+parse(const char *string, int lineno)
+{
+ int len, i, j;
+ const void *newval;
+ char *newvalstr = NULL;
+ void *newbuf;
+ size_t newsize = Bflag;
int mib[CTL_MAXNAME];
- char *cp, *bufp, buf[BUFSIZ], *endptr = NULL, fmt[BUFSIZ], line[BUFSIZ];
+ char *cp, *bufp, buf[BUFSIZ], fmt[BUFSIZ], line[BUFSIZ];
u_int kind;
if (lineno)
@@ -424,94 +526,33 @@ parse(const char *string, int lineno)
return (1);
}
- errno = 0;
+ newbuf = NULL;
switch (kind & CTLTYPE) {
- case CTLTYPE_INT:
- if (strncmp(fmt, "IK", 2) == 0)
- intval = strIKtoi(newvalstr, &endptr, fmt);
- else
- intval = (int)strtol(newvalstr, &endptr,
- 0);
- newval = &intval;
- newsize = sizeof(intval);
- break;
- case CTLTYPE_UINT:
- uintval = (int) strtoul(newvalstr, &endptr, 0);
- newval = &uintval;
- newsize = sizeof(uintval);
- break;
- case CTLTYPE_LONG:
- longval = strtol(newvalstr, &endptr, 0);
- newval = &longval;
- newsize = sizeof(longval);
- break;
- case CTLTYPE_ULONG:
- ulongval = strtoul(newvalstr, &endptr, 0);
- newval = &ulongval;
- newsize = sizeof(ulongval);
- break;
- case CTLTYPE_STRING:
- newval = newvalstr;
- break;
- case CTLTYPE_S8:
- i8val = (int8_t)strtol(newvalstr, &endptr, 0);
- newval = &i8val;
- newsize = sizeof(i8val);
- break;
- case CTLTYPE_S16:
- i16val = (int16_t)strtol(newvalstr, &endptr,
- 0);
- newval = &i16val;
- newsize = sizeof(i16val);
- break;
- case CTLTYPE_S32:
- i32val = (int32_t)strtol(newvalstr, &endptr,
- 0);
- newval = &i32val;
- newsize = sizeof(i32val);
- break;
- case CTLTYPE_S64:
- i64val = strtoimax(newvalstr, &endptr, 0);
- newval = &i64val;
- newsize = sizeof(i64val);
- break;
- case CTLTYPE_U8:
- u8val = (uint8_t)strtoul(newvalstr, &endptr, 0);
- newval = &u8val;
- newsize = sizeof(u8val);
- break;
- case CTLTYPE_U16:
- u16val = (uint16_t)strtoul(newvalstr, &endptr,
- 0);
- newval = &u16val;
- newsize = sizeof(u16val);
- break;
- case CTLTYPE_U32:
- u32val = (uint32_t)strtoul(newvalstr, &endptr,
- 0);
- newval = &u32val;
- newsize = sizeof(u32val);
- break;
- case CTLTYPE_U64:
- u64val = strtoumax(newvalstr, &endptr, 0);
- newval = &u64val;
- newsize = sizeof(u64val);
- break;
- default:
- /* NOTREACHED */
- abort();
- }
-
- if (errno != 0 || endptr == newvalstr ||
- (endptr != NULL && *endptr != '\0')) {
- warnx("invalid %s '%s'%s", ctl_typename[kind & CTLTYPE],
- newvalstr, line);
- return (1);
+ case CTLTYPE_STRING:
+ newval = newvalstr;
+ break;
+ default:
+ newsize = 0;
+ while ((cp = strsep(&newvalstr, " ,")) != NULL) {
+ if (*cp == '\0')
+ continue;
+ if (!parse_numeric(cp, fmt, kind, &newbuf,
+ &newsize)) {
+ warnx("invalid %s '%s'%s",
+ ctl_typename[kind & CTLTYPE],
+ cp, line);
+ free(newbuf);
+ return (1);
+ }
+ }
+ newval = newbuf;
+ break;
}
i = show_var(mib, len);
if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
+ free(newbuf);
if (!i && !bflag)
putchar('\n');
switch (errno) {
@@ -532,6 +573,7 @@ parse(const char *string, int lineno)
return (1);
}
}
+ free(newbuf);
if (!bflag)
printf(" -> ");
i = nflag;