Changeset View
Changeset View
Standalone View
Standalone View
stand/libsa/hexdump.c
- This file was copied from stand/common/misc.c.
Show All 19 Lines | |||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | * 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 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD: head/stand/common/misc.c 358744 2020-03-08 17:42:42Z sjg $"); | __FBSDID("$FreeBSD: head/stand/libsa/hexdump.c 358744 2020-03-08 17:42:42Z sjg $"); | ||||
#include <string.h> | #include <string.h> | ||||
#include <stand.h> | #include <stand.h> | ||||
#include <bootstrap.h> | |||||
/* | /* | ||||
* Concatenate the (argc) elements of (argv) into a single string, and return | |||||
* a copy of same. | |||||
*/ | |||||
char * | |||||
unargv(int argc, char *argv[]) | |||||
{ | |||||
size_t hlong; | |||||
int i; | |||||
char *cp; | |||||
for (i = 0, hlong = 0; i < argc; i++) | |||||
hlong += strlen(argv[i]) + 2; | |||||
if(hlong == 0) | |||||
return(NULL); | |||||
cp = malloc(hlong); | |||||
cp[0] = 0; | |||||
for (i = 0; i < argc; i++) { | |||||
strcat(cp, argv[i]); | |||||
if (i < (argc - 1)) | |||||
strcat(cp, " "); | |||||
} | |||||
return(cp); | |||||
} | |||||
/* | |||||
* Get the length of a string in kernel space | |||||
*/ | |||||
size_t | |||||
strlenout(vm_offset_t src) | |||||
{ | |||||
char c; | |||||
size_t len; | |||||
for (len = 0; ; len++) { | |||||
archsw.arch_copyout(src++, &c, 1); | |||||
if (c == 0) | |||||
break; | |||||
} | |||||
return(len); | |||||
} | |||||
/* | |||||
* Make a duplicate copy of a string in kernel space | |||||
*/ | |||||
char * | |||||
strdupout(vm_offset_t str) | |||||
{ | |||||
char *result, *cp; | |||||
result = malloc(strlenout(str) + 1); | |||||
for (cp = result; ;cp++) { | |||||
archsw.arch_copyout(str++, cp, 1); | |||||
if (*cp == 0) | |||||
break; | |||||
} | |||||
return(result); | |||||
} | |||||
/* Zero a region in kernel space. */ | |||||
void | |||||
kern_bzero(vm_offset_t dest, size_t len) | |||||
{ | |||||
char buf[256]; | |||||
size_t chunk, resid; | |||||
bzero(buf, sizeof(buf)); | |||||
resid = len; | |||||
while (resid > 0) { | |||||
chunk = min(sizeof(buf), resid); | |||||
archsw.arch_copyin(buf, dest, chunk); | |||||
resid -= chunk; | |||||
dest += chunk; | |||||
} | |||||
} | |||||
/* | |||||
* Read the specified part of a file to kernel space. Unlike regular | |||||
* pread, the file pointer is advanced to the end of the read data, | |||||
* and it just returns 0 if successful. | |||||
*/ | |||||
int | |||||
kern_pread(readin_handle_t fd, vm_offset_t dest, size_t len, off_t off) | |||||
{ | |||||
if (VECTX_LSEEK(fd, off, SEEK_SET) == -1) { | |||||
#ifdef DEBUG | |||||
printf("\nlseek failed\n"); | |||||
#endif | |||||
return (-1); | |||||
} | |||||
if ((size_t)archsw.arch_readin(fd, dest, len) != len) { | |||||
#ifdef DEBUG | |||||
printf("\nreadin failed\n"); | |||||
#endif | |||||
return (-1); | |||||
} | |||||
return (0); | |||||
} | |||||
/* | |||||
* Read the specified part of a file to a malloced buffer. The file | |||||
* pointer is advanced to the end of the read data. | |||||
*/ | |||||
/* coverity[ -tainted_data_return ] */ | |||||
void * | |||||
alloc_pread(readin_handle_t fd, off_t off, size_t len) | |||||
{ | |||||
void *buf; | |||||
buf = malloc(len); | |||||
if (buf == NULL) { | |||||
#ifdef DEBUG | |||||
printf("\nmalloc(%d) failed\n", (int)len); | |||||
#endif | |||||
errno = ENOMEM; | |||||
return (NULL); | |||||
} | |||||
if (VECTX_LSEEK(fd, off, SEEK_SET) == -1) { | |||||
#ifdef DEBUG | |||||
printf("\nlseek failed\n"); | |||||
#endif | |||||
free(buf); | |||||
return (NULL); | |||||
} | |||||
if ((size_t)VECTX_READ(fd, buf, len) != len) { | |||||
#ifdef DEBUG | |||||
printf("\nread failed\n"); | |||||
#endif | |||||
free(buf); | |||||
return (NULL); | |||||
} | |||||
return (buf); | |||||
} | |||||
/* | |||||
* Display a region in traditional hexdump format. | * Display a region in traditional hexdump format. | ||||
*/ | */ | ||||
void | void | ||||
hexdump(caddr_t region, size_t len) | hexdump(caddr_t region, size_t len) | ||||
{ | { | ||||
caddr_t line; | caddr_t line; | ||||
int x, c; | int x, c; | ||||
#ifdef HEXDUMP_PAGER | |||||
imp: where do we define this? | |||||
Done Inline ActionsWe don't - at least not in libsa sjg: We don't - at least not in libsa
the only usage there dumps 512 bytes which does not need pager. | |||||
/* pager causes linking issues for some apps */ | |||||
#define emit(fmt, args...) {sprintf(lbuf, fmt , ## args); pager_output(lbu);} | |||||
char lbuf[80]; | char lbuf[80]; | ||||
#define emit(fmt, args...) {sprintf(lbuf, fmt , ## args); pager_output(lbuf);} | |||||
pager_open(); | pager_open(); | ||||
Done Inline ActionsThis doesn't look right. Copy/paste error? stevek: This doesn't look right. Copy/paste error? | |||||
#else | |||||
#define emit(fmt, args...) printf(fmt, ## args) | |||||
#endif | |||||
for (line = region; line < (region + len); line += 16) { | for (line = region; line < (region + len); line += 16) { | ||||
emit("%08lx ", (long) line); | emit("%08lx ", (long) line); | ||||
for (x = 0; x < 16; x++) { | for (x = 0; x < 16; x++) { | ||||
if ((line + x) < (region + len)) { | if ((line + x) < (region + len)) { | ||||
emit("%02x ", *(uint8_t *)(line + x)); | emit("%02x ", *(uint8_t *)(line + x)); | ||||
} else { | } else { | ||||
emit("-- "); | emit("-- "); | ||||
Show All 9 Lines | if ((c < ' ') || (c > '~')) /* !isprint(c) */ | ||||
c = '.'; | c = '.'; | ||||
emit("%c", c); | emit("%c", c); | ||||
} else { | } else { | ||||
emit(" "); | emit(" "); | ||||
} | } | ||||
} | } | ||||
emit("|\n"); | emit("|\n"); | ||||
} | } | ||||
#ifdef HEXDUMP_PAGER | |||||
pager_close(); | pager_close(); | ||||
} | #endif | ||||
void | |||||
dev_cleanup(void) | |||||
{ | |||||
int i; | |||||
/* Call cleanup routines */ | |||||
for (i = 0; devsw[i] != NULL; ++i) | |||||
if (devsw[i]->dv_cleanup != NULL) | |||||
(devsw[i]->dv_cleanup)(); | |||||
} | } |
where do we define this?