struct qparam_set * new_qparam_set (int init_alloc, ...) { va_list args; struct qparam_set *ps; const char *pname, *pvalue; if (init_alloc <= 0) init_alloc = 1; if (VIR_ALLOC(ps) < 0) { virReportOOMError(); return NULL; } ps->n = 0; ps->alloc = init_alloc; if (VIR_ALLOC_N(ps->p, ps->alloc) < 0) { VIR_FREE (ps); virReportOOMError(); return NULL; } va_start (args, init_alloc); while ((pname = va_arg (args, char *)) != NULL) { pvalue = va_arg (args, char *); if (append_qparam (ps, pname, pvalue) == -1) { free_qparam_set (ps); ps = NULL; break; } } va_end (args); return ps; }
int xenapiUtil_ParseQuery(virConnectPtr conn, xmlURIPtr uri, int *noVerify) { int result = 0; int i; struct qparam_set *queryParamSet = NULL; struct qparam *queryParam = NULL; #ifdef HAVE_XMLURI_QUERY_RAW queryParamSet = qparam_query_parse(uri->query_raw); #else queryParamSet = qparam_query_parse(uri->query); #endif if (queryParamSet == NULL) { goto failure; } for (i = 0; i < queryParamSet->n; i++) { queryParam = &queryParamSet->p[i]; if (STRCASEEQ(queryParam->name, "no_verify")) { if (noVerify == NULL) { continue; } if (virStrToLong_i(queryParam->value, NULL, 10, noVerify) < 0 || (*noVerify != 0 && *noVerify != 1)) { xenapiSessionErrorHandler(conn, VIR_ERR_INVALID_ARG, _("Query parameter 'no_verify' has unexpected value (should be 0 or 1)")); goto failure; } } } cleanup: if (queryParamSet != NULL) { free_qparam_set(queryParamSet); } return result; failure: result = -1; goto cleanup; }
struct qparam_set * qparam_query_parse (const char *query) { struct qparam_set *ps; const char *end, *eq; ps = new_qparam_set (0, NULL); if (!ps) { virReportOOMError(); return NULL; } if (!query || query[0] == '\0') return ps; while (*query) { char *name = NULL, *value = NULL; /* Find the next separator, or end of the string. */ end = strchr (query, '&'); if (!end) end = strchr (query, ';'); if (!end) end = query + strlen (query); /* Find the first '=' character between here and end. */ eq = strchr (query, '='); if (eq && eq >= end) eq = NULL; /* Empty section (eg. "&&"). */ if (end == query) goto next; /* If there is no '=' character, then we have just "name" * and consistent with CGI.pm we assume value is "". */ else if (!eq) { name = xmlURIUnescapeString (query, end - query, NULL); if (!name) goto out_of_memory; } /* Or if we have "name=" here (works around annoying * problem when calling xmlURIUnescapeString with len = 0). */ else if (eq+1 == end) { name = xmlURIUnescapeString (query, eq - query, NULL); if (!name) goto out_of_memory; } /* If the '=' character is at the beginning then we have * "=value" and consistent with CGI.pm we _ignore_ this. */ else if (query == eq) goto next; /* Otherwise it's "name=value". */ else { name = xmlURIUnescapeString (query, eq - query, NULL); if (!name) goto out_of_memory; value = xmlURIUnescapeString (eq+1, end - (eq+1), NULL); if (!value) { VIR_FREE(name); goto out_of_memory; } } /* Append to the parameter set. */ if (append_qparam (ps, name, value ? value : "") == -1) { VIR_FREE(name); VIR_FREE(value); goto out_of_memory; } VIR_FREE(name); VIR_FREE(value); next: query = end; if (*query) query ++; /* skip '&' separator */ } return ps; out_of_memory: virReportOOMError(); free_qparam_set (ps); return NULL; }