/* * Copyright 1999-2006 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GLOBUS_XIO_UTIL_INCLUDE #define GLOBUS_XIO_UTIL_INCLUDE #include "globus_xio.h" #ifdef __cplusplus extern "C" { #endif globus_bool_t globus_xio_get_env_pair( const char * env_name, int * min, int * max); globus_bool_t globus_xio_error_is_eof( globus_result_t res); globus_bool_t globus_xio_error_is_canceled( globus_result_t res); globus_bool_t globus_xio_driver_error_match( globus_xio_driver_t driver, globus_object_t * error, int type); globus_bool_t globus_xio_driver_error_match_with_cb( globus_xio_driver_t driver, globus_object_t * error, globus_extension_error_match_cb_t callback, void * type); globus_bool_t globus_xio_error_match( globus_result_t result, int type); void globus_xio_contact_destroy( globus_xio_contact_t * contact_info); globus_result_t globus_xio_contact_parse( globus_xio_contact_t * contact_info, const char * contact_string); globus_result_t globus_xio_contact_info_to_string( const globus_xio_contact_t * contact_info, char ** contact_string); globus_result_t globus_xio_contact_info_to_url( const globus_xio_contact_t * contact_info, char ** contact_string); globus_result_t globus_xio_contact_info_to_encoded_string( const globus_xio_contact_t * contact_info, const globus_xio_contact_t * encode_chars, char ** contact_string); globus_result_t globus_xio_contact_copy( globus_xio_contact_t * dst, const globus_xio_contact_t * src); /* * Utility macros */ /* all macros in this file require each function to 'declare' their name with * this */ #ifdef __GNUC__ #define GlobusXIOName(func) static const char * _xio_name __attribute__((__unused__)) = #func #else #define GlobusXIOName(func) static const char * _xio_name = #func #endif #define GlobusXIOErrorCanceled() \ globus_error_put(GlobusXIOErrorObjCanceled()) #define GlobusXIOErrorObjCanceled() \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_CANCELED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Operation was canceled")) #define GlobusXIOErrorTimeout() \ globus_error_put(GlobusXIOErrorObjTimeout()) #define GlobusXIOErrorObjTimeout() \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GlobusXIOErrorObjTimeoutOnly(), \ GLOBUS_XIO_ERROR_CANCELED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Operation was canceled")) #define GlobusXIOErrorObjTimeoutOnly() \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_TIMEOUT, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Operation timed out")) #define GlobusXIOErrorObjEOF() \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_EOF, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("An end of file occurred")) #define GlobusXIOErrorEOF() \ globus_error_put( \ GlobusXIOErrorObjEOF()) \ #define GlobusXIOErrorInvalidCommand(cmd_number) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_COMMAND, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("An invalid command (%d) was issued"), \ (cmd_number))) #define GlobusXIOErrorContactString(reason) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_CONTACT_STRING, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Contact string invalid. %s"), \ (reason))) #define GlobusXIOErrorObjParameter(param_name) \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_PARAMETER, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Bad parameter, %s"), \ (param_name)) #define GlobusXIOErrorParameter(param_name) \ globus_error_put( \ GlobusXIOErrorObjParameter(param_name)) #define GlobusXIOErrorObjMemory(mem_name) \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_MEMORY, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Memory allocation failed on %s"), \ (mem_name)) #define GlobusXIOErrorMemory(mem_name_obj) \ globus_error_put( \ GlobusXIOErrorObjMemory(mem_name_obj)) #define GlobusXIOErrorObjSystemError(system_func, _errno) \ globus_error_wrap_errno_error( \ GLOBUS_XIO_MODULE, \ (_errno), \ GLOBUS_XIO_ERROR_SYSTEM_ERROR, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("System error in %s"), \ (system_func)) #define GlobusXIOErrorSystemError(system_func, _errno) \ globus_error_put( \ GlobusXIOErrorObjSystemError(system_func, _errno)) #define GlobusXIOErrorSystemResource(reason) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_SYSTEM_RESOURCE, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("System resource error, %s"), \ (reason))) #define GlobusXIOErrorInvalidStack(reason) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_STACK, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Invalid stack, %s"), \ (reason))) #define GlobusXIOErrorInvalidDriver(reason) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_DRIVER, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Invalid Driver, %s"), \ (reason))) #define GlobusXIOErrorPass() \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_PASS, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Operation passed too far"))) #define GlobusXIOErrorAlreadyRegistered() \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_ALREADY_REGISTERED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Operation already registered"))) #define GlobusXIOErrorInvalidState(state) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ GLOBUS_NULL, \ GLOBUS_XIO_ERROR_STATE, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Unexpected state, %d"), \ (state))) #define GlobusXIOErrorWrapFailed(failed_func, result) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ globus_error_get((result)), \ GLOBUS_XIO_ERROR_WRAPPED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("%s failed."), \ (failed_func))) #define GlobusXIOErrorWrapFailedWithMessage(result, format, arg) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ globus_error_get((result)), \ GLOBUS_XIO_ERROR_WRAPPED, \ __FILE__, \ _xio_name, \ __LINE__, \ (format), \ (arg))) #define GlobusXIOErrorWrapFailedWithMessage2(result, format, arg1, arg2) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ globus_error_get((result)), \ GLOBUS_XIO_ERROR_WRAPPED, \ __FILE__, \ _xio_name, \ __LINE__, \ (format), \ (arg1), (arg2))) #define GlobusXIOErrorNotRegistered() \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ NULL, \ GLOBUS_XIO_ERROR_NOT_REGISTERED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Not registered."))) #define GlobusXIOErrorNotActivated() \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ NULL, \ GLOBUS_XIO_ERROR_NOT_ACTIVATED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Module not activated."))) #define GlobusXIOErrorUnloaded() \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ NULL, \ GLOBUS_XIO_ERROR_UNLOADED, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("Driver in handle has been unloaded."))) #define GlobusXIOErrorParse(arg) \ globus_error_put( \ globus_error_construct_error( \ GLOBUS_XIO_MODULE, \ NULL, \ GLOBUS_XIO_ERROR_PARSE, \ __FILE__, \ _xio_name, \ __LINE__, \ _XIOSL("An error occurred parsing the string: %s"), arg)) #define GlobusIXIOUtilCopyNIovec(iov, iovc, siov, siovc, bytes) \ do \ { \ globus_size_t _i; \ globus_size_t _tb = 0; \ globus_size_t _bytes; \ const struct iovec * _siov; \ struct iovec * _iov; \ int _iovc; \ int _siovc; \ \ _siov = (siov); \ _siovc = (siovc); \ _iov = (iov); \ _iovc = (iovc); \ _bytes = (bytes); \ \ for(_i = 0; _i < _siovc && _tb < _bytes; _i++) \ { \ if(_tb + _siov[_i].iov_len > _bytes) \ { \ _iov[_i].iov_len = _bytes - _tb; \ } \ else \ { \ _iov[_i].iov_len = _siov[_i].iov_len; \ } \ _tb += _siov[_i].iov_len; \ _iov[_i].iov_base = _siov[_i].iov_base; \ } \ _iovc = _i; \ } while(0) #define GlobusIXIOUtilTransferIovec(iov, siov, iovc) \ do \ { \ int _i; \ const struct iovec * _siov; \ struct iovec * _iov; \ int _iovc; \ \ _siov = (siov); \ _iov = (iov); \ _iovc = (iovc); \ \ for(_i = 0; _i < _iovc; _i++) \ { \ _iov[_i].iov_base = _siov[_i].iov_base; \ _iov[_i].iov_len = _siov[_i].iov_len; \ } \ } while(0) #define GlobusIXIOUtilAdjustIovec(iov, iovc, nbytes) \ do \ { \ globus_size_t _n = (nbytes); \ \ if(_n > 0) \ { \ struct iovec * _iov = (iov); \ int _iovc = (iovc); \ int _i; \ \ /* skip all completely filled iovecs */ \ for(_i = 0; \ _i < _iovc && _n >= _iov[_i].iov_len; \ _n -= _iov[_i].iov_len, _i++); \ \ if(_i < _iovc) \ { \ _iov[_i].iov_base = (char *) _iov[_i].iov_base + _n; \ _iov[_i].iov_len -= _n; \ (iov) += _i; \ } \ \ (iovc) -= _i; \ } \ } while(0) #define GlobusIXIOUtilTransferAdjustedIovec( \ new_iov, new_iovc, iov, iovc, nbytes) \ do \ { \ globus_size_t _n; \ const struct iovec * _iov; \ int _iovc; \ struct iovec * _new_iov; \ int _i; \ int _j; \ \ _iov = (iov); \ _iovc = (iovc); \ _new_iov = (new_iov); \ \ /* skip all completely filled iovecs */ \ for(_i = 0, _n = (nbytes); \ _i < _iovc && _n >= _iov[_i].iov_len; \ _n -= _iov[_i].iov_len, _i++); \ \ (new_iovc) = _iovc - _i; \ if(_i < _iovc) \ { \ _new_iov[0].iov_base = (char *) _iov[_i].iov_base + _n; \ _new_iov[0].iov_len = _iov[_i].iov_len - _n; \ \ /* copy remaining */ \ for(_j = 1, _i++; _i < _iovc; _j++, _i++) \ { \ _new_iov[_j].iov_base = _iov[_i].iov_base; \ _new_iov[_j].iov_len = _iov[_i].iov_len; \ } \ } \ } while(0) #define GlobusXIOUtilIovTotalLength( \ out_len, iov, iovc) \ do \ { \ int _i; \ const struct iovec * _iov; \ int _iovc; \ globus_size_t _out_len; \ _iov = (iov); \ _iovc = (iovc); \ _out_len = 0; \ for(_i = 0; _i < _iovc; _i++) \ { \ _out_len += _iov[_i].iov_len; \ } \ out_len = _out_len; \ } while(0) #define GlobusXIOUtilIovSerialize( \ out_buf, iov, iovc) \ do \ { \ int _i; \ int _ndx = 0; \ for(_i = 0; _i < iovc; _i++) \ { \ memcpy(&(out_buf)[_ndx], (iov)[_i].iov_base, (iov)[_i].iov_len);\ _ndx += (iov)[_i].iov_len; \ } \ } while(0) #ifdef __cplusplus } #endif #endif