1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2017 Nexenta Systems, Inc. All rights reserved.
*/
/*
* Print a packed nvlist from a file.
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "libnvpair.h"
char buf[65536];
void
dumpit(FILE *fp)
{
struct stat st;
size_t flen;
int rlen;
nvlist_t *nvl = NULL;
int err;
if (fstat(fileno(fp), &st) < 0) {
perror("fstat");
return;
}
flen = (size_t)st.st_size;
if (flen > sizeof (buf)) {
(void) printf("File too large\n");
return;
}
rlen = fread(buf, 1, flen, fp);
if (rlen <= 0) {
perror("fread");
return;
}
if (rlen != flen) {
(void) printf("Short read %d %d \n", rlen, flen);
return;
}
err = nvlist_unpack(buf, flen, &nvl, 0);
if (err != 0) {
(void) printf("nvlist_unpack, err=%d\n", err);
return;
}
nvlist_print(stdout, nvl);
nvlist_free(nvl);
}
int
main(int argc, char **argv)
{
FILE *fp;
int i;
if (argc < 2) {
(void) fprintf(stderr, "usage: %s {filename} [filename2...]\n",
argv[0]);
return (1);
}
for (i = 1; i < argc; i++) {
fp = fopen(argv[i], "r");
if (fp == NULL) {
perror(argv[i]);
return (1);
}
(void) printf("%s:\n", argv[i]);
dumpit(fp);
(void) fclose(fp);
}
return (0);
}
|