17#ifndef GLOBUS_XIO_UTIL_INCLUDE
18#define GLOBUS_XIO_UTIL_INCLUDE
20#include "globus_xio.h"
27globus_xio_get_env_pair(
28 const char * env_name,
33globus_xio_error_is_eof(
37globus_xio_error_is_canceled(
41globus_xio_driver_error_match(
42 globus_xio_driver_t driver,
43 globus_object_t * error,
47globus_xio_driver_error_match_with_cb(
48 globus_xio_driver_t driver,
49 globus_object_t * error,
50 globus_extension_error_match_cb_t callback,
54globus_xio_error_match(
55 globus_result_t result,
59globus_xio_contact_destroy(
60 globus_xio_contact_t * contact_info);
63globus_xio_contact_parse(
64 globus_xio_contact_t * contact_info,
65 const char * contact_string);
68globus_xio_contact_info_to_string(
69 const globus_xio_contact_t * contact_info,
70 char ** contact_string);
73globus_xio_contact_info_to_url(
74 const globus_xio_contact_t * contact_info,
75 char ** contact_string);
78globus_xio_contact_info_to_encoded_string(
79 const globus_xio_contact_t * contact_info,
80 const globus_xio_contact_t * encode_chars,
81 char ** contact_string);
84globus_xio_contact_copy(
85 globus_xio_contact_t * dst,
86 const globus_xio_contact_t * src);
96#define GlobusXIOName(func) static const char * _xio_name __attribute__((__unused__)) = #func
98#define GlobusXIOName(func) static const char * _xio_name = #func
101#define GlobusXIOErrorCanceled() \
102 globus_error_put(GlobusXIOErrorObjCanceled())
104#define GlobusXIOErrorObjCanceled() \
105 globus_error_construct_error( \
108 GLOBUS_XIO_ERROR_CANCELED, \
112 _XIOSL("Operation was canceled"))
113#define GlobusXIOErrorTimeout() \
114 globus_error_put(GlobusXIOErrorObjTimeout())
116#define GlobusXIOErrorObjTimeout() \
117 globus_error_construct_error( \
119 GlobusXIOErrorObjTimeoutOnly(), \
120 GLOBUS_XIO_ERROR_CANCELED, \
124 _XIOSL("Operation was canceled"))
126#define GlobusXIOErrorObjTimeoutOnly() \
127 globus_error_construct_error( \
130 GLOBUS_XIO_ERROR_TIMEOUT, \
134 _XIOSL("Operation timed out"))
136#define GlobusXIOErrorObjEOF() \
137 globus_error_construct_error( \
140 GLOBUS_XIO_ERROR_EOF, \
144 _XIOSL("An end of file occurred"))
146#define GlobusXIOErrorEOF() \
148 GlobusXIOErrorObjEOF()) \
150#define GlobusXIOErrorInvalidCommand(cmd_number) \
152 globus_error_construct_error( \
155 GLOBUS_XIO_ERROR_COMMAND, \
159 _XIOSL("An invalid command (%d) was issued"), \
162#define GlobusXIOErrorContactString(reason) \
164 globus_error_construct_error( \
167 GLOBUS_XIO_ERROR_CONTACT_STRING, \
171 _XIOSL("Contact string invalid. %s"), \
174#define GlobusXIOErrorObjParameter(param_name) \
175 globus_error_construct_error( \
178 GLOBUS_XIO_ERROR_PARAMETER, \
182 _XIOSL("Bad parameter, %s"), \
185#define GlobusXIOErrorParameter(param_name) \
187 GlobusXIOErrorObjParameter(param_name))
189#define GlobusXIOErrorObjMemory(mem_name) \
190 globus_error_construct_error( \
193 GLOBUS_XIO_ERROR_MEMORY, \
197 _XIOSL("Memory allocation failed on %s"), \
200#define GlobusXIOErrorMemory(mem_name_obj) \
202 GlobusXIOErrorObjMemory(mem_name_obj))
204#define GlobusXIOErrorObjSystemError(system_func, _errno) \
205 globus_error_wrap_errno_error( \
208 GLOBUS_XIO_ERROR_SYSTEM_ERROR, \
212 _XIOSL("System error in %s"), \
215#define GlobusXIOErrorSystemError(system_func, _errno) \
217 GlobusXIOErrorObjSystemError(system_func, _errno))
219#define GlobusXIOErrorSystemResource(reason) \
221 globus_error_construct_error( \
224 GLOBUS_XIO_ERROR_SYSTEM_RESOURCE, \
228 _XIOSL("System resource error, %s"), \
231#define GlobusXIOErrorInvalidStack(reason) \
233 globus_error_construct_error( \
236 GLOBUS_XIO_ERROR_STACK, \
240 _XIOSL("Invalid stack, %s"), \
243#define GlobusXIOErrorInvalidDriver(reason) \
245 globus_error_construct_error( \
248 GLOBUS_XIO_ERROR_DRIVER, \
252 _XIOSL("Invalid Driver, %s"), \
255#define GlobusXIOErrorPass() \
257 globus_error_construct_error( \
260 GLOBUS_XIO_ERROR_PASS, \
264 _XIOSL("Operation passed too far")))
266#define GlobusXIOErrorAlreadyRegistered() \
268 globus_error_construct_error( \
271 GLOBUS_XIO_ERROR_ALREADY_REGISTERED, \
275 _XIOSL("Operation already registered")))
277#define GlobusXIOErrorInvalidState(state) \
279 globus_error_construct_error( \
282 GLOBUS_XIO_ERROR_STATE, \
286 _XIOSL("Unexpected state, %d"), \
289#define GlobusXIOErrorWrapFailed(failed_func, result) \
291 globus_error_construct_error( \
293 globus_error_get((result)), \
294 GLOBUS_XIO_ERROR_WRAPPED, \
298 _XIOSL("%s failed."), \
301#define GlobusXIOErrorWrapFailedWithMessage(result, format, arg) \
303 globus_error_construct_error( \
305 globus_error_get((result)), \
306 GLOBUS_XIO_ERROR_WRAPPED, \
313#define GlobusXIOErrorWrapFailedWithMessage2(result, format, arg1, arg2) \
315 globus_error_construct_error( \
317 globus_error_get((result)), \
318 GLOBUS_XIO_ERROR_WRAPPED, \
325#define GlobusXIOErrorNotRegistered() \
327 globus_error_construct_error( \
330 GLOBUS_XIO_ERROR_NOT_REGISTERED, \
334 _XIOSL("Not registered.")))
336#define GlobusXIOErrorNotActivated() \
338 globus_error_construct_error( \
341 GLOBUS_XIO_ERROR_NOT_ACTIVATED, \
345 _XIOSL("Module not activated.")))
347#define GlobusXIOErrorUnloaded() \
349 globus_error_construct_error( \
352 GLOBUS_XIO_ERROR_UNLOADED, \
356 _XIOSL("Driver in handle has been unloaded.")))
358#define GlobusXIOErrorParse(arg) \
360 globus_error_construct_error( \
363 GLOBUS_XIO_ERROR_PARSE, \
367 _XIOSL("An error occurred parsing the string: %s"), arg))
370#define GlobusIXIOUtilCopyNIovec(iov, iovc, siov, siovc, bytes) \
374 globus_size_t _tb = 0; \
375 globus_size_t _bytes; \
376 const struct iovec * _siov; \
377 struct iovec * _iov; \
387 for(_i = 0; _i < _siovc && _tb < _bytes; _i++) \
389 if(_tb + _siov[_i].iov_len > _bytes) \
391 _iov[_i].iov_len = _bytes - _tb; \
395 _iov[_i].iov_len = _siov[_i].iov_len; \
397 _tb += _siov[_i].iov_len; \
398 _iov[_i].iov_base = _siov[_i].iov_base; \
405#define GlobusIXIOUtilTransferIovec(iov, siov, iovc) \
409 const struct iovec * _siov; \
410 struct iovec * _iov; \
417 for(_i = 0; _i < _iovc; _i++) \
419 _iov[_i].iov_base = _siov[_i].iov_base; \
420 _iov[_i].iov_len = _siov[_i].iov_len; \
424#define GlobusIXIOUtilAdjustIovec(iov, iovc, nbytes) \
427 globus_size_t _n = (nbytes); \
431 struct iovec * _iov = (iov); \
432 int _iovc = (iovc); \
437 _i < _iovc && _n >= _iov[_i].iov_len; \
438 _n -= _iov[_i].iov_len, _i++); \
442 _iov[_i].iov_base = (char *) _iov[_i].iov_base + _n; \
443 _iov[_i].iov_len -= _n; \
451#define GlobusIXIOUtilTransferAdjustedIovec( \
452 new_iov, new_iovc, iov, iovc, nbytes) \
456 const struct iovec * _iov; \
458 struct iovec * _new_iov; \
464 _new_iov = (new_iov); \
467 for(_i = 0, _n = (nbytes); \
468 _i < _iovc && _n >= _iov[_i].iov_len; \
469 _n -= _iov[_i].iov_len, _i++); \
471 (new_iovc) = _iovc - _i; \
474 _new_iov[0].iov_base = (char *) _iov[_i].iov_base + _n; \
475 _new_iov[0].iov_len = _iov[_i].iov_len - _n; \
478 for(_j = 1, _i++; _i < _iovc; _j++, _i++) \
480 _new_iov[_j].iov_base = _iov[_i].iov_base; \
481 _new_iov[_j].iov_len = _iov[_i].iov_len; \
486#define GlobusXIOUtilIovTotalLength( \
487 out_len, iov, iovc) \
491 const struct iovec * _iov; \
493 globus_size_t _out_len; \
497 for(_i = 0; _i < _iovc; _i++) \
499 _out_len += _iov[_i].iov_len; \
501 out_len = _out_len; \
504#define GlobusXIOUtilIovSerialize( \
505 out_buf, iov, iovc) \
510 for(_i = 0; _i < iovc; _i++) \
512 memcpy(&(out_buf)[_ndx], (iov)[_i].iov_base, (iov)[_i].iov_len);\
513 _ndx += (iov)[_i].iov_len; \