summaryrefslogtreecommitdiff
path: root/usr/src/cmd/smbsrv/nvlprint/nvlprint.c
blob: 939cedd933240e7032196a4c9ee679883030b33a (plain)
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);
}