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