Esempio n. 1
0
/*
 * 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);
}
Esempio n. 2
0
/**
 * 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;
}