1251881Speter/* 2251881Speter * util_error.c : serf utility routines for wrapping serf status codes 3251881Speter * 4251881Speter * ==================================================================== 5251881Speter * Licensed to the Apache Software Foundation (ASF) under one 6251881Speter * or more contributor license agreements. See the NOTICE file 7251881Speter * distributed with this work for additional information 8251881Speter * regarding copyright ownership. The ASF licenses this file 9251881Speter * to you under the Apache License, Version 2.0 (the 10251881Speter * "License"); you may not use this file except in compliance 11251881Speter * with the License. You may obtain a copy of the License at 12251881Speter * 13251881Speter * http://www.apache.org/licenses/LICENSE-2.0 14251881Speter * 15251881Speter * Unless required by applicable law or agreed to in writing, 16251881Speter * software distributed under the License is distributed on an 17251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18251881Speter * KIND, either express or implied. See the License for the 19251881Speter * specific language governing permissions and limitations 20251881Speter * under the License. 21251881Speter * ==================================================================== 22251881Speter */ 23251881Speter#include <serf.h> 24251881Speter 25251881Speter#include "svn_utf.h" 26251881Speter#include "private/svn_error_private.h" 27251881Speter 28251881Speter#include "ra_serf.h" 29251881Speter 30251881Speter/* 31251881Speter * Undefine the helpers for creating errors. 32251881Speter * 33251881Speter * *NOTE*: Any use of these functions in any other function may need 34251881Speter * to call svn_error__locate() because the macro that would otherwise 35251881Speter * do this is being undefined and the filename and line number will 36251881Speter * not be properly set in the static error_file and error_line 37251881Speter * variables. 38251881Speter */ 39251881Speter#undef svn_error_create 40251881Speter#undef svn_error_createf 41251881Speter#undef svn_error_quick_wrap 42251881Speter#undef svn_error_wrap_apr 43251881Speter#undef svn_ra_serf__wrap_err 44251881Speter 45251881Spetersvn_error_t * 46251881Spetersvn_ra_serf__wrap_err(apr_status_t status, 47251881Speter const char *fmt, 48251881Speter ...) 49251881Speter{ 50251881Speter const char *serf_err_msg = serf_error_string(status); 51251881Speter svn_error_t *err; 52251881Speter va_list ap; 53251881Speter 54251881Speter err = svn_error_create(status, NULL, NULL); 55251881Speter 56251881Speter if (serf_err_msg || fmt) 57251881Speter { 58251881Speter const char *msg; 59251881Speter const char *err_msg; 60251881Speter char errbuf[255]; /* Buffer for APR error message. */ 61251881Speter 62251881Speter if (serf_err_msg) 63251881Speter { 64251881Speter err_msg = serf_err_msg; 65251881Speter } 66251881Speter else 67251881Speter { 68251881Speter svn_error_t *utf8_err; 69251881Speter 70251881Speter /* Grab the APR error message. */ 71251881Speter apr_strerror(status, errbuf, sizeof(errbuf)); 72251881Speter utf8_err = svn_utf_cstring_to_utf8(&err_msg, errbuf, err->pool); 73251881Speter if (utf8_err) 74251881Speter err_msg = NULL; 75251881Speter svn_error_clear(utf8_err); 76251881Speter } 77251881Speter 78251881Speter /* Append it to the formatted message. */ 79251881Speter if (fmt) 80251881Speter { 81251881Speter va_start(ap, fmt); 82251881Speter msg = apr_pvsprintf(err->pool, fmt, ap); 83251881Speter va_end(ap); 84251881Speter } 85251881Speter else 86251881Speter { 87251881Speter msg = "ra_serf"; 88251881Speter } 89251881Speter if (err_msg) 90251881Speter { 91251881Speter err->message = apr_pstrcat(err->pool, msg, ": ", err_msg, NULL); 92251881Speter } 93251881Speter else 94251881Speter { 95251881Speter err->message = msg; 96251881Speter } 97251881Speter } 98251881Speter 99251881Speter return err; 100251881Speter} 101