/* * Validate the given pool name, optionally putting an extended error message in * 'buf'. */ static boolean_t zpool_name_valid(libzfs_handle_t *hdl, boolean_t isopen, const char *pool) { namecheck_err_t why; char what; int ret; ret = pool_namecheck(pool, &why, &what); /* * The rules for reserved pool names were extended at a later point. * But we need to support users with existing pools that may now be * invalid. So we only check for this expanded set of names during a * create (or import), and only in userland. */ if (ret == 0 && !isopen && (strncmp(pool, "mirror", 6) == 0 || strncmp(pool, "raidz", 5) == 0 || strncmp(pool, "spare", 5) == 0)) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "name is reserved")); return (B_FALSE); } if (ret != 0) { if (hdl != NULL) { switch (why) { case NAME_ERR_TOOLONG: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "name is too long")); break; case NAME_ERR_INVALCHAR: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid character " "'%c' in pool name"), what); break; case NAME_ERR_NOLETTER: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "name must begin with a letter")); break; case NAME_ERR_RESERVED: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "name is reserved")); break; case NAME_ERR_DISKLIKE: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool name is reserved")); break; } } return (B_FALSE); } return (B_TRUE); }
/** * Check if the zpool name is valid * @param psz_zpool: the zpool name * @param ppsz_error: the error message if any * @return 0 in case of success, 1 in case of error */ static int libzfs_zpool_name_valid(const char *psz_zpool, const char **ppsz_error) { namecheck_err_t why; char c_what; int i_error; if(pool_namecheck(psz_zpool, &why, &c_what)) { switch(why) { case NAME_ERR_TOOLONG: *ppsz_error = "name is too long"; break; case NAME_ERR_INVALCHAR: *ppsz_error = "invalid character in pool name"; break; case NAME_ERR_NOLETTER: *ppsz_error = "name must begin with a letter"; break; case NAME_ERR_RESERVED: *ppsz_error = "name is reserved"; break; case NAME_ERR_DISKLIKE: *ppsz_error = "pool name is reserved"; break; case NAME_ERR_LEADING_SLASH: *ppsz_error = "leading slash in name"; break; case NAME_ERR_EMPTY_COMPONENT: *ppsz_error = "empty component in name"; break; case NAME_ERR_TRAILING_SLASH: *ppsz_error = "trailing slash in name"; break; case NAME_ERR_MULTIPLE_AT: *ppsz_error = "multiple '@' delimiters in name"; break; default: *ppsz_error = "zpool name invalid"; } return 1; } return 0; }