summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorgjb <gjb@FreeBSD.org>2016-04-16 02:32:12 +0000
committergjb <gjb@FreeBSD.org>2016-04-16 02:32:12 +0000
commit6549ef7d128d37c0dfff87f6c1c189b42ed3e1ef (patch)
treea8871301d693c6d33d43cd3171b1ee4783fec0e4 /sbin
parentae096a53a90aee9859587d48d5a0279567abb413 (diff)
parent35691f7a6f04cec368d8636543bca596e870faf3 (diff)
downloadFreeBSD-src-6549ef7d128d37c0dfff87f6c1c189b42ed3e1ef.zip
FreeBSD-src-6549ef7d128d37c0dfff87f6c1c189b42ed3e1ef.tar.gz
MFH
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sbin')
-rw-r--r--sbin/devd/devd.conf.522
-rw-r--r--sbin/dump/optr.c2
-rw-r--r--sbin/fsck_ffs/globs.c2
-rw-r--r--sbin/ifconfig/sfp.c2
-rw-r--r--sbin/ipfw/ipfw2.c155
-rw-r--r--sbin/ipfw/ipfw2.h11
-rw-r--r--sbin/ipfw/ipv6.c6
-rw-r--r--sbin/ipfw/tables.c39
-rw-r--r--sbin/mount_nfs/mount_nfs.c2
-rw-r--r--sbin/pfctl/parse.y15
-rw-r--r--sbin/reboot/nextboot.83
-rw-r--r--sbin/reboot/nextboot.sh2
-rw-r--r--sbin/savecore/savecore.c33
13 files changed, 226 insertions, 68 deletions
diff --git a/sbin/devd/devd.conf.5 b/sbin/devd/devd.conf.5
index 83c4c76..b358dcb 100644
--- a/sbin/devd/devd.conf.5
+++ b/sbin/devd/devd.conf.5
@@ -41,7 +41,7 @@
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\"
-.Dd March 28, 2016
+.Dd April 14, 2016
.Dt DEVD.CONF 5
.Os
.Sh NAME
@@ -501,6 +501,23 @@ Information about the state of the system.
Notification that the system has woken from the suspended state.
.El
.El
+.Pp
+.It Li CAM
+Events related to the
+.Xr cam 4
+system.
+.Bl -tag -width ".Sy Subsystem" -compact
+.It Sy Subsystem
+.It Li periph
+Events related to peripheral devices.
+.Bl -tag -width ".li timeout" -compact
+.It Sy Type
+.It Li error
+Generic errors.
+.It Li timeout
+Command timeouts.
+.El
+.El
.El
.Pp
A link state change to UP on the interface
@@ -630,4 +647,5 @@ has many additional examples.
.Xr coretemp 4 ,
.Xr devfs 5 ,
.Xr re_format 7 ,
-.Xr devd 8
+.Xr devd 8 ,
+.Xr cam 4
diff --git a/sbin/dump/optr.c b/sbin/dump/optr.c
index 311e255..bffcdc8 100644
--- a/sbin/dump/optr.c
+++ b/sbin/dump/optr.c
@@ -403,7 +403,7 @@ lastdump(int arg) /* w ==> just what to do; W ==> most recent dumps */
dumpme = tnow > (dtwalk->dd_ddate - (tlast->tm_hour * 3600)
- (tlast->tm_min * 60) - tlast->tm_sec
+ (dt->fs_freq * 86400));
- };
+ }
if (arg != 'w' || dumpme)
(void) printf(
"%c %8s\t(%6s) Last dump: Level %d, Date %s\n",
diff --git a/sbin/fsck_ffs/globs.c b/sbin/fsck_ffs/globs.c
index e910bc9..af3b72b 100644
--- a/sbin/fsck_ffs/globs.c
+++ b/sbin/fsck_ffs/globs.c
@@ -118,7 +118,7 @@ fsckinit(void)
bzero(totalreadcnt, sizeof(long) * BT_NUMBUFTYPES);
bzero(readtime, sizeof(struct timespec) * BT_NUMBUFTYPES);
bzero(totalreadtime, sizeof(struct timespec) * BT_NUMBUFTYPES);
- bzero(&startprog, sizeof(struct timespec));;
+ bzero(&startprog, sizeof(struct timespec));
bzero(&sblk, sizeof(struct bufarea));
pdirbp = NULL;
pbp = NULL;
diff --git a/sbin/ifconfig/sfp.c b/sbin/ifconfig/sfp.c
index d92ee2c..0fa29a3 100644
--- a/sbin/ifconfig/sfp.c
+++ b/sbin/ifconfig/sfp.c
@@ -911,6 +911,6 @@ sfp_status(int s, struct ifreq *ifr, int verbose)
break;
default:
print_sfp_status(&ii, verbose);
- };
+ }
}
diff --git a/sbin/ipfw/ipfw2.c b/sbin/ipfw/ipfw2.c
index 95a96ad..21b6229 100644
--- a/sbin/ipfw/ipfw2.c
+++ b/sbin/ipfw/ipfw2.c
@@ -234,6 +234,9 @@ static struct _s_x ether_types[] = {
{ NULL, 0 }
};
+static struct _s_x rule_eactions[] = {
+ { NULL, 0 } /* terminator */
+};
static struct _s_x rule_actions[] = {
{ "accept", TOK_ACCEPT },
@@ -265,6 +268,7 @@ static struct _s_x rule_actions[] = {
{ "setdscp", TOK_SETDSCP },
{ "call", TOK_CALL },
{ "return", TOK_RETURN },
+ { "eaction", TOK_EACTION },
{ NULL, 0 } /* terminator */
};
@@ -381,6 +385,8 @@ static uint16_t pack_table(struct tidx *tstate, char *name);
static char *table_search_ctlv(ipfw_obj_ctlv *ctlv, uint16_t idx);
static void object_sort_ctlv(ipfw_obj_ctlv *ctlv);
+static char *object_search_ctlv(ipfw_obj_ctlv *ctlv, uint16_t idx,
+ uint16_t type);
/*
* Simple string buffer API.
@@ -634,7 +640,7 @@ do_get3(int optname, ip_fw3_opheader *op3, size_t *optlen)
* with the string (-1 in case of failure).
*/
int
-match_token(struct _s_x *table, char *string)
+match_token(struct _s_x *table, const char *string)
{
struct _s_x *pt;
uint i = strlen(string);
@@ -646,7 +652,7 @@ match_token(struct _s_x *table, char *string)
}
/**
- * match_token takes a table and a string, returns the value associated
+ * match_token_relaxed takes a table and a string, returns the value associated
* with the string for the best match.
*
* Returns:
@@ -655,7 +661,7 @@ match_token(struct _s_x *table, char *string)
* -2 if more than one records match @string.
*/
int
-match_token_relaxed(struct _s_x *table, char *string)
+match_token_relaxed(struct _s_x *table, const char *string)
{
struct _s_x *pt, *m;
int i, c;
@@ -676,6 +682,18 @@ match_token_relaxed(struct _s_x *table, char *string)
return (c > 0 ? -2: -1);
}
+int
+get_token(struct _s_x *table, const char *string, const char *errbase)
+{
+ int tcmd;
+
+ if ((tcmd = match_token_relaxed(table, string)) < 0)
+ errx(EX_USAGE, "%s %s %s",
+ (tcmd == 0) ? "invalid" : "ambiguous", errbase, string);
+
+ return (tcmd);
+}
+
/**
* match_value takes a table and a value, returns the string associated
* with the value (NULL in case of failure).
@@ -1383,7 +1401,7 @@ show_static_rule(struct cmdline_opts *co, struct format_opts *fo,
{
static int twidth = 0;
int l;
- ipfw_insn *cmd, *tagptr = NULL;
+ ipfw_insn *cmd, *has_eaction = NULL, *tagptr = NULL;
const char *comment = NULL; /* ptr to comment if we have one */
int proto = 0; /* default */
int flags = 0; /* prerequisites */
@@ -1484,7 +1502,7 @@ show_static_rule(struct cmdline_opts *co, struct format_opts *fo,
if (cmd->arg1 == ICMP6_UNREACH_RST)
bprintf(bp, "reset6");
else
- print_unreach6_code(cmd->arg1);
+ print_unreach6_code(bp, cmd->arg1);
break;
case O_SKIPTO:
@@ -1567,6 +1585,52 @@ show_static_rule(struct cmdline_opts *co, struct format_opts *fo,
bprint_uint_arg(bp, "setfib ", cmd->arg1 & 0x7FFF);
break;
+ case O_EXTERNAL_ACTION: {
+ const char *ename;
+
+ /*
+ * The external action can consists of two following
+ * each other opcodes - O_EXTERNAL_ACTION and
+ * O_EXTERNAL_INSTANCE. The first contains the ID of
+ * name of external action. The second contains the ID
+ * of name of external action instance.
+ * NOTE: in case when external action has no named
+ * instances support, the second opcode isn't needed.
+ */
+ has_eaction = cmd;
+ ename = object_search_ctlv(fo->tstate, cmd->arg1,
+ IPFW_TLV_EACTION);
+ if (match_token(rule_eactions, ename) != -1)
+ bprintf(bp, "%s", ename);
+ else
+ bprintf(bp, "eaction %s", ename);
+ break;
+ }
+
+ case O_EXTERNAL_INSTANCE: {
+ const char *ename;
+
+ if (has_eaction == NULL)
+ break;
+ /*
+ * XXX: we need to teach ipfw(9) to rewrite opcodes
+ * in the user buffer on rule addition. When we add
+ * the rule, we specify zero TLV type for
+ * O_EXTERNAL_INSTANCE object. To show correct
+ * rule after `ipfw add` we need to search instance
+ * name with zero type. But when we do `ipfw show`
+ * we calculate TLV type using IPFW_TLV_EACTION_NAME()
+ * macro.
+ */
+ ename = object_search_ctlv(fo->tstate, cmd->arg1, 0);
+ if (ename == NULL)
+ ename = object_search_ctlv(fo->tstate,
+ cmd->arg1,
+ IPFW_TLV_EACTION_NAME(has_eaction->arg1));
+ bprintf(bp, " %s", ename);
+ break;
+ }
+
case O_SETDSCP:
{
const char *code;
@@ -2730,6 +2794,42 @@ struct tidx {
uint8_t set;
};
+int
+ipfw_check_object_name(const char *name)
+{
+ int c, i, l;
+
+ /*
+ * Check that name is null-terminated and contains
+ * valid symbols only. Valid mask is:
+ * [a-zA-Z0-9\-_\.]{1,63}
+ */
+ l = strlen(name);
+ if (l == 0 || l >= 64)
+ return (EINVAL);
+ for (i = 0; i < l; i++) {
+ c = name[i];
+ if (isalpha(c) || isdigit(c) || c == '_' ||
+ c == '-' || c == '.')
+ continue;
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static int
+eaction_check_name(const char *name)
+{
+
+ if (ipfw_check_object_name(name) != 0)
+ return (EINVAL);
+ /* Restrict some 'special' names */
+ if (match_token(rule_actions, name) != -1 &&
+ match_token(rule_action_params, name) != -1)
+ return (EINVAL);
+ return (0);
+}
+
static uint16_t
pack_object(struct tidx *tstate, char *name, int otype)
{
@@ -3833,7 +3933,46 @@ chkarg:
break;
default:
- errx(EX_DATAERR, "invalid action %s\n", av[-1]);
+ av--;
+ if (match_token(rule_eactions, *av) == -1)
+ errx(EX_DATAERR, "invalid action %s\n", *av);
+ /*
+ * External actions support.
+ * XXX: we support only syntax with instance name.
+ * For known external actions (from rule_eactions list)
+ * we can handle syntax directly. But with `eaction'
+ * keyword we can use only `eaction <name> <instance>'
+ * syntax.
+ */
+ case TOK_EACTION: {
+ uint16_t idx;
+
+ NEED1("Missing eaction name");
+ if (eaction_check_name(*av) != 0)
+ errx(EX_DATAERR, "Invalid eaction name %s", *av);
+ idx = pack_object(tstate, *av, IPFW_TLV_EACTION);
+ if (idx == 0)
+ errx(EX_DATAERR, "pack_object failed");
+ fill_cmd(action, O_EXTERNAL_ACTION, 0, idx);
+ av++;
+ NEED1("Missing eaction instance name");
+ action = next_cmd(action, &ablen);
+ action->len = 1;
+ CHECK_ACTLEN;
+ if (eaction_check_name(*av) != 0)
+ errx(EX_DATAERR, "Invalid eaction instance name %s",
+ *av);
+ /*
+ * External action instance object has TLV type depended
+ * from the external action name object index. Since we
+ * currently don't know this index, use zero as TLV type.
+ */
+ idx = pack_object(tstate, *av, 0);
+ if (idx == 0)
+ errx(EX_DATAERR, "pack_object failed");
+ fill_cmd(action, O_EXTERNAL_INSTANCE, 0, idx);
+ av++;
+ }
}
action = next_cmd(action, &ablen);
@@ -4758,7 +4897,7 @@ object_search_ctlv(ipfw_obj_ctlv *ctlv, uint16_t idx, uint16_t type)
ntlv = bsearch(&key, (ctlv + 1), ctlv->count, ctlv->objsize,
compare_object_kntlv);
- if (ntlv != 0)
+ if (ntlv != NULL)
return (ntlv->name);
return (NULL);
@@ -5019,7 +5158,7 @@ ipfw_list_objects(int ac, char *av[])
printf("There are no objects\n");
ntlv = (ipfw_obj_ntlv *)(olh + 1);
for (i = 0; i < olh->count; i++) {
- printf(" kidx: %4d\ttype: %2d\tname: %s\n", ntlv->idx,
+ printf(" kidx: %4d\ttype: %6d\tname: %s\n", ntlv->idx,
ntlv->head.type, ntlv->name);
ntlv++;
}
diff --git a/sbin/ipfw/ipfw2.h b/sbin/ipfw/ipfw2.h
index 86f2a41..d18803d 100644
--- a/sbin/ipfw/ipfw2.h
+++ b/sbin/ipfw/ipfw2.h
@@ -83,6 +83,7 @@ enum tokens {
TOK_ACCEPT,
TOK_COUNT,
+ TOK_EACTION,
TOK_PIPE,
TOK_LINK,
TOK_QUEUE,
@@ -261,8 +262,9 @@ int _substrcmp2(const char *str1, const char* str2, const char* str3);
int stringnum_cmp(const char *a, const char *b);
/* utility functions */
-int match_token(struct _s_x *table, char *string);
-int match_token_relaxed(struct _s_x *table, char *string);
+int match_token(struct _s_x *table, const char *string);
+int match_token_relaxed(struct _s_x *table, const char *string);
+int get_token(struct _s_x *table, const char *string, const char *errbase);
char const *match_value(struct _s_x *p, int value);
size_t concat_tokens(char *buf, size_t bufsize, struct _s_x *table,
char *delimiter);
@@ -313,6 +315,7 @@ void ipfw_flush(int force);
void ipfw_zero(int ac, char *av[], int optname);
void ipfw_list(int ac, char *av[], int show_counters);
void ipfw_internal_handler(int ac, char *av[]);
+int ipfw_check_object_name(const char *name);
#ifdef PF
/* altq.c */
@@ -329,7 +332,7 @@ void dummynet_flush(void);
int ipfw_delete_pipe(int pipe_or_queue, int n);
/* ipv6.c */
-void print_unreach6_code(uint16_t code);
+void print_unreach6_code(struct buf_pr *bp, uint16_t code);
void print_ip6(struct buf_pr *bp, struct _ipfw_insn_ip6 *cmd, char const *s);
void print_flow6id(struct buf_pr *bp, struct _ipfw_insn_u32 *cmd);
void print_icmp6types(struct buf_pr *bp, struct _ipfw_insn_u32 *cmd);
@@ -345,7 +348,7 @@ int fill_ext6hdr(struct _ipfw_insn *cmd, char *av);
/* tables.c */
struct _ipfw_obj_ctlv;
-int table_check_name(char *tablename);
+int table_check_name(const char *tablename);
void ipfw_list_ta(int ac, char *av[]);
void ipfw_list_values(int ac, char *av[]);
diff --git a/sbin/ipfw/ipv6.c b/sbin/ipfw/ipv6.c
index 36ee675..c04dd70 100644
--- a/sbin/ipfw/ipv6.c
+++ b/sbin/ipfw/ipv6.c
@@ -71,14 +71,14 @@ fill_unreach6_code(u_short *codep, char *str)
}
void
-print_unreach6_code(uint16_t code)
+print_unreach6_code(struct buf_pr *bp, uint16_t code)
{
char const *s = match_value(icmp6codes, code);
if (s != NULL)
- printf("unreach6 %s", s);
+ bprintf(bp, "unreach6 %s", s);
else
- printf("unreach6 %u", code);
+ bprintf(bp, "unreach6 %u", code);
}
/*
diff --git a/sbin/ipfw/tables.c b/sbin/ipfw/tables.c
index 7eff340..2264e32 100644
--- a/sbin/ipfw/tables.c
+++ b/sbin/ipfw/tables.c
@@ -53,8 +53,8 @@ static void table_lock(ipfw_obj_header *oh, int lock);
static int table_swap(ipfw_obj_header *oh, char *second);
static int table_get_info(ipfw_obj_header *oh, ipfw_xtable_info *i);
static int table_show_info(ipfw_xtable_info *i, void *arg);
-static void table_fill_ntlv(ipfw_obj_ntlv *ntlv, char *name, uint32_t set,
- uint16_t uidx);
+static void table_fill_ntlv(ipfw_obj_ntlv *ntlv, const char *name,
+ uint32_t set, uint16_t uidx);
static int table_flush_one(ipfw_xtable_info *i, void *arg);
static int table_show_one(ipfw_xtable_info *i, void *arg);
@@ -130,18 +130,6 @@ lookup_host (char *host, struct in_addr *ipaddr)
return(0);
}
-static int
-get_token(struct _s_x *table, char *string, char *errbase)
-{
- int tcmd;
-
- if ((tcmd = match_token_relaxed(table, string)) < 0)
- errx(EX_USAGE, "%s %s %s",
- (tcmd == 0) ? "invalid" : "ambiguous", errbase, string);
-
- return (tcmd);
-}
-
/*
* This one handles all table-related commands
* ipfw table NAME create ...
@@ -293,7 +281,8 @@ ipfw_table_handler(int ac, char *av[])
}
static void
-table_fill_ntlv(ipfw_obj_ntlv *ntlv, char *name, uint32_t set, uint16_t uidx)
+table_fill_ntlv(ipfw_obj_ntlv *ntlv, const char *name, uint32_t set,
+ uint16_t uidx)
{
ntlv->head.type = IPFW_TLV_TBL_NAME;
@@ -1994,30 +1983,14 @@ ipfw_list_values(int ac, char *av[])
}
int
-table_check_name(char *tablename)
+table_check_name(const char *tablename)
{
- int c, i, l;
- /*
- * Check if tablename is null-terminated and contains
- * valid symbols only. Valid mask is:
- * [a-zA-Z0-9\-_\.]{1,63}
- */
- l = strlen(tablename);
- if (l == 0 || l >= 64)
+ if (ipfw_check_object_name(tablename) != 0)
return (EINVAL);
- for (i = 0; i < l; i++) {
- c = tablename[i];
- if (isalpha(c) || isdigit(c) || c == '_' ||
- c == '-' || c == '.')
- continue;
- return (EINVAL);
- }
-
/* Restrict some 'special' names */
if (strcmp(tablename, "all") == 0)
return (EINVAL);
-
return (0);
}
diff --git a/sbin/mount_nfs/mount_nfs.c b/sbin/mount_nfs/mount_nfs.c
index 810cf59..149d127 100644
--- a/sbin/mount_nfs/mount_nfs.c
+++ b/sbin/mount_nfs/mount_nfs.c
@@ -1027,7 +1027,7 @@ xdr_fh(XDR *xdrsp, struct nfhret *np)
if (!authfnd && (authcnt > 0 || np->auth != AUTH_SYS))
np->stat = EAUTH;
return (1);
- };
+ }
return (0);
}
diff --git a/sbin/pfctl/parse.y b/sbin/pfctl/parse.y
index 9b22a6b..a03ddbc 100644
--- a/sbin/pfctl/parse.y
+++ b/sbin/pfctl/parse.y
@@ -1605,13 +1605,22 @@ bandwidth : STRING {
bps = strtod($1, &cp);
if (cp != NULL) {
+ if (strlen(cp) > 1) {
+ char *cu = cp + 1;
+ if (!strcmp(cu, "Bit") ||
+ !strcmp(cu, "B") ||
+ !strcmp(cu, "bit") ||
+ !strcmp(cu, "b")) {
+ *cu = 0;
+ }
+ }
if (!strcmp(cp, "b"))
; /* nothing */
- else if (!strcmp(cp, "Kb"))
+ else if (!strcmp(cp, "K"))
bps *= 1000;
- else if (!strcmp(cp, "Mb"))
+ else if (!strcmp(cp, "M"))
bps *= 1000 * 1000;
- else if (!strcmp(cp, "Gb"))
+ else if (!strcmp(cp, "G"))
bps *= 1000 * 1000 * 1000;
else if (!strcmp(cp, "%")) {
if (bps < 0 || bps > 100) {
diff --git a/sbin/reboot/nextboot.8 b/sbin/reboot/nextboot.8
index d006c3f..8b72b9a 100644
--- a/sbin/reboot/nextboot.8
+++ b/sbin/reboot/nextboot.8
@@ -32,9 +32,8 @@
.Nd "specify an alternate kernel and boot flags for the next reboot"
.Sh SYNOPSIS
.Nm
-.Op Fl a
+.Op Fl af
.Op Fl e Ar variable=value
-.Op Fl f
.Op Fl k Ar kernel
.Op Fl o Ar options
.Nm
diff --git a/sbin/reboot/nextboot.sh b/sbin/reboot/nextboot.sh
index a90fdeb..d9bbb25 100644
--- a/sbin/reboot/nextboot.sh
+++ b/sbin/reboot/nextboot.sh
@@ -50,7 +50,7 @@ add_kenv()
display_usage() {
cat <<-EOF
- Usage: nextboot [-e variable=value] [-f] [-k kernel] [-o options]
+ Usage: nextboot [-af] [-e variable=value] [-k kernel] [-o options]
nextboot -D
EOF
}
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c
index 7809c58..1d00ed2 100644
--- a/sbin/savecore/savecore.c
+++ b/sbin/savecore/savecore.c
@@ -436,7 +436,7 @@ DoFile(const char *savedir, const char *device)
{
xo_handle_t *xostdout, *xoinfo;
static char infoname[PATH_MAX], corename[PATH_MAX], linkname[PATH_MAX];
- static char *buf = NULL;
+ static char *buf = NULL, *temp = NULL;
struct kerneldumpheader kdhf, kdhl;
off_t mediasize, dumpsize, firsthd, lasthd;
FILE *info, *fp;
@@ -490,14 +490,29 @@ DoFile(const char *savedir, const char *device)
printf("sectorsize = %u\n", sectorsize);
}
+ if (sectorsize < sizeof(kdhl)) {
+ syslog(LOG_ERR,
+ "Sector size is less the kernel dump header %zu",
+ sizeof(kdhl));
+ goto closefd;
+ }
+
lasthd = mediasize - sectorsize;
+ if (temp == NULL) {
+ temp = malloc(sectorsize);
+ if (temp == NULL) {
+ syslog(LOG_ERR, "%m");
+ return;
+ }
+ }
if (lseek(fd, lasthd, SEEK_SET) != lasthd ||
- read(fd, &kdhl, sizeof(kdhl)) != sizeof(kdhl)) {
+ read(fd, temp, sectorsize) != (ssize_t)sectorsize) {
syslog(LOG_ERR,
"error reading last dump header at offset %lld in %s: %m",
(long long)lasthd, device);
goto closefd;
}
+ memcpy(&kdhl, temp, sizeof(kdhl));
istextdump = 0;
if (strncmp(kdhl.magic, TEXTDUMPMAGIC, sizeof kdhl) == 0) {
if (verbose)
@@ -567,15 +582,16 @@ DoFile(const char *savedir, const char *device)
goto closefd;
}
dumpsize = dtoh64(kdhl.dumplength);
- firsthd = lasthd - dumpsize - sizeof kdhf;
+ firsthd = lasthd - dumpsize - sectorsize;
if (lseek(fd, firsthd, SEEK_SET) != firsthd ||
- read(fd, &kdhf, sizeof(kdhf)) != sizeof(kdhf)) {
+ read(fd, temp, sectorsize) != (ssize_t)sectorsize) {
syslog(LOG_ERR,
"error reading first dump header at offset %lld in %s: %m",
(long long)firsthd, device);
nerr++;
goto closefd;
}
+ memcpy(&kdhf, temp, sizeof(kdhf));
if (verbose >= 2) {
printf("First dump headers:\n");
@@ -586,7 +602,7 @@ DoFile(const char *savedir, const char *device)
printf("\n");
}
- if (memcmp(&kdhl, &kdhf, sizeof kdhl)) {
+ if (memcmp(&kdhl, &kdhf, sizeof(kdhl))) {
syslog(LOG_ERR,
"first and last dump headers disagree on %s", device);
nerr++;
@@ -603,7 +619,7 @@ DoFile(const char *savedir, const char *device)
exit(0);
}
- if (kdhl.panicstring[0])
+ if (kdhl.panicstring[0] != '\0')
syslog(LOG_ALERT, "reboot after panic: %*s",
(int)sizeof(kdhl.panicstring), kdhl.panicstring);
else
@@ -724,9 +740,10 @@ nuke:
if (!keep) {
if (verbose)
printf("clearing dump header\n");
- memcpy(kdhl.magic, KERNELDUMPMAGIC_CLEARED, sizeof kdhl.magic);
+ memcpy(kdhl.magic, KERNELDUMPMAGIC_CLEARED, sizeof(kdhl.magic));
+ memcpy(temp, &kdhl, sizeof(kdhl));
if (lseek(fd, lasthd, SEEK_SET) != lasthd ||
- write(fd, &kdhl, sizeof(kdhl)) != sizeof(kdhl))
+ write(fd, temp, sectorsize) != (ssize_t)sectorsize)
syslog(LOG_ERR,
"error while clearing the dump header: %m");
}
OpenPOWER on IntegriCloud