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