Add error message for missing /etc/mtab
[zfs.git] / lib / libzfs / libzfs_util.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21
22 /*
23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright (c) 2012 by Delphix. All rights reserved.
25  */
26
27 /*
28  * Internal utility routines for the ZFS library.
29  */
30
31 #include <errno.h>
32 #include <fcntl.h>
33 #include <libintl.h>
34 #include <stdarg.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <strings.h>
38 #include <unistd.h>
39 #include <ctype.h>
40 #include <math.h>
41 #include <sys/stat.h>
42 #include <sys/mnttab.h>
43 #include <sys/mntent.h>
44 #include <sys/types.h>
45 #include <wait.h>
46
47 #include <libzfs.h>
48
49 #include "libzfs_impl.h"
50 #include "zfs_prop.h"
51 #include "zfeature_common.h"
52
53 int
54 libzfs_errno(libzfs_handle_t *hdl)
55 {
56         return (hdl->libzfs_error);
57 }
58
59 const char *
60 libzfs_error_action(libzfs_handle_t *hdl)
61 {
62         return (hdl->libzfs_action);
63 }
64
65 const char *
66 libzfs_error_description(libzfs_handle_t *hdl)
67 {
68         if (hdl->libzfs_desc[0] != '\0')
69                 return (hdl->libzfs_desc);
70
71         switch (hdl->libzfs_error) {
72         case EZFS_NOMEM:
73                 return (dgettext(TEXT_DOMAIN, "out of memory"));
74         case EZFS_BADPROP:
75                 return (dgettext(TEXT_DOMAIN, "invalid property value"));
76         case EZFS_PROPREADONLY:
77                 return (dgettext(TEXT_DOMAIN, "read-only property"));
78         case EZFS_PROPTYPE:
79                 return (dgettext(TEXT_DOMAIN, "property doesn't apply to "
80                     "datasets of this type"));
81         case EZFS_PROPNONINHERIT:
82                 return (dgettext(TEXT_DOMAIN, "property cannot be inherited"));
83         case EZFS_PROPSPACE:
84                 return (dgettext(TEXT_DOMAIN, "invalid quota or reservation"));
85         case EZFS_BADTYPE:
86                 return (dgettext(TEXT_DOMAIN, "operation not applicable to "
87                     "datasets of this type"));
88         case EZFS_BUSY:
89                 return (dgettext(TEXT_DOMAIN, "pool or dataset is busy"));
90         case EZFS_EXISTS:
91                 return (dgettext(TEXT_DOMAIN, "pool or dataset exists"));
92         case EZFS_NOENT:
93                 return (dgettext(TEXT_DOMAIN, "no such pool or dataset"));
94         case EZFS_BADSTREAM:
95                 return (dgettext(TEXT_DOMAIN, "invalid backup stream"));
96         case EZFS_DSREADONLY:
97                 return (dgettext(TEXT_DOMAIN, "dataset is read-only"));
98         case EZFS_VOLTOOBIG:
99                 return (dgettext(TEXT_DOMAIN, "volume size exceeds limit for "
100                     "this system"));
101         case EZFS_INVALIDNAME:
102                 return (dgettext(TEXT_DOMAIN, "invalid name"));
103         case EZFS_BADRESTORE:
104                 return (dgettext(TEXT_DOMAIN, "unable to restore to "
105                     "destination"));
106         case EZFS_BADBACKUP:
107                 return (dgettext(TEXT_DOMAIN, "backup failed"));
108         case EZFS_BADTARGET:
109                 return (dgettext(TEXT_DOMAIN, "invalid target vdev"));
110         case EZFS_NODEVICE:
111                 return (dgettext(TEXT_DOMAIN, "no such device in pool"));
112         case EZFS_BADDEV:
113                 return (dgettext(TEXT_DOMAIN, "invalid device"));
114         case EZFS_NOREPLICAS:
115                 return (dgettext(TEXT_DOMAIN, "no valid replicas"));
116         case EZFS_RESILVERING:
117                 return (dgettext(TEXT_DOMAIN, "currently resilvering"));
118         case EZFS_BADVERSION:
119                 return (dgettext(TEXT_DOMAIN, "unsupported version or "
120                     "feature"));
121         case EZFS_POOLUNAVAIL:
122                 return (dgettext(TEXT_DOMAIN, "pool is unavailable"));
123         case EZFS_DEVOVERFLOW:
124                 return (dgettext(TEXT_DOMAIN, "too many devices in one vdev"));
125         case EZFS_BADPATH:
126                 return (dgettext(TEXT_DOMAIN, "must be an absolute path"));
127         case EZFS_CROSSTARGET:
128                 return (dgettext(TEXT_DOMAIN, "operation crosses datasets or "
129                     "pools"));
130         case EZFS_ZONED:
131                 return (dgettext(TEXT_DOMAIN, "dataset in use by local zone"));
132         case EZFS_MOUNTFAILED:
133                 return (dgettext(TEXT_DOMAIN, "mount failed"));
134         case EZFS_UMOUNTFAILED:
135                 return (dgettext(TEXT_DOMAIN, "umount failed"));
136         case EZFS_UNSHARENFSFAILED:
137                 return (dgettext(TEXT_DOMAIN, "unshare(1M) failed"));
138         case EZFS_SHARENFSFAILED:
139                 return (dgettext(TEXT_DOMAIN, "share(1M) failed"));
140         case EZFS_UNSHARESMBFAILED:
141                 return (dgettext(TEXT_DOMAIN, "smb remove share failed"));
142         case EZFS_SHARESMBFAILED:
143                 return (dgettext(TEXT_DOMAIN, "smb add share failed"));
144         case EZFS_PERM:
145                 return (dgettext(TEXT_DOMAIN, "permission denied"));
146         case EZFS_NOSPC:
147                 return (dgettext(TEXT_DOMAIN, "out of space"));
148         case EZFS_FAULT:
149                 return (dgettext(TEXT_DOMAIN, "bad address"));
150         case EZFS_IO:
151                 return (dgettext(TEXT_DOMAIN, "I/O error"));
152         case EZFS_INTR:
153                 return (dgettext(TEXT_DOMAIN, "signal received"));
154         case EZFS_ISSPARE:
155                 return (dgettext(TEXT_DOMAIN, "device is reserved as a hot "
156                     "spare"));
157         case EZFS_INVALCONFIG:
158                 return (dgettext(TEXT_DOMAIN, "invalid vdev configuration"));
159         case EZFS_RECURSIVE:
160                 return (dgettext(TEXT_DOMAIN, "recursive dataset dependency"));
161         case EZFS_NOHISTORY:
162                 return (dgettext(TEXT_DOMAIN, "no history available"));
163         case EZFS_POOLPROPS:
164                 return (dgettext(TEXT_DOMAIN, "failed to retrieve "
165                     "pool properties"));
166         case EZFS_POOL_NOTSUP:
167                 return (dgettext(TEXT_DOMAIN, "operation not supported "
168                     "on this type of pool"));
169         case EZFS_POOL_INVALARG:
170                 return (dgettext(TEXT_DOMAIN, "invalid argument for "
171                     "this pool operation"));
172         case EZFS_NAMETOOLONG:
173                 return (dgettext(TEXT_DOMAIN, "dataset name is too long"));
174         case EZFS_OPENFAILED:
175                 return (dgettext(TEXT_DOMAIN, "open failed"));
176         case EZFS_NOCAP:
177                 return (dgettext(TEXT_DOMAIN,
178                     "disk capacity information could not be retrieved"));
179         case EZFS_LABELFAILED:
180                 return (dgettext(TEXT_DOMAIN, "write of label failed"));
181         case EZFS_BADWHO:
182                 return (dgettext(TEXT_DOMAIN, "invalid user/group"));
183         case EZFS_BADPERM:
184                 return (dgettext(TEXT_DOMAIN, "invalid permission"));
185         case EZFS_BADPERMSET:
186                 return (dgettext(TEXT_DOMAIN, "invalid permission set name"));
187         case EZFS_NODELEGATION:
188                 return (dgettext(TEXT_DOMAIN, "delegated administration is "
189                     "disabled on pool"));
190         case EZFS_BADCACHE:
191                 return (dgettext(TEXT_DOMAIN, "invalid or missing cache file"));
192         case EZFS_ISL2CACHE:
193                 return (dgettext(TEXT_DOMAIN, "device is in use as a cache"));
194         case EZFS_VDEVNOTSUP:
195                 return (dgettext(TEXT_DOMAIN, "vdev specification is not "
196                     "supported"));
197         case EZFS_NOTSUP:
198                 return (dgettext(TEXT_DOMAIN, "operation not supported "
199                     "on this dataset"));
200         case EZFS_ACTIVE_SPARE:
201                 return (dgettext(TEXT_DOMAIN, "pool has active shared spare "
202                     "device"));
203         case EZFS_UNPLAYED_LOGS:
204                 return (dgettext(TEXT_DOMAIN, "log device has unplayed intent "
205                     "logs"));
206         case EZFS_REFTAG_RELE:
207                 return (dgettext(TEXT_DOMAIN, "no such tag on this dataset"));
208         case EZFS_REFTAG_HOLD:
209                 return (dgettext(TEXT_DOMAIN, "tag already exists on this "
210                     "dataset"));
211         case EZFS_TAGTOOLONG:
212                 return (dgettext(TEXT_DOMAIN, "tag too long"));
213         case EZFS_PIPEFAILED:
214                 return (dgettext(TEXT_DOMAIN, "pipe create failed"));
215         case EZFS_THREADCREATEFAILED:
216                 return (dgettext(TEXT_DOMAIN, "thread create failed"));
217         case EZFS_POSTSPLIT_ONLINE:
218                 return (dgettext(TEXT_DOMAIN, "disk was split from this pool "
219                     "into a new one"));
220         case EZFS_SCRUBBING:
221                 return (dgettext(TEXT_DOMAIN, "currently scrubbing; "
222                     "use 'zpool scrub -s' to cancel current scrub"));
223         case EZFS_NO_SCRUB:
224                 return (dgettext(TEXT_DOMAIN, "there is no active scrub"));
225         case EZFS_DIFF:
226                 return (dgettext(TEXT_DOMAIN, "unable to generate diffs"));
227         case EZFS_DIFFDATA:
228                 return (dgettext(TEXT_DOMAIN, "invalid diff data"));
229         case EZFS_POOLREADONLY:
230                 return (dgettext(TEXT_DOMAIN, "pool is read-only"));
231         case EZFS_UNKNOWN:
232                 return (dgettext(TEXT_DOMAIN, "unknown error"));
233         default:
234                 assert(hdl->libzfs_error == 0);
235                 return (dgettext(TEXT_DOMAIN, "no error"));
236         }
237 }
238
239 /*PRINTFLIKE2*/
240 void
241 zfs_error_aux(libzfs_handle_t *hdl, const char *fmt, ...)
242 {
243         va_list ap;
244
245         va_start(ap, fmt);
246
247         (void) vsnprintf(hdl->libzfs_desc, sizeof (hdl->libzfs_desc),
248             fmt, ap);
249         hdl->libzfs_desc_active = 1;
250
251         va_end(ap);
252 }
253
254 static void
255 zfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
256 {
257         (void) vsnprintf(hdl->libzfs_action, sizeof (hdl->libzfs_action),
258             fmt, ap);
259         hdl->libzfs_error = error;
260
261         if (hdl->libzfs_desc_active)
262                 hdl->libzfs_desc_active = 0;
263         else
264                 hdl->libzfs_desc[0] = '\0';
265
266         if (hdl->libzfs_printerr) {
267                 if (error == EZFS_UNKNOWN) {
268                         (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "internal "
269                             "error: %s\n"), libzfs_error_description(hdl));
270                         abort();
271                 }
272
273                 (void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
274                     libzfs_error_description(hdl));
275                 if (error == EZFS_NOMEM)
276                         exit(1);
277         }
278 }
279
280 int
281 zfs_error(libzfs_handle_t *hdl, int error, const char *msg)
282 {
283         return (zfs_error_fmt(hdl, error, "%s", msg));
284 }
285
286 /*PRINTFLIKE3*/
287 int
288 zfs_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
289 {
290         va_list ap;
291
292         va_start(ap, fmt);
293
294         zfs_verror(hdl, error, fmt, ap);
295
296         va_end(ap);
297
298         return (-1);
299 }
300
301 static int
302 zfs_common_error(libzfs_handle_t *hdl, int error, const char *fmt,
303     va_list ap)
304 {
305         switch (error) {
306         case EPERM:
307         case EACCES:
308                 zfs_verror(hdl, EZFS_PERM, fmt, ap);
309                 return (-1);
310
311         case ECANCELED:
312                 zfs_verror(hdl, EZFS_NODELEGATION, fmt, ap);
313                 return (-1);
314
315         case EIO:
316                 zfs_verror(hdl, EZFS_IO, fmt, ap);
317                 return (-1);
318
319         case EFAULT:
320                 zfs_verror(hdl, EZFS_FAULT, fmt, ap);
321                 return (-1);
322
323         case EINTR:
324                 zfs_verror(hdl, EZFS_INTR, fmt, ap);
325                 return (-1);
326         }
327
328         return (0);
329 }
330
331 int
332 zfs_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
333 {
334         return (zfs_standard_error_fmt(hdl, error, "%s", msg));
335 }
336
337 /*PRINTFLIKE3*/
338 int
339 zfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
340 {
341         va_list ap;
342
343         va_start(ap, fmt);
344
345         if (zfs_common_error(hdl, error, fmt, ap) != 0) {
346                 va_end(ap);
347                 return (-1);
348         }
349
350         switch (error) {
351         case ENXIO:
352         case ENODEV:
353         case EPIPE:
354                 zfs_verror(hdl, EZFS_IO, fmt, ap);
355                 break;
356
357         case ENOENT:
358                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
359                     "dataset does not exist"));
360                 zfs_verror(hdl, EZFS_NOENT, fmt, ap);
361                 break;
362
363         case ENOSPC:
364         case EDQUOT:
365                 zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
366                 return (-1);
367
368         case EEXIST:
369                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
370                     "dataset already exists"));
371                 zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
372                 break;
373
374         case EBUSY:
375                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
376                     "dataset is busy"));
377                 zfs_verror(hdl, EZFS_BUSY, fmt, ap);
378                 break;
379         case EROFS:
380                 zfs_verror(hdl, EZFS_POOLREADONLY, fmt, ap);
381                 break;
382         case ENAMETOOLONG:
383                 zfs_verror(hdl, EZFS_NAMETOOLONG, fmt, ap);
384                 break;
385         case ENOTSUP:
386                 zfs_verror(hdl, EZFS_BADVERSION, fmt, ap);
387                 break;
388         case EAGAIN:
389                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
390                     "pool I/O is currently suspended"));
391                 zfs_verror(hdl, EZFS_POOLUNAVAIL, fmt, ap);
392                 break;
393         default:
394                 zfs_error_aux(hdl, strerror(error));
395                 zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
396                 break;
397         }
398
399         va_end(ap);
400         return (-1);
401 }
402
403 int
404 zpool_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
405 {
406         return (zpool_standard_error_fmt(hdl, error, "%s", msg));
407 }
408
409 /*PRINTFLIKE3*/
410 int
411 zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
412 {
413         va_list ap;
414
415         va_start(ap, fmt);
416
417         if (zfs_common_error(hdl, error, fmt, ap) != 0) {
418                 va_end(ap);
419                 return (-1);
420         }
421
422         switch (error) {
423         case ENODEV:
424                 zfs_verror(hdl, EZFS_NODEVICE, fmt, ap);
425                 break;
426
427         case ENOENT:
428                 zfs_error_aux(hdl,
429                     dgettext(TEXT_DOMAIN, "no such pool or dataset"));
430                 zfs_verror(hdl, EZFS_NOENT, fmt, ap);
431                 break;
432
433         case EEXIST:
434                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
435                     "pool already exists"));
436                 zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
437                 break;
438
439         case EBUSY:
440                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool is busy"));
441                 zfs_verror(hdl, EZFS_BUSY, fmt, ap);
442                 break;
443
444         case ENXIO:
445                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
446                     "one or more devices is currently unavailable"));
447                 zfs_verror(hdl, EZFS_BADDEV, fmt, ap);
448                 break;
449
450         case ENAMETOOLONG:
451                 zfs_verror(hdl, EZFS_DEVOVERFLOW, fmt, ap);
452                 break;
453
454         case ENOTSUP:
455                 zfs_verror(hdl, EZFS_POOL_NOTSUP, fmt, ap);
456                 break;
457
458         case EINVAL:
459                 zfs_verror(hdl, EZFS_POOL_INVALARG, fmt, ap);
460                 break;
461
462         case ENOSPC:
463         case EDQUOT:
464                 zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
465                 return (-1);
466
467         case EAGAIN:
468                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
469                     "pool I/O is currently suspended"));
470                 zfs_verror(hdl, EZFS_POOLUNAVAIL, fmt, ap);
471                 break;
472
473         case EROFS:
474                 zfs_verror(hdl, EZFS_POOLREADONLY, fmt, ap);
475                 break;
476
477         default:
478                 zfs_error_aux(hdl, strerror(error));
479                 zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
480         }
481
482         va_end(ap);
483         return (-1);
484 }
485
486 /*
487  * Display an out of memory error message and abort the current program.
488  */
489 int
490 no_memory(libzfs_handle_t *hdl)
491 {
492         return (zfs_error(hdl, EZFS_NOMEM, "internal error"));
493 }
494
495 /*
496  * A safe form of malloc() which will die if the allocation fails.
497  */
498 void *
499 zfs_alloc(libzfs_handle_t *hdl, size_t size)
500 {
501         void *data;
502
503         if ((data = calloc(1, size)) == NULL)
504                 (void) no_memory(hdl);
505
506         return (data);
507 }
508
509 /*
510  * A safe form of asprintf() which will die if the allocation fails.
511  */
512 /*PRINTFLIKE2*/
513 char *
514 zfs_asprintf(libzfs_handle_t *hdl, const char *fmt, ...)
515 {
516         va_list ap;
517         char *ret;
518         int err;
519
520         va_start(ap, fmt);
521
522         err = vasprintf(&ret, fmt, ap);
523
524         va_end(ap);
525
526         if (err < 0)
527                 (void) no_memory(hdl);
528
529         return (ret);
530 }
531
532 /*
533  * A safe form of realloc(), which also zeroes newly allocated space.
534  */
535 void *
536 zfs_realloc(libzfs_handle_t *hdl, void *ptr, size_t oldsize, size_t newsize)
537 {
538         void *ret;
539
540         if ((ret = realloc(ptr, newsize)) == NULL) {
541                 (void) no_memory(hdl);
542                 return (NULL);
543         }
544
545         bzero((char *)ret + oldsize, (newsize - oldsize));
546         return (ret);
547 }
548
549 /*
550  * A safe form of strdup() which will die if the allocation fails.
551  */
552 char *
553 zfs_strdup(libzfs_handle_t *hdl, const char *str)
554 {
555         char *ret;
556
557         if ((ret = strdup(str)) == NULL)
558                 (void) no_memory(hdl);
559
560         return (ret);
561 }
562
563 /*
564  * Convert a number to an appropriately human-readable output.
565  */
566 void
567 zfs_nicenum(uint64_t num, char *buf, size_t buflen)
568 {
569         uint64_t n = num;
570         int index = 0;
571         char u;
572
573         while (n >= 1024) {
574                 n /= 1024;
575                 index++;
576         }
577
578         u = " KMGTPE"[index];
579
580         if (index == 0) {
581                 (void) snprintf(buf, buflen, "%llu", (u_longlong_t) n);
582         } else if ((num & ((1ULL << 10 * index) - 1)) == 0) {
583                 /*
584                  * If this is an even multiple of the base, always display
585                  * without any decimal precision.
586                  */
587                 (void) snprintf(buf, buflen, "%llu%c", (u_longlong_t) n, u);
588         } else {
589                 /*
590                  * We want to choose a precision that reflects the best choice
591                  * for fitting in 5 characters.  This can get rather tricky when
592                  * we have numbers that are very close to an order of magnitude.
593                  * For example, when displaying 10239 (which is really 9.999K),
594                  * we want only a single place of precision for 10.0K.  We could
595                  * develop some complex heuristics for this, but it's much
596                  * easier just to try each combination in turn.
597                  */
598                 int i;
599                 for (i = 2; i >= 0; i--) {
600                         if (snprintf(buf, buflen, "%.*f%c", i,
601                             (double)num / (1ULL << 10 * index), u) <= 5)
602                                 break;
603                 }
604         }
605 }
606
607 void
608 libzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr)
609 {
610         hdl->libzfs_printerr = printerr;
611 }
612
613 static int
614 libzfs_module_loaded(const char *module)
615 {
616         const char path_prefix[] = "/sys/module/";
617         char path[256];
618
619         memcpy(path, path_prefix, sizeof(path_prefix) - 1);
620         strcpy(path + sizeof(path_prefix) - 1, module);
621
622         return (access(path, F_OK) == 0);
623 }
624
625 int
626 libzfs_run_process(const char *path, char *argv[], int flags)
627 {
628         pid_t pid;
629         int rc, devnull_fd;
630
631         pid = vfork();
632         if (pid == 0) {
633                 devnull_fd = open("/dev/null", O_WRONLY);
634
635                 if (devnull_fd < 0)
636                         _exit(-1);
637
638                 if (!(flags & STDOUT_VERBOSE))
639                         (void) dup2(devnull_fd, STDOUT_FILENO);
640
641                 if (!(flags & STDERR_VERBOSE))
642                         (void) dup2(devnull_fd, STDERR_FILENO);
643
644                 close(devnull_fd);
645
646                 (void) execvp(path, argv);
647                 _exit(-1);
648         } else if (pid > 0) {
649                 int status;
650
651                 while ((rc = waitpid(pid, &status, 0)) == -1 &&
652                         errno == EINTR);
653                 if (rc < 0 || !WIFEXITED(status))
654                         return -1;
655
656                 return WEXITSTATUS(status);
657         }
658
659         return -1;
660 }
661
662 int
663 libzfs_load_module(const char *module)
664 {
665         char *argv[4] = {"/sbin/modprobe", "-q", (char *)module, (char *)0};
666
667         if (libzfs_module_loaded(module))
668                 return 0;
669
670         return libzfs_run_process("/sbin/modprobe", argv, 0);
671 }
672
673 libzfs_handle_t *
674 libzfs_init(void)
675 {
676         libzfs_handle_t *hdl;
677
678         if (libzfs_load_module("zfs") != 0) {
679                 (void) fprintf(stderr, gettext("Failed to load ZFS module "
680                                "stack.\nLoad the module manually by running "
681                                "'insmod <location>/zfs.ko' as root.\n"));
682                 return (NULL);
683         }
684
685         if ((hdl = calloc(1, sizeof (libzfs_handle_t))) == NULL) {
686                 return (NULL);
687         }
688
689         if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
690                 (void) fprintf(stderr, gettext("Unable to open %s: %s.\n"),
691                                ZFS_DEV, strerror(errno));
692                 if (errno == ENOENT)
693                         (void) fprintf(stderr,
694                              gettext("Verify the ZFS module stack is "
695                              "loaded by running '/sbin/modprobe zfs'.\n"));
696
697                 free(hdl);
698                 return (NULL);
699         }
700
701 #ifdef HAVE_SETMNTENT
702         if ((hdl->libzfs_mnttab = setmntent(MNTTAB, "r")) == NULL) {
703 #else
704         if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
705 #endif
706                 (void) close(hdl->libzfs_fd);
707                 (void) fprintf(stderr,
708                     gettext("mtab is not present at %s.\n"), MNTTAB);
709                 free(hdl);
710                 return (NULL);
711         }
712
713         hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r");
714
715         zfs_prop_init();
716         zpool_prop_init();
717         zpool_feature_init();
718         libzfs_mnttab_init(hdl);
719
720         return (hdl);
721 }
722
723 void
724 libzfs_fini(libzfs_handle_t *hdl)
725 {
726         (void) close(hdl->libzfs_fd);
727         if (hdl->libzfs_mnttab)
728 #ifdef HAVE_SETMNTENT
729                 (void) endmntent(hdl->libzfs_mnttab);
730 #else
731                 (void) fclose(hdl->libzfs_mnttab);
732 #endif
733         if (hdl->libzfs_sharetab)
734                 (void) fclose(hdl->libzfs_sharetab);
735         zfs_uninit_libshare(hdl);
736         if (hdl->libzfs_log_str)
737                 (void) free(hdl->libzfs_log_str);
738         zpool_free_handles(hdl);
739         libzfs_fru_clear(hdl, B_TRUE);
740         namespace_clear(hdl);
741         libzfs_mnttab_fini(hdl);
742         free(hdl);
743 }
744
745 libzfs_handle_t *
746 zpool_get_handle(zpool_handle_t *zhp)
747 {
748         return (zhp->zpool_hdl);
749 }
750
751 libzfs_handle_t *
752 zfs_get_handle(zfs_handle_t *zhp)
753 {
754         return (zhp->zfs_hdl);
755 }
756
757 zpool_handle_t *
758 zfs_get_pool_handle(const zfs_handle_t *zhp)
759 {
760         return (zhp->zpool_hdl);
761 }
762
763 /*
764  * Given a name, determine whether or not it's a valid path
765  * (starts with '/' or "./").  If so, walk the mnttab trying
766  * to match the device number.  If not, treat the path as an
767  * fs/vol/snap name.
768  */
769 zfs_handle_t *
770 zfs_path_to_zhandle(libzfs_handle_t *hdl, char *path, zfs_type_t argtype)
771 {
772         struct stat64 statbuf;
773         struct extmnttab entry;
774         int ret;
775
776         if (path[0] != '/' && strncmp(path, "./", strlen("./")) != 0) {
777                 /*
778                  * It's not a valid path, assume it's a name of type 'argtype'.
779                  */
780                 return (zfs_open(hdl, path, argtype));
781         }
782
783         if (stat64(path, &statbuf) != 0) {
784                 (void) fprintf(stderr, "%s: %s\n", path, strerror(errno));
785                 return (NULL);
786         }
787
788         rewind(hdl->libzfs_mnttab);
789         while ((ret = getextmntent(hdl->libzfs_mnttab, &entry, 0)) == 0) {
790                 if (makedevice(entry.mnt_major, entry.mnt_minor) ==
791                     statbuf.st_dev) {
792                         break;
793                 }
794         }
795         if (ret != 0) {
796                 return (NULL);
797         }
798
799         if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {
800                 (void) fprintf(stderr, gettext("'%s': not a ZFS filesystem\n"),
801                     path);
802                 return (NULL);
803         }
804
805         return (zfs_open(hdl, entry.mnt_special, ZFS_TYPE_FILESYSTEM));
806 }
807
808 /*
809  * Append partition suffix to an otherwise fully qualified device path.
810  * This is used to generate the name the full path as its stored in
811  * ZPOOL_CONFIG_PATH for whole disk devices.  On success the new length
812  * of 'path' will be returned on error a negative value is returned.
813  */
814 int
815 zfs_append_partition(char *path, size_t max_len)
816 {
817         int len = strlen(path);
818
819         if (strncmp(path, UDISK_ROOT, strlen(UDISK_ROOT)) == 0) {
820                 if (len + 6 >= max_len)
821                         return (-1);
822
823                 (void) strcat(path, "-part1");
824                 len += 6;
825         } else {
826                 if (len + 2 >= max_len)
827                         return (-1);
828
829                 if (isdigit(path[len-1])) {
830                         (void) strcat(path, "p1");
831                         len += 2;
832                 } else {
833                         (void) strcat(path, "1");
834                         len += 1;
835                 }
836         }
837
838         return (len);
839 }
840
841 /*
842  * Given a shorthand device name check if a file by that name exists in any
843  * of the 'zpool_default_import_path' or ZPOOL_IMPORT_PATH directories.  If
844  * one is found, store its fully qualified path in the 'path' buffer passed
845  * by the caller and return 0, otherwise return an error.
846  */
847 int
848 zfs_resolve_shortname(const char *name, char *path, size_t len)
849 {
850         int i, error = -1;
851         char *dir, *env, *envdup;
852
853         env = getenv("ZPOOL_IMPORT_PATH");
854         errno = ENOENT;
855
856         if (env) {
857                 envdup = strdup(env);
858                 dir = strtok(envdup, ":");
859                 while (dir && error) {
860                         (void) snprintf(path, len, "%s/%s", dir, name);
861                         error = access(path, F_OK);
862                         dir = strtok(NULL, ":");
863                 }
864                 free(envdup);
865         } else {
866                 for (i = 0; i < DEFAULT_IMPORT_PATH_SIZE && error < 0; i++) {
867                         (void) snprintf(path, len, "%s/%s",
868                             zpool_default_import_path[i], name);
869                         error = access(path, F_OK);
870                 }
871         }
872
873         return (error ? ENOENT : 0);
874 }
875
876 /*
877  * Given a shorthand device name look for a match against 'cmp_name'.  This
878  * is done by checking all prefix expansions using either the default
879  * 'zpool_default_import_paths' or the ZPOOL_IMPORT_PATH environment
880  * variable.  Proper partition suffixes will be appended if this is a
881  * whole disk.  When a match is found 0 is returned otherwise ENOENT.
882  */
883 static int
884 zfs_strcmp_shortname(char *name, char *cmp_name, int wholedisk)
885 {
886         int path_len, cmp_len, i = 0, error = ENOENT;
887         char *dir, *env, *envdup = NULL;
888         char path_name[MAXPATHLEN];
889
890         cmp_len = strlen(cmp_name);
891         env = getenv("ZPOOL_IMPORT_PATH");
892
893         if (env) {
894                 envdup = strdup(env);
895                 dir = strtok(envdup, ":");
896         } else {
897                 dir =  zpool_default_import_path[i];
898         }
899
900         while (dir) {
901                 /* Trim trailing directory slashes from ZPOOL_IMPORT_PATH */
902                 while (dir[strlen(dir)-1] == '/')
903                         dir[strlen(dir)-1] = '\0';
904
905                 path_len = snprintf(path_name, MAXPATHLEN, "%s/%s", dir, name);
906                 if (wholedisk)
907                         path_len = zfs_append_partition(path_name, MAXPATHLEN);
908
909                 if ((path_len == cmp_len) && !strcmp(path_name, cmp_name)) {
910                         error = 0;
911                         break;
912                 }
913
914                 if (env) {
915                         dir = strtok(NULL, ":");
916                 } else if (++i < DEFAULT_IMPORT_PATH_SIZE) {
917                         dir = zpool_default_import_path[i];
918                 } else {
919                         dir = NULL;
920                 }
921         }
922
923         if (env)
924                 free(envdup);
925
926         return (error);
927 }
928
929 /*
930  * Given either a shorthand or fully qualified path name look for a match
931  * against 'cmp'.  The passed name will be expanded as needed for comparison
932  * purposes and redundant slashes stripped to ensure an accurate match.
933  */
934 int
935 zfs_strcmp_pathname(char *name, char *cmp, int wholedisk)
936 {
937         int path_len, cmp_len;
938         char path_name[MAXPATHLEN];
939         char cmp_name[MAXPATHLEN];
940         char *dir;
941
942         /* Strip redundant slashes if one exists due to ZPOOL_IMPORT_PATH */
943         memset(cmp_name, 0, MAXPATHLEN);
944         dir = strtok(cmp, "/");
945         while (dir) {
946                 strcat(cmp_name, "/");
947                 strcat(cmp_name, dir);
948                 dir = strtok(NULL, "/");
949         }
950
951         if (name[0] != '/')
952                 return zfs_strcmp_shortname(name, cmp_name, wholedisk);
953
954         strncpy(path_name, name, MAXPATHLEN);
955         path_len = strlen(path_name);
956         cmp_len = strlen(cmp_name);
957
958         if (wholedisk) {
959                 path_len = zfs_append_partition(path_name, MAXPATHLEN);
960                 if (path_len == -1)
961                         return (ENOMEM);
962         }
963
964         if ((path_len != cmp_len) || strcmp(path_name, cmp_name))
965                 return (ENOENT);
966
967         return (0);
968 }
969
970 /*
971  * Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from
972  * an ioctl().
973  */
974 int
975 zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len)
976 {
977         if (len == 0)
978                 len = 16 * 1024;
979         zc->zc_nvlist_dst_size = len;
980         if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
981             zfs_alloc(hdl, zc->zc_nvlist_dst_size)) == 0)
982                 return (-1);
983
984         return (0);
985 }
986
987 /*
988  * Called when an ioctl() which returns an nvlist fails with ENOMEM.  This will
989  * expand the nvlist to the size specified in 'zc_nvlist_dst_size', which was
990  * filled in by the kernel to indicate the actual required size.
991  */
992 int
993 zcmd_expand_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc)
994 {
995         free((void *)(uintptr_t)zc->zc_nvlist_dst);
996         if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
997             zfs_alloc(hdl, zc->zc_nvlist_dst_size)) == 0)
998                 return (-1);
999
1000         return (0);
1001 }
1002
1003 /*
1004  * Called to free the src and dst nvlists stored in the command structure.
1005  */
1006 void
1007 zcmd_free_nvlists(zfs_cmd_t *zc)
1008 {
1009         free((void *)(uintptr_t)zc->zc_nvlist_conf);
1010         free((void *)(uintptr_t)zc->zc_nvlist_src);
1011         free((void *)(uintptr_t)zc->zc_nvlist_dst);
1012 }
1013
1014 static int
1015 zcmd_write_nvlist_com(libzfs_handle_t *hdl, uint64_t *outnv, uint64_t *outlen,
1016     nvlist_t *nvl)
1017 {
1018         char *packed;
1019         size_t len;
1020
1021         verify(nvlist_size(nvl, &len, NV_ENCODE_NATIVE) == 0);
1022
1023         if ((packed = zfs_alloc(hdl, len)) == NULL)
1024                 return (-1);
1025
1026         verify(nvlist_pack(nvl, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
1027
1028         *outnv = (uint64_t)(uintptr_t)packed;
1029         *outlen = len;
1030
1031         return (0);
1032 }
1033
1034 int
1035 zcmd_write_conf_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl)
1036 {
1037         return (zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_conf,
1038             &zc->zc_nvlist_conf_size, nvl));
1039 }
1040
1041 int
1042 zcmd_write_src_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl)
1043 {
1044         return (zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_src,
1045             &zc->zc_nvlist_src_size, nvl));
1046 }
1047
1048 /*
1049  * Unpacks an nvlist from the ZFS ioctl command structure.
1050  */
1051 int
1052 zcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp)
1053 {
1054         if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
1055             zc->zc_nvlist_dst_size, nvlp, 0) != 0)
1056                 return (no_memory(hdl));
1057
1058         return (0);
1059 }
1060
1061 int
1062 zfs_ioctl(libzfs_handle_t *hdl, int request, zfs_cmd_t *zc)
1063 {
1064         int error;
1065
1066         zc->zc_history = (uint64_t)(uintptr_t)hdl->libzfs_log_str;
1067         error = ioctl(hdl->libzfs_fd, request, zc);
1068         if (hdl->libzfs_log_str) {
1069                 free(hdl->libzfs_log_str);
1070                 hdl->libzfs_log_str = NULL;
1071         }
1072         zc->zc_history = 0;
1073
1074         return (error);
1075 }
1076
1077 /*
1078  * ================================================================
1079  * API shared by zfs and zpool property management
1080  * ================================================================
1081  */
1082
1083 static void
1084 zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type)
1085 {
1086         zprop_list_t *pl = cbp->cb_proplist;
1087         int i;
1088         char *title;
1089         size_t len;
1090
1091         cbp->cb_first = B_FALSE;
1092         if (cbp->cb_scripted)
1093                 return;
1094
1095         /*
1096          * Start with the length of the column headers.
1097          */
1098         cbp->cb_colwidths[GET_COL_NAME] = strlen(dgettext(TEXT_DOMAIN, "NAME"));
1099         cbp->cb_colwidths[GET_COL_PROPERTY] = strlen(dgettext(TEXT_DOMAIN,
1100             "PROPERTY"));
1101         cbp->cb_colwidths[GET_COL_VALUE] = strlen(dgettext(TEXT_DOMAIN,
1102             "VALUE"));
1103         cbp->cb_colwidths[GET_COL_RECVD] = strlen(dgettext(TEXT_DOMAIN,
1104             "RECEIVED"));
1105         cbp->cb_colwidths[GET_COL_SOURCE] = strlen(dgettext(TEXT_DOMAIN,
1106             "SOURCE"));
1107
1108         /* first property is always NAME */
1109         assert(cbp->cb_proplist->pl_prop ==
1110             ((type == ZFS_TYPE_POOL) ?  ZPOOL_PROP_NAME : ZFS_PROP_NAME));
1111
1112         /*
1113          * Go through and calculate the widths for each column.  For the
1114          * 'source' column, we kludge it up by taking the worst-case scenario of
1115          * inheriting from the longest name.  This is acceptable because in the
1116          * majority of cases 'SOURCE' is the last column displayed, and we don't
1117          * use the width anyway.  Note that the 'VALUE' column can be oversized,
1118          * if the name of the property is much longer than any values we find.
1119          */
1120         for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
1121                 /*
1122                  * 'PROPERTY' column
1123                  */
1124                 if (pl->pl_prop != ZPROP_INVAL) {
1125                         const char *propname = (type == ZFS_TYPE_POOL) ?
1126                             zpool_prop_to_name(pl->pl_prop) :
1127                             zfs_prop_to_name(pl->pl_prop);
1128
1129                         len = strlen(propname);
1130                         if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
1131                                 cbp->cb_colwidths[GET_COL_PROPERTY] = len;
1132                 } else {
1133                         len = strlen(pl->pl_user_prop);
1134                         if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
1135                                 cbp->cb_colwidths[GET_COL_PROPERTY] = len;
1136                 }
1137
1138                 /*
1139                  * 'VALUE' column.  The first property is always the 'name'
1140                  * property that was tacked on either by /sbin/zfs's
1141                  * zfs_do_get() or when calling zprop_expand_list(), so we
1142                  * ignore its width.  If the user specified the name property
1143                  * to display, then it will be later in the list in any case.
1144                  */
1145                 if (pl != cbp->cb_proplist &&
1146                     pl->pl_width > cbp->cb_colwidths[GET_COL_VALUE])
1147                         cbp->cb_colwidths[GET_COL_VALUE] = pl->pl_width;
1148
1149                 /* 'RECEIVED' column. */
1150                 if (pl != cbp->cb_proplist &&
1151                     pl->pl_recvd_width > cbp->cb_colwidths[GET_COL_RECVD])
1152                         cbp->cb_colwidths[GET_COL_RECVD] = pl->pl_recvd_width;
1153
1154                 /*
1155                  * 'NAME' and 'SOURCE' columns
1156                  */
1157                 if (pl->pl_prop == (type == ZFS_TYPE_POOL ? ZPOOL_PROP_NAME :
1158                     ZFS_PROP_NAME) &&
1159                     pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) {
1160                         cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
1161                         cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
1162                             strlen(dgettext(TEXT_DOMAIN, "inherited from"));
1163                 }
1164         }
1165
1166         /*
1167          * Now go through and print the headers.
1168          */
1169         for (i = 0; i < ZFS_GET_NCOLS; i++) {
1170                 switch (cbp->cb_columns[i]) {
1171                 case GET_COL_NAME:
1172                         title = dgettext(TEXT_DOMAIN, "NAME");
1173                         break;
1174                 case GET_COL_PROPERTY:
1175                         title = dgettext(TEXT_DOMAIN, "PROPERTY");
1176                         break;
1177                 case GET_COL_VALUE:
1178                         title = dgettext(TEXT_DOMAIN, "VALUE");
1179                         break;
1180                 case GET_COL_RECVD:
1181                         title = dgettext(TEXT_DOMAIN, "RECEIVED");
1182                         break;
1183                 case GET_COL_SOURCE:
1184                         title = dgettext(TEXT_DOMAIN, "SOURCE");
1185                         break;
1186                 default:
1187                         title = NULL;
1188                 }
1189
1190                 if (title != NULL) {
1191                         if (i == (ZFS_GET_NCOLS - 1) ||
1192                             cbp->cb_columns[i + 1] == GET_COL_NONE)
1193                                 (void) printf("%s", title);
1194                         else
1195                                 (void) printf("%-*s  ",
1196                                     cbp->cb_colwidths[cbp->cb_columns[i]],
1197                                     title);
1198                 }
1199         }
1200         (void) printf("\n");
1201 }
1202
1203 /*
1204  * Display a single line of output, according to the settings in the callback
1205  * structure.
1206  */
1207 void
1208 zprop_print_one_property(const char *name, zprop_get_cbdata_t *cbp,
1209     const char *propname, const char *value, zprop_source_t sourcetype,
1210     const char *source, const char *recvd_value)
1211 {
1212         int i;
1213         const char *str = NULL;
1214         char buf[128];
1215
1216         /*
1217          * Ignore those source types that the user has chosen to ignore.
1218          */
1219         if ((sourcetype & cbp->cb_sources) == 0)
1220                 return;
1221
1222         if (cbp->cb_first)
1223                 zprop_print_headers(cbp, cbp->cb_type);
1224
1225         for (i = 0; i < ZFS_GET_NCOLS; i++) {
1226                 switch (cbp->cb_columns[i]) {
1227                 case GET_COL_NAME:
1228                         str = name;
1229                         break;
1230
1231                 case GET_COL_PROPERTY:
1232                         str = propname;
1233                         break;
1234
1235                 case GET_COL_VALUE:
1236                         str = value;
1237                         break;
1238
1239                 case GET_COL_SOURCE:
1240                         switch (sourcetype) {
1241                         case ZPROP_SRC_NONE:
1242                                 str = "-";
1243                                 break;
1244
1245                         case ZPROP_SRC_DEFAULT:
1246                                 str = "default";
1247                                 break;
1248
1249                         case ZPROP_SRC_LOCAL:
1250                                 str = "local";
1251                                 break;
1252
1253                         case ZPROP_SRC_TEMPORARY:
1254                                 str = "temporary";
1255                                 break;
1256
1257                         case ZPROP_SRC_INHERITED:
1258                                 (void) snprintf(buf, sizeof (buf),
1259                                     "inherited from %s", source);
1260                                 str = buf;
1261                                 break;
1262                         case ZPROP_SRC_RECEIVED:
1263                                 str = "received";
1264                                 break;
1265                         }
1266                         break;
1267
1268                 case GET_COL_RECVD:
1269                         str = (recvd_value == NULL ? "-" : recvd_value);
1270                         break;
1271
1272                 default:
1273                         continue;
1274                 }
1275
1276                 if (cbp->cb_columns[i + 1] == GET_COL_NONE)
1277                         (void) printf("%s", str);
1278                 else if (cbp->cb_scripted)
1279                         (void) printf("%s\t", str);
1280                 else
1281                         (void) printf("%-*s  ",
1282                             cbp->cb_colwidths[cbp->cb_columns[i]],
1283                             str);
1284         }
1285
1286         (void) printf("\n");
1287 }
1288
1289 /*
1290  * Given a numeric suffix, convert the value into a number of bits that the
1291  * resulting value must be shifted.
1292  */
1293 static int
1294 str2shift(libzfs_handle_t *hdl, const char *buf)
1295 {
1296         const char *ends = "BKMGTPEZ";
1297         int i;
1298
1299         if (buf[0] == '\0')
1300                 return (0);
1301         for (i = 0; i < strlen(ends); i++) {
1302                 if (toupper(buf[0]) == ends[i])
1303                         break;
1304         }
1305         if (i == strlen(ends)) {
1306                 if (hdl)
1307                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1308                             "invalid numeric suffix '%s'"), buf);
1309                 return (-1);
1310         }
1311
1312         /*
1313          * Allow 'G' = 'GB' = 'GiB', case-insensitively.
1314          * However, 'BB' and 'BiB' are disallowed.
1315          */
1316         if (buf[1] == '\0' ||
1317             (toupper(buf[0]) != 'B' &&
1318              ((toupper(buf[1]) == 'B' && buf[2] == '\0') ||
1319               (toupper(buf[1]) == 'I' && toupper(buf[2]) == 'B' &&
1320                buf[3] == '\0'))))
1321                 return (10*i);
1322
1323         if (hdl)
1324                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1325                     "invalid numeric suffix '%s'"), buf);
1326         return (-1);
1327 }
1328
1329 /*
1330  * Convert a string of the form '100G' into a real number.  Used when setting
1331  * properties or creating a volume.  'buf' is used to place an extended error
1332  * message for the caller to use.
1333  */
1334 int
1335 zfs_nicestrtonum(libzfs_handle_t *hdl, const char *value, uint64_t *num)
1336 {
1337         char *end;
1338         int shift;
1339
1340         *num = 0;
1341
1342         /* Check to see if this looks like a number.  */
1343         if ((value[0] < '0' || value[0] > '9') && value[0] != '.') {
1344                 if (hdl)
1345                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1346                             "bad numeric value '%s'"), value);
1347                 return (-1);
1348         }
1349
1350         /* Rely on strtoull() to process the numeric portion.  */
1351         errno = 0;
1352         *num = strtoull(value, &end, 10);
1353
1354         /*
1355          * Check for ERANGE, which indicates that the value is too large to fit
1356          * in a 64-bit value.
1357          */
1358         if (errno == ERANGE) {
1359                 if (hdl)
1360                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1361                             "numeric value is too large"));
1362                 return (-1);
1363         }
1364
1365         /*
1366          * If we have a decimal value, then do the computation with floating
1367          * point arithmetic.  Otherwise, use standard arithmetic.
1368          */
1369         if (*end == '.') {
1370                 double fval = strtod(value, &end);
1371
1372                 if ((shift = str2shift(hdl, end)) == -1)
1373                         return (-1);
1374
1375                 fval *= pow(2, shift);
1376
1377                 if (fval > UINT64_MAX) {
1378                         if (hdl)
1379                                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1380                                     "numeric value is too large"));
1381                         return (-1);
1382                 }
1383
1384                 *num = (uint64_t)fval;
1385         } else {
1386                 if ((shift = str2shift(hdl, end)) == -1)
1387                         return (-1);
1388
1389                 /* Check for overflow */
1390                 if (shift >= 64 || (*num << shift) >> shift != *num) {
1391                         if (hdl)
1392                                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1393                                     "numeric value is too large"));
1394                         return (-1);
1395                 }
1396
1397                 *num <<= shift;
1398         }
1399
1400         return (0);
1401 }
1402
1403 /*
1404  * Given a propname=value nvpair to set, parse any numeric properties
1405  * (index, boolean, etc) if they are specified as strings and add the
1406  * resulting nvpair to the returned nvlist.
1407  *
1408  * At the DSL layer, all properties are either 64-bit numbers or strings.
1409  * We want the user to be able to ignore this fact and specify properties
1410  * as native values (numbers, for example) or as strings (to simplify
1411  * command line utilities).  This also handles converting index types
1412  * (compression, checksum, etc) from strings to their on-disk index.
1413  */
1414 int
1415 zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop,
1416     zfs_type_t type, nvlist_t *ret, char **svalp, uint64_t *ivalp,
1417     const char *errbuf)
1418 {
1419         data_type_t datatype = nvpair_type(elem);
1420         zprop_type_t proptype;
1421         const char *propname;
1422         char *value;
1423         boolean_t isnone = B_FALSE;
1424
1425         if (type == ZFS_TYPE_POOL) {
1426                 proptype = zpool_prop_get_type(prop);
1427                 propname = zpool_prop_to_name(prop);
1428         } else {
1429                 proptype = zfs_prop_get_type(prop);
1430                 propname = zfs_prop_to_name(prop);
1431         }
1432
1433         /*
1434          * Convert any properties to the internal DSL value types.
1435          */
1436         *svalp = NULL;
1437         *ivalp = 0;
1438
1439         switch (proptype) {
1440         case PROP_TYPE_STRING:
1441                 if (datatype != DATA_TYPE_STRING) {
1442                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1443                             "'%s' must be a string"), nvpair_name(elem));
1444                         goto error;
1445                 }
1446                 (void) nvpair_value_string(elem, svalp);
1447                 if (strlen(*svalp) >= ZFS_MAXPROPLEN) {
1448                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1449                             "'%s' is too long"), nvpair_name(elem));
1450                         goto error;
1451                 }
1452                 break;
1453
1454         case PROP_TYPE_NUMBER:
1455                 if (datatype == DATA_TYPE_STRING) {
1456                         (void) nvpair_value_string(elem, &value);
1457                         if (strcmp(value, "none") == 0) {
1458                                 isnone = B_TRUE;
1459                         } else if (zfs_nicestrtonum(hdl, value, ivalp)
1460                             != 0) {
1461                                 goto error;
1462                         }
1463                 } else if (datatype == DATA_TYPE_UINT64) {
1464                         (void) nvpair_value_uint64(elem, ivalp);
1465                 } else {
1466                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1467                             "'%s' must be a number"), nvpair_name(elem));
1468                         goto error;
1469                 }
1470
1471                 /*
1472                  * Quota special: force 'none' and don't allow 0.
1473                  */
1474                 if ((type & ZFS_TYPE_DATASET) && *ivalp == 0 && !isnone &&
1475                     (prop == ZFS_PROP_QUOTA || prop == ZFS_PROP_REFQUOTA)) {
1476                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1477                             "use 'none' to disable quota/refquota"));
1478                         goto error;
1479                 }
1480                 break;
1481
1482         case PROP_TYPE_INDEX:
1483                 if (datatype != DATA_TYPE_STRING) {
1484                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1485                             "'%s' must be a string"), nvpair_name(elem));
1486                         goto error;
1487                 }
1488
1489                 (void) nvpair_value_string(elem, &value);
1490
1491                 if (zprop_string_to_index(prop, value, ivalp, type) != 0) {
1492                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1493                             "'%s' must be one of '%s'"), propname,
1494                             zprop_values(prop, type));
1495                         goto error;
1496                 }
1497                 break;
1498
1499         default:
1500                 abort();
1501         }
1502
1503         /*
1504          * Add the result to our return set of properties.
1505          */
1506         if (*svalp != NULL) {
1507                 if (nvlist_add_string(ret, propname, *svalp) != 0) {
1508                         (void) no_memory(hdl);
1509                         return (-1);
1510                 }
1511         } else {
1512                 if (nvlist_add_uint64(ret, propname, *ivalp) != 0) {
1513                         (void) no_memory(hdl);
1514                         return (-1);
1515                 }
1516         }
1517
1518         return (0);
1519 error:
1520         (void) zfs_error(hdl, EZFS_BADPROP, errbuf);
1521         return (-1);
1522 }
1523
1524 static int
1525 addlist(libzfs_handle_t *hdl, char *propname, zprop_list_t **listp,
1526     zfs_type_t type)
1527 {
1528         int prop;
1529         zprop_list_t *entry;
1530
1531         prop = zprop_name_to_prop(propname, type);
1532
1533         if (prop != ZPROP_INVAL && !zprop_valid_for_type(prop, type))
1534                 prop = ZPROP_INVAL;
1535
1536         /*
1537          * When no property table entry can be found, return failure if
1538          * this is a pool property or if this isn't a user-defined
1539          * dataset property,
1540          */
1541         if (prop == ZPROP_INVAL && ((type == ZFS_TYPE_POOL &&
1542             !zpool_prop_feature(propname) &&
1543             !zpool_prop_unsupported(propname)) ||
1544             (type == ZFS_TYPE_DATASET && !zfs_prop_user(propname) &&
1545             !zfs_prop_userquota(propname) && !zfs_prop_written(propname)))) {
1546                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1547                     "invalid property '%s'"), propname);
1548                 return (zfs_error(hdl, EZFS_BADPROP,
1549                     dgettext(TEXT_DOMAIN, "bad property list")));
1550         }
1551
1552         if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL)
1553                 return (-1);
1554
1555         entry->pl_prop = prop;
1556         if (prop == ZPROP_INVAL) {
1557                 if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) ==
1558                     NULL) {
1559                         free(entry);
1560                         return (-1);
1561                 }
1562                 entry->pl_width = strlen(propname);
1563         } else {
1564                 entry->pl_width = zprop_width(prop, &entry->pl_fixed,
1565                     type);
1566         }
1567
1568         *listp = entry;
1569
1570         return (0);
1571 }
1572
1573 /*
1574  * Given a comma-separated list of properties, construct a property list
1575  * containing both user-defined and native properties.  This function will
1576  * return a NULL list if 'all' is specified, which can later be expanded
1577  * by zprop_expand_list().
1578  */
1579 int
1580 zprop_get_list(libzfs_handle_t *hdl, char *props, zprop_list_t **listp,
1581     zfs_type_t type)
1582 {
1583         *listp = NULL;
1584
1585         /*
1586          * If 'all' is specified, return a NULL list.
1587          */
1588         if (strcmp(props, "all") == 0)
1589                 return (0);
1590
1591         /*
1592          * If no props were specified, return an error.
1593          */
1594         if (props[0] == '\0') {
1595                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1596                     "no properties specified"));
1597                 return (zfs_error(hdl, EZFS_BADPROP, dgettext(TEXT_DOMAIN,
1598                     "bad property list")));
1599         }
1600
1601         /*
1602          * It would be nice to use getsubopt() here, but the inclusion of column
1603          * aliases makes this more effort than it's worth.
1604          */
1605         while (*props != '\0') {
1606                 size_t len;
1607                 char *p;
1608                 char c;
1609
1610                 if ((p = strchr(props, ',')) == NULL) {
1611                         len = strlen(props);
1612                         p = props + len;
1613                 } else {
1614                         len = p - props;
1615                 }
1616
1617                 /*
1618                  * Check for empty options.
1619                  */
1620                 if (len == 0) {
1621                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1622                             "empty property name"));
1623                         return (zfs_error(hdl, EZFS_BADPROP,
1624                             dgettext(TEXT_DOMAIN, "bad property list")));
1625                 }
1626
1627                 /*
1628                  * Check all regular property names.
1629                  */
1630                 c = props[len];
1631                 props[len] = '\0';
1632
1633                 if (strcmp(props, "space") == 0) {
1634                         static char *spaceprops[] = {
1635                                 "name", "avail", "used", "usedbysnapshots",
1636                                 "usedbydataset", "usedbyrefreservation",
1637                                 "usedbychildren", NULL
1638                         };
1639                         int i;
1640
1641                         for (i = 0; spaceprops[i]; i++) {
1642                                 if (addlist(hdl, spaceprops[i], listp, type))
1643                                         return (-1);
1644                                 listp = &(*listp)->pl_next;
1645                         }
1646                 } else {
1647                         if (addlist(hdl, props, listp, type))
1648                                 return (-1);
1649                         listp = &(*listp)->pl_next;
1650                 }
1651
1652                 props = p;
1653                 if (c == ',')
1654                         props++;
1655         }
1656
1657         return (0);
1658 }
1659
1660 void
1661 zprop_free_list(zprop_list_t *pl)
1662 {
1663         zprop_list_t *next;
1664
1665         while (pl != NULL) {
1666                 next = pl->pl_next;
1667                 free(pl->pl_user_prop);
1668                 free(pl);
1669                 pl = next;
1670         }
1671 }
1672
1673 typedef struct expand_data {
1674         zprop_list_t    **last;
1675         libzfs_handle_t *hdl;
1676         zfs_type_t type;
1677 } expand_data_t;
1678
1679 int
1680 zprop_expand_list_cb(int prop, void *cb)
1681 {
1682         zprop_list_t *entry;
1683         expand_data_t *edp = cb;
1684
1685         if ((entry = zfs_alloc(edp->hdl, sizeof (zprop_list_t))) == NULL)
1686                 return (ZPROP_INVAL);
1687
1688         entry->pl_prop = prop;
1689         entry->pl_width = zprop_width(prop, &entry->pl_fixed, edp->type);
1690         entry->pl_all = B_TRUE;
1691
1692         *(edp->last) = entry;
1693         edp->last = &entry->pl_next;
1694
1695         return (ZPROP_CONT);
1696 }
1697
1698 int
1699 zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, zfs_type_t type)
1700 {
1701         zprop_list_t *entry;
1702         zprop_list_t **last;
1703         expand_data_t exp;
1704
1705         if (*plp == NULL) {
1706                 /*
1707                  * If this is the very first time we've been called for an 'all'
1708                  * specification, expand the list to include all native
1709                  * properties.
1710                  */
1711                 last = plp;
1712
1713                 exp.last = last;
1714                 exp.hdl = hdl;
1715                 exp.type = type;
1716
1717                 if (zprop_iter_common(zprop_expand_list_cb, &exp, B_FALSE,
1718                     B_FALSE, type) == ZPROP_INVAL)
1719                         return (-1);
1720
1721                 /*
1722                  * Add 'name' to the beginning of the list, which is handled
1723                  * specially.
1724                  */
1725                 if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL)
1726                         return (-1);
1727
1728                 entry->pl_prop = (type == ZFS_TYPE_POOL) ?  ZPOOL_PROP_NAME :
1729                     ZFS_PROP_NAME;
1730                 entry->pl_width = zprop_width(entry->pl_prop,
1731                     &entry->pl_fixed, type);
1732                 entry->pl_all = B_TRUE;
1733                 entry->pl_next = *plp;
1734                 *plp = entry;
1735         }
1736         return (0);
1737 }
1738
1739 int
1740 zprop_iter(zprop_func func, void *cb, boolean_t show_all, boolean_t ordered,
1741     zfs_type_t type)
1742 {
1743         return (zprop_iter_common(func, cb, show_all, ordered, type));
1744 }