diff options
author | jhb <jhb@FreeBSD.org> | 2008-07-01 22:30:57 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2008-07-01 22:30:57 +0000 |
commit | b3f9efd84f8df8197d4f03f332661619566d3c1c (patch) | |
tree | f24771b13b316a88d1eb8552fd86fc7cfd0f39a9 /lib | |
parent | 0739111e2a4030f5345e082e7d433fe861ac07e0 (diff) | |
download | FreeBSD-src-b3f9efd84f8df8197d4f03f332661619566d3c1c.zip FreeBSD-src-b3f9efd84f8df8197d4f03f332661619566d3c1c.tar.gz |
Merge hexdump(9) to userland as hexdump(3) in libutil. I'm tired of doing
this by hand in userland utilities.
MFC after: 1 month
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libutil/Makefile | 6 | ||||
-rw-r--r-- | lib/libutil/hexdump.3 | 94 | ||||
-rw-r--r-- | lib/libutil/hexdump.c | 96 | ||||
-rw-r--r-- | lib/libutil/libutil.h | 8 |
4 files changed, 201 insertions, 3 deletions
diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile index 4860292..ce544c3 100644 --- a/lib/libutil/Makefile +++ b/lib/libutil/Makefile @@ -9,9 +9,9 @@ LIB= util SHLIB_MAJOR= 7 SRCS= _secure_path.c auth.c gr_util.c expand_number.c flopen.c fparseln.c \ - humanize_number.c kld.c login.c login_auth.c login_cap.c login_class.c \ - login_crypt.c login_ok.c login_times.c login_tty.c logout.c \ - logwtmp.c pidfile.c property.c pty.c pw_util.c realhostname.c \ + hexdump.c humanize_number.c kld.c login.c login_auth.c login_cap.c \ + login_class.c login_crypt.c login_ok.c login_times.c login_tty.c \ + logout.c logwtmp.c pidfile.c property.c pty.c pw_util.c realhostname.c \ stub.c trimdomain.c uucplock.c INCS= libutil.h login_cap.h diff --git a/lib/libutil/hexdump.3 b/lib/libutil/hexdump.3 new file mode 100644 index 0000000..cc004f6 --- /dev/null +++ b/lib/libutil/hexdump.3 @@ -0,0 +1,94 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 2003 Scott Long +.\" +.\" All rights reserved. +.\" +.\" This program is free software. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd July 1, 2008 +.Os +.Dt HEXDUMP 3 +.Sh NAME +.Nm hexdump +.Nd "dump a block of bytes to standard out in hexadecimal form" +.Sh SYNOPSIS +.In libutil.h +.Ft void +.Fn hexdump "void *ptr" "int length" "const char *hdr" "int flags" +.Sh DESCRIPTION +The +.Fn hexdump +function prints an array of bytes to standard out in hexadecimal form, +along with the +.Tn ASCII +representation of the bytes, if possible. +By default, each line of +output will start with an offset count, followed by 16 hexadecimal values, +followed by 16 +.Tn ASCII +characters. +.Bl -tag -width indent +.It Fa ptr +Pointer to the array of bytes to print. +It does not need to be +.Dv NUL Ns +-terminated. +.It Fa length +Number of bytes to print. +.It Fa hdr +Pointer to a +.Dv NUL Ns +-terminated character string that will be prepended to each +line of output. +A value of +.Dv NULL +implies that no header will be printed. +.It Fa flags +Flags for controlling the formatting of the output. +.Bl -tag -width ".Dv HD_OMIT_COUNT" +.It Bits 0-7 +Integer value of the number of bytes to display on each line. +A value of 0 implies that the default value of 16 will be used. +.It Bits 8-15 +Character +.Tn ASCII +value to use as the separator for the hexadecimal output. +A value of 0 implies that the default value of 32 +.Tn ( ASCII +space) will be used. +.It Dv HD_OMIT_COUNT +Do not print the offset column at the beginning of each line. +.It Dv HD_OMIT_HEX +Do not print the hexadecimal values on each line. +.It Dv HD_OMIT_CHARS +Do not print the character values on each line. +.El +.El +.Sh SEE ALSO +.Xr ascii 7 +.Sh AUTHORS +This manual page was written by +.An Scott Long . diff --git a/lib/libutil/hexdump.c b/lib/libutil/hexdump.c new file mode 100644 index 0000000..76b93ce --- /dev/null +++ b/lib/libutil/hexdump.c @@ -0,0 +1,96 @@ +/*- + * Copyright (c) 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)subr_prf.c 8.3 (Berkeley) 1/21/94 + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/types.h> +#include <libutil.h> +#include <stdio.h> + +void +hexdump(const void *ptr, int length, const char *hdr, int flags) +{ + int i, j, k; + int cols; + const unsigned char *cp; + char delim; + + if ((flags & HD_DELIM_MASK) != 0) + delim = (flags & HD_DELIM_MASK) >> 8; + else + delim = ' '; + + if ((flags & HD_COLUMN_MASK) != 0) + cols = flags & HD_COLUMN_MASK; + else + cols = 16; + + cp = ptr; + for (i = 0; i < length; i+= cols) { + if (hdr != NULL) + printf("%s", hdr); + + if ((flags & HD_OMIT_COUNT) == 0) + printf("%04x ", i); + + if ((flags & HD_OMIT_HEX) == 0) { + for (j = 0; j < cols; j++) { + k = i + j; + if (k < length) + printf("%c%02x", delim, cp[k]); + else + printf(" "); + } + } + + if ((flags & HD_OMIT_CHARS) == 0) { + printf(" |"); + for (j = 0; j < cols; j++) { + k = i + j; + if (k >= length) + printf(" "); + else if (cp[k] >= ' ' && cp[k] <= '~') + printf("%c", cp[k]); + else + printf("."); + } + printf("|"); + } + printf("\n"); + } +} + diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h index 8fafe9b..186ee2e 100644 --- a/lib/libutil/libutil.h +++ b/lib/libutil/libutil.h @@ -71,6 +71,7 @@ void clean_environment(const char * const *_white, int extattr_namespace_to_string(int _attrnamespace, char **_string); int extattr_string_to_namespace(const char *_string, int *_attrnamespace); int flopen(const char *_path, int _flags, ...); +void hexdump(const void *ptr, int length, const char *hdr, int flags); void login(struct utmp *_ut); int login_tty(int _fd); int logout(const char *_line); @@ -171,4 +172,11 @@ __END_DECLS #define HN_GETSCALE 0x10 #define HN_AUTOSCALE 0x20 +/* hexdump(3) */ +#define HD_COLUMN_MASK 0xff +#define HD_DELIM_MASK 0xff00 +#define HD_OMIT_COUNT (1 << 16) +#define HD_OMIT_HEX (1 << 17) +#define HD_OMIT_CHARS (1 << 18) + #endif /* !_LIBUTIL_H_ */ |