From owner-svn-src-all@FreeBSD.ORG Sun Mar 22 17:29:15 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 905F9294; Sun, 22 Mar 2015 17:29:15 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7B93DA69; Sun, 22 Mar 2015 17:29:15 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t2MHTFW3010252; Sun, 22 Mar 2015 17:29:15 GMT (envelope-from scottl@FreeBSD.org) Received: (from scottl@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t2MHTEPZ010250; Sun, 22 Mar 2015 17:29:14 GMT (envelope-from scottl@FreeBSD.org) Message-Id: <201503221729.t2MHTEPZ010250@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: scottl set sender to scottl@FreeBSD.org using -f From: Scott Long Date: Sun, 22 Mar 2015 17:29:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r280348 - head/sbin/savecore X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Mar 2015 17:29:15 -0000 Author: scottl Date: Sun Mar 22 17:29:14 2015 New Revision: 280348 URL: https://svnweb.freebsd.org/changeset/base/280348 Log: Convert savecore to libxo. The 'verbose' paths still use printf since they're meant for interactivity on the command line and contain a lot of redundant information. Obtained from: Netflix, Inc. Modified: head/sbin/savecore/Makefile head/sbin/savecore/savecore.c Modified: head/sbin/savecore/Makefile ============================================================================== --- head/sbin/savecore/Makefile Sun Mar 22 16:10:28 2015 (r280347) +++ head/sbin/savecore/Makefile Sun Mar 22 17:29:14 2015 (r280348) @@ -1,7 +1,7 @@ # $FreeBSD$ PROG= savecore -LIBADD= z +LIBADD= z xo MAN= savecore.8 .include Modified: head/sbin/savecore/savecore.c ============================================================================== --- head/sbin/savecore/savecore.c Sun Mar 22 16:10:28 2015 (r280347) +++ head/sbin/savecore/savecore.c Sun Mar 22 17:29:14 2015 (r280348) @@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include /* The size of the buffer used for I/O. */ #define BUFFERSIZE (1024*1024) @@ -98,29 +99,28 @@ static sig_atomic_t got_siginfo; static void infohandler(int); static void -printheader(FILE *f, const struct kerneldumpheader *h, const char *device, +printheader(xo_handle_t *xo, const struct kerneldumpheader *h, const char *device, int bounds, const int status) { uint64_t dumplen; time_t t; const char *stat_str; - fprintf(f, "Dump header from device %s\n", device); - fprintf(f, " Architecture: %s\n", h->architecture); - fprintf(f, " Architecture Version: %u\n", - dtoh32(h->architectureversion)); + xo_flush_h(xo); + xo_emit_h(xo, "{Lwc:Dump header from device}{:dump_device/%s}\n", device); + xo_emit_h(xo, "{P: }{Lwc:Architecture}{:architecture/%s}\n", h->architecture); + xo_emit_h(xo, "{P: }{Lwc:Architecture Version}{:architecture_version/%u}\n", dtoh32(h->architectureversion)); dumplen = dtoh64(h->dumplength); - fprintf(f, " Dump Length: %lldB (%lld MB)\n", (long long)dumplen, - (long long)(dumplen >> 20)); - fprintf(f, " Blocksize: %d\n", dtoh32(h->blocksize)); + xo_emit_h(xo, "{P: }{Lwc:Dump Length}{:dump_length_bytes/%lld}\n", (long long)dumplen); + xo_emit_h(xo, "{P: }{Lwc:Blocksize}{:blocksize/%d}\n", dtoh32(h->blocksize)); t = dtoh64(h->dumptime); - fprintf(f, " Dumptime: %s", ctime(&t)); - fprintf(f, " Hostname: %s\n", h->hostname); - fprintf(f, " Magic: %s\n", h->magic); - fprintf(f, " Version String: %s", h->versionstring); - fprintf(f, " Panic String: %s\n", h->panicstring); - fprintf(f, " Dump Parity: %u\n", h->parity); - fprintf(f, " Bounds: %d\n", bounds); + xo_emit_h(xo, "{P: }{Lwc:Dumptime}{:dumptime/%s}", ctime(&t)); + xo_emit_h(xo, "{P: }{Lwc:Hostname}{:hostname/%s}\n", h->hostname); + xo_emit_h(xo, "{P: }{Lwc:Magic}{:magic/%s}\n", h->magic); + xo_emit_h(xo, "{P: }{Lwc:Version String}{:version_string/%s}", h->versionstring); + xo_emit_h(xo, "{P: }{Lwc:Panic String}{:panic_string/%s}\n", h->panicstring); + xo_emit_h(xo, "{P: }{Lwc:Dump Parity}{:dump_parity/%u}\n", h->parity); + xo_emit_h(xo, "{P: }{Lwc:Bounds}{:bounds/%d}\n", bounds); switch(status) { case STATUS_BAD: @@ -132,8 +132,8 @@ printheader(FILE *f, const struct kernel default: stat_str = "unknown"; } - fprintf(f, " Dump Status: %s\n", stat_str); - fflush(f); + xo_emit_h(xo, "{P: }{Lwc:Dump Status}{:dump_status/%s}\n", stat_str); + xo_flush_h(xo); } static int @@ -434,6 +434,7 @@ DoTextdumpFile(int fd, off_t dumpsize, o static void 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; struct kerneldumpheader kdhf, kdhl; @@ -442,13 +443,19 @@ DoFile(const char *savedir, const char * mode_t oumask; int fd, fdinfo, error; int bounds, status; - u_int sectorsize; + u_int sectorsize, xostyle; int istextdump; bounds = getbounds(); mediasize = 0; status = STATUS_UNKNOWN; + xostdout = xo_create_to_file(stdout, XO_STYLE_TEXT, 0); + if (xostdout == NULL) { + syslog(LOG_ERR, "%s: %m", infoname); + return; + } + if (maxdumps > 0 && bounds == maxdumps) bounds = 0; @@ -574,10 +581,10 @@ DoFile(const char *savedir, const char * if (verbose >= 2) { printf("First dump headers:\n"); - printheader(stdout, &kdhf, device, bounds, -1); + printheader(xostdout, &kdhf, device, bounds, -1); printf("\nLast dump headers:\n"); - printheader(stdout, &kdhl, device, bounds, -1); + printheader(xostdout, &kdhl, device, bounds, -1); printf("\n"); } @@ -626,6 +633,7 @@ DoFile(const char *savedir, const char * nerr++; goto closefd; } + oumask = umask(S_IRWXG|S_IRWXO); /* Restrict access to the core file.*/ if (compress) { snprintf(corename, sizeof(corename), "%s.%d.gz", @@ -652,10 +660,22 @@ DoFile(const char *savedir, const char * goto closefd; } + xostyle = xo_get_style(NULL); + xoinfo = xo_create_to_file(info, xostyle, 0); + if (xoinfo == NULL) { + syslog(LOG_ERR, "%s: %m", infoname); + nerr++; + goto closefd; + } + xo_open_container_h(xoinfo, "crashdump"); + if (verbose) - printheader(stdout, &kdhl, device, bounds, status); + printheader(xostdout, &kdhl, device, bounds, status); - printheader(info, &kdhl, device, bounds, status); + printheader(xoinfo, &kdhl, device, bounds, status); + xo_close_container_h(xoinfo, "crashdump"); + xo_flush_h(xoinfo); + xo_finish_h(xoinfo); fclose(info); syslog(LOG_NOTICE, "writing %score to %s/%s", @@ -712,6 +732,8 @@ nuke: syslog(LOG_ERR, "error while clearing the dump header: %m"); } + xo_close_container_h(xostdout, "crashdump"); + xo_finish_h(xostdout); close(fd); return; @@ -725,7 +747,7 @@ closefd: static void usage(void) { - fprintf(stderr, "%s\n%s\n%s\n", + xo_error("%s\n%s\n%s\n", "usage: savecore -c [-v] [device ...]", " savecore -C [-v] [device ...]", " savecore [-fkvz] [-m maxdumps] [directory [device ...]]"); @@ -745,6 +767,10 @@ main(int argc, char **argv) openlog("savecore", LOG_PERROR, LOG_DAEMON); signal(SIGINFO, infohandler); + argc = xo_parse_args(argc, argv); + if (argc < 0) + exit(1); + while ((ch = getopt(argc, argv, "Ccfkm:vz")) != -1) switch(ch) { case 'C':