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